Ein Storage Pool ist in Incus ein Treiber und eine Quelle. Treiber gibt es mehrere: zfs, btrfs, lvm, ceph, dir. dir ist der langweiligste davon, ein Verzeichnis. Und ein Verzeichnis darf auch ein tmpfs-Mount sein.
mount -t tmpfs -o size=32g none /mnt/tmpfs
incus storage create tmpfs dir source=/mnt/tmpfs
Ab hier landet jede Instanz, die auf diesem Pool startet, im Arbeitsspeicher.
Erstellen
incus launch images:debian/trixie runner --storage tmpfs
Sichern
incus publish macht aus der Instanz ein Image. Läuft sie noch, verlangt Incus --force. Die Aliasse rotieren die Generationen:
incus publish runner --alias runner-current --compression none --force
incus image delete runner-old || true
incus image alias rename runner runner-old || true
incus image alias rename runner-current runner
runner ist danach der letzte saubere Stand, runner-old der davor.
Auf dir gibt es keine echten Snapshots. publish rsyncet das rootfs im laufenden Betrieb in einen Snapshot auf demselben Pool und veröffentlicht diesen. Der Snapshot landet also auf demselben tmpfs wie die Instanz: ein Backup im laufenden Betrieb braucht für die Dauer des Publish etwa das Doppelte der Containergröße an RAM. Der Pool muss entsprechend dimensioniert sein.
Wer den Platz nicht hat, stoppt vorher selbst:
incus stop runner
incus publish runner --alias runner-current --compression none
incus start runner
Wiederherstellen
Instanz weg, Image da — ein Befehl:
incus launch runner runner --storage tmpfs
Auf den Stand davor:
incus launch runner-old runner --storage tmpfs
Löschen
incus delete --force runner
Am Stück
❯ incus launch docker.io:library/alpine:edge runner -s tmpfs
Launching runner
~
❯ incus publish runner --alias runner
Error: The instance is currently running. Use --force to have it stopped and restarted
~
❯ incus publish runner --alias runner --force
Instance published with fingerprint: e5337dc9f3751419f4720f64397e528801d53e57cb0ab5fd5769f84d6c8a6183
~
❯ incus rm -f runner
~
❯ incus launch runner runner
Launching runner
~
❯ incus console --show-log runner
/ #
Nur die Datenbank, wenn man will
Man muss nicht die ganze Instanz auf tmpfs stellen. Ein Volume auf dem Pool lässt sich als Device an eine einzelne Instanz hängen:
incus storage volume create tmpfs runner-db
incus config device add runner incusdb disk \
pool=tmpfs source=runner-db path=/var/lib/incus/database
Das rootfs bleibt, wo es war, nur dqlite landet im RAM — der wahrscheinlich eigentliche Engpass eines Incus-Daemons.
In der Praxis
So sichere ich den Runner für die CI von incus-compose. Aus 23 Minuten CI wurden 8.
Von René Jochum - LLM Assistiert. Lizenz: CC-BY-4.0.
