Richtige Handhabung von LXC-Containern auf btrfs

11

Nehmen wir an, wir haben einen Server mit lxc installiert und einen lxc-Container, der als Basis-Img verwendet wird /var/lib/lxc/ubuntu_base. Vergessen wir der Einfachheit halber die Konfigurationsänderungen nach dem Kopieren der Basis-IMG.

Einige Leute schlagen vor, Subvolumes und Snapshots für die Erstellung neuer Container zu verwenden, aber man könnte leicht cp - reflink mit ähnlichen Ergebnissen durchführen.

Was ist der richtige Weg (oder welcher ist besser), um mehrere Container zu verwalten?

  • Schnappschüsse

Dieser Weg scheint am besten zu sein, aber Befehle wie lxc-destroy funktionieren nicht, da das Verzeichnis nicht gelöscht werden kann.

btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • cp mit reflink

Ich bin nicht sicher, ob es einen Leistungsunterschied zwischen diesem oder Schnappschüssen gibt

cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • oder Gibt es einen anderen besseren Weg, dies zu tun, den ich nicht kenne?

bearbeiten:

Eine Sache, die ich mit der Reflink-Option gesehen habe, ist, dass Sie den Basiscontainer nicht löschen können, wenn andere ausgeführt werden, da die /procund /devgemountet und nie geändert werden, da die Referenz immer dieselbe ist. Aber das Abschalten aller kupfernen Container scheint zu helfen.

zidarsk8
quelle
Ich habe die btrfs-Snapshot-Funktion verwendet, um neue Container zu erstellen - und sie funktioniert gut (ziemlich schnelle Bereitstellung usw.). Btrfs verfügt jedoch über einen Seiten-Cache pro Subvolume. Obwohl die Verwendung von Snapshots schnell und platzsparend ist, haben Sie wahrscheinlich mehrere Kopien derselben Binärdatei im Speicher.
David Goodwin

Antworten:

2

Ich bin auf Ubuntu LTS 14 und habe gerade (zum ersten Mal sogar) Folgendes ausgeführt und es hat wie ein Zauber funktioniert:

lxc-stop -n ubuntu_base
lxc-clone -o ubuntu_base -n ubuntu_base_c1 -s
lxc-start -n ubuntu_base_c1 -d # make changes if needed
lxc-stop -n ubuntu_base_c1
lxc-snapshot -n ubuntu_base_c1

Wenn Sie -s mit lxc-clone verwenden, wird ein Snapshot erstellt, wenn der Sicherungsspeicher btrfs ist (in Ihrem Fall).

Überprüfen Sie neue Klone / Snapshots mit

lxc-ls -f
btrfs subvolume list /var/lib/lxc

Ich hoffe, das hilft!

Dapithor
quelle
1
Beachten Sie, dass Sie heutzutage btrfs als Hintergrundspeicher angeben müssen, wenn Sie lxc-create ausführen oder lxc-clone Ihnen stattdessen ein Overlayfs gibt .
Lester Cheung
Um nur einen neuen "leichten" Container zu erstellen, scheinen die beiden ersten Zeilen dank der -sOption ausreichend zu sein (lxc-stop und lxc-clone) , und die drei letzten (lxc_start, lxc_stop, lxc_snapshot) sind nur eine Hilfsprozess zur Verwaltung zukünftiger Containerentwicklungen. Ist es richtig ?
Lalebarde
3

Wenn Sie btrfs-Subvolumes für lxc verwenden, müssen Sie die Option user_subvol_rm_allowedin Ihrem hinzufügen /etc/fstab. Beispiel aus einer fstab-Datei extrahiert:

UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0

Mit dieser Option können Sie Subvol entfernen, ohne root zu sein, sondern nur normale Benutzer. Diese Funktion wird von lxc verwendet, wenn die Snapshots in btrfs-Subvolumes gespeichert werden

Yonsy Solis
quelle
3

Schätze, es hängt davon ab, wie groß dein Basisbild ist. Ich würde wahrscheinlich einen neuen Container erstellen und Salt / Puppet usw. verwenden, um meine Container bereitzustellen, und nur lxc-clone für relativ größere Container (z. B. Entwicklungscontainer mit vielen installierten und konfigurierten Tools).

Beachten Sie, dass lxc-clone denselben Sicherungsspeicher wie die Quelle verwendet. Um Subvolume zu verwenden, müssen Sie Ihre Container mit "-B btrfs" erstellen. Beispielsweise:

lxc-create -B btrfs -n mycontainer -t ubuntu

Dann klonen Sie es mit:

lxc-clone -s mycontainer mynewcontainer

--zfsrootWenn Sie zfs zum Speichern Ihrer Container verwenden, gibt es eine zusätzliche Option zum Erstellen von lxc, sodass Sie einen anderen zpool als den Standard-Tank auswählen können. Beispielsweise:

lxc-create -B zfs --zfsroot=data/lxc

Teile und genieße!

Lester Cheung
quelle
Ich bin mit BTRFS auf Debian Wheezy. Es scheint, dass die Option -B btrfsstandardmäßig verwendet wird - ich gehe davon aus, dass mein Debian mit BTRFS eingerichtet ist. Eigentlich habe ich meinen ersten Container (ein 32-Bit-Debian-Keuchen) ohne diese Option erstellt, und ein Subvolume wurde dafür erstellt.
Lalebarde
@lalebarde das ist wohl -B bestin aktion aber gut zu wissen!
Lester Cheung