Ich habe ein manuelles Verfahren entworfen, das dies erreichen kann.
Voraussetzungen
Diese Verfahren treffen die folgenden Annahmen:
- Deine Schale ist
/bin/bash
. - Du bist wurzel
- Sie haben das Betriebssystem im ZFS-Pool bereitgestellt
rpool
und möchten, dass sich der LXD-Container im selben ZFS-Pool (rpool
) befindet. - Ihre Host-Rootfs werden im
rpool/ROOT/os
ZFS-Dataset installiert . - Sie haben eine Momentaufnahme Ihrer Host-Rootfs gemacht und diese aufgerufen
rpool/ROOT/os@20180516T091126CDT
. - Sie führen das Snappy- Paket von LXD aus.
- Sie haben einen
lxc storage
Namenrpool
, der denzfs
Treiber in der Quelle verwendetrpool/lxd
. - Sie möchten einen nicht privilegierten Container namens erstellen
demo
.
Sie müssen das Verfahren für jede Abweichung von den obigen Anforderungen anpassen.
Anleitung
Erstellen Sie einen LXC-Container mit einem Image, das Ihrem Host-Betriebssystem ähnlich ist:
root@node51 [~]# lxc launch images:ubuntu/18.04 demo -s rpool Creating demo Starting demo
Stoppen Sie den Container:
root@node51 [~]# lxc stop demo
Mounten Sie das LXC-Speichervolume, um einige Metadaten von ihm abzurufen:
root@node51 [~]# zfs mount rpool/lxd/containers/demo
Kopieren Sie die Metadaten irgendwo (wie
/tmp/demo/
):root@node51 [~]# rsync -avHXShPs --exclude rootfs/ /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/ /tmp/demo/ sending incremental file list created directory /tmp/demo ./ backup.yaml 2.05K 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6) metadata.yaml 529 100% 516.60kB/s 0:00:00 (xfr#2, to-chk=3/6) templates/ templates/hostname.tpl 21 100% 20.51kB/s 0:00:00 (xfr#3, to-chk=1/6) templates/hosts.tpl 140 100% 136.72kB/s 0:00:00 (xfr#4, to-chk=0/6) sent 3.12K bytes received 135 bytes 6.50K bytes/sec total size is 2.74K speedup is 0.84
Löschen Sie das von LXC erstellte ZFS-Dataset:
root@node51 [~]# zfs destroy rpool/lxd/containers/demo
Klonen Sie das ZFS-Dataset unter demselben Namen, den LXC erwarten würde:
root@node51 [~]# zfs clone rpool/ROOT/os@20180516T091126CDT rpool/lxd/containers/demo
Setzen Sie den Mountpoint auf den ursprünglichen Mountpoint:
root@node51 [~]# zfs set mountpoint=/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo rpool/lxd/containers/demo
Erstellen Sie ein rootfs-Verzeichnis für die neuen Containerdaten:
root@node51 [~]# mkdir -v /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/ mkdir: created directory '/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/'
Erweitern Sie die Globbing-Funktionalität Ihrer Shell, um sicherzustellen, dass die kommende
mv
Datei alle Dateisystemdaten übernimmt:root@node51 [~]# shopt -s extglob ; shopt -s dotglob
Kürzen Sie die kommenden Befehle ein wenig, indem
cd
Sie in das Dataset des Containers gehen:root@node51 [~]# cd /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/ root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]#
Verschieben Sie alle Daten des Containers in den
rootfs/
Ordner:root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv !(rootfs) rootfs/
Erstellen Sie einige Ordner, die zum Starten des Containers benötigt werden:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mkdir rootfs/
Verschieben Sie die zuvor gesicherten Metadaten in das Dataset des Containers:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv /tmp/demo/* .
Entfernen Sie das leere temporäre Verzeichnis aus der Metadatensicherung:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# rm -rfv /tmp/demo removed directory '/tmp/demo'
Kehren Sie zu Ihrem vorherigen Verzeichnis zurück, damit Sie die Dataset des Containers aushängen können:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# cd - /root
Hängen Sie das Dataset des Containers ab, damit LXC es übernehmen kann:
root@node51 [~]# zfs umount rpool/lxd/containers/demo
Um LXC anzuweisen, die Dateien des Containers beim nächsten Start in unprivilegierte Dateien zu konvertieren, führen Sie Folgendes aus
lxc config edit demo
und ändern Sie die Zeile, die liest
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
zu
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1,"Nsid":0,"Maprange":1000000000}]'
Starten Sie den Container.
Dies dauert eine Weile, da jede Datei in den rootfs des Containers in nicht privilegierte Dateien umgewandelt wird. Es gibt keine Fortschrittsanzeige.root@node51 [~]# lxc start demo
Geben Sie den Container ein:
root@node51 [~]# lxc exec demo -- bash
Hier können Sie das Netzwerk, die Startsequenz Ihres Systems und / oder andere Dinge konfigurieren, die Sie benötigen, um diesen LXC-Container-Klon Ihres Hosts zum Laufen zu bringen.