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 — sie wird kurz gestoppt und danach automatisch neu gestartet. Die Aliasse rotieren die Generationen:

incus publish runner --alias runner-current --compression none --reuse --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 kopiert das rootfs per rsync, bevor daraus das Image wird. Auf tmpfs heißt das: für die Dauer des Publish braucht der Container etwa das Doppelte seiner Größe an RAM.

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.