it-swarm.com.de

Loop-Gerät in einem Linux-Container?

Ich versuche, ein Loop-Gerät in einem Container zu verwenden, um eine Image-Datei bereitzustellen:

> Sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory

/dev/loop0 existiert tatsächlich nicht und

> Sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted

Wie kann ich das zum Laufen bringen? Benötigt der Container eine cgroup-Berechtigung, die er möglicherweise nicht hat?

15
Johannes Ernst

Wenn Sie systemd-nspawn verwenden, starten Sie Ihren Container mit dem Befehlszeilenschalter --capability=CAP_MKNOD. Auf diese Weise können Sie Geräteknoten in Ihrem Container erstellen. Erstellen Sie dann ein Loop-Gerät wie folgt:

# mknod /dev/loop0 b 7 0

Denken Sie daran, dass dieses Schleifengerät für den Host freigegeben ist und dort auch /dev/loop0 Heißt. Und dass es jetzt möglich ist, auf Host-Geräte zuzugreifen, wenn Sie die Haupt- und Nebennummern kennen. Es könnte auch andere Konsequenzen geben, über die ich nicht nachgedacht habe. Sei gewarnt.

18
Troels Folke

Loop-Geräte werden von einem Kernelmodul bereitgestellt. Daher benötigen Sie spezielle Berechtigungen, um darauf zugreifen zu können. Sie müssen sie auch in Ihrem Container verfügbar machen oder die Gerätedateien manuell erstellen.

Die schnelle Antwort

docker run --privileged=true ...

Eine Alternative

Sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...

Das funktioniert fast

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...

Ich erhalte jedoch diesen Fehler:

[email protected]:/# Sudo mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only

Siehe diesen Link für mehr Informationen .


Ein Hinweis auf der Manpage systemd-nspawn:

systemd-nspawn beschränkt den Zugriff auf verschiedene Kernel-Schnittstellen im Container auf schreibgeschützt, z. B./sys,/proc/sys oder/sys/fs/selinux. Netzwerkschnittstellen und die Systemuhr dürfen nicht innerhalb des Containers geändert werden. Geräteknoten werden möglicherweise nicht erstellt. Das Host-System kann nicht neu gestartet werden und Kernelmodule können möglicherweise nicht aus dem Container geladen werden.

11
Matt