Loop-Gerät in einem Linux-Container?

14

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

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

/dev/loop0 in der Tat existiert nicht, und

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

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

Johannes Ernst
quelle

Antworten:

17

Wenn Sie systemd-nspawn verwenden, starten Sie Ihren Container mit der --capability=CAP_MKNODBefehlszeilenoption. Auf diese Weise können Sie Geräteknoten in Ihrem Container erstellen. Dann erstelle ein Loop-Gerät wie folgt:

# mknod /dev/loop0 b 7 0

Denken Sie daran, dass dieses Loop-Gerät für den Host freigegeben ist und /dev/loop0dort auch aufgerufen wird . 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.

Troels Folke
quelle
Kann jemand bestätigen, dass das --capability=CAP_MKNODnoch funktioniert? Für mich scheint es keine Wirkung zu haben, ich bekomme es Operation not permittedauch mit, und so machen es dieser Benutzer und dieser Benutzer .
nh2
2
Ich habe es jetzt zum Laufen gebracht, aber zusätzlich zum Geben musste --capability=CAP_MKNODich DeviceAllow=block-loop rwmdie systemd-nspawn-Einheit einstellen , damit es funktioniert (habe diese Idee von hier ).
nh2
Ich musste hinzufügen --device-cgroup-rule="b 7:* rmw", docker runum vollen Zugriff auf Loopback-Geräte zu ermöglichen (aber keine anderen, da es keine gibt --privilege). Gefunden über docs.docker.com/edge/engine/reference/commandline/create/… und getestet auf Docker 18.06.1-ce (das Dokument soll nur für Docker Edge gelten)
RobM
9

Loop-Geräte werden von einem Kernel-Modul 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 ...

Allerdings bekomme ich diesen Fehler:

root@5c033d5f8625:/# 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

Weitere Informationen finden Sie unter diesem Link .


Ein Hinweis zur systemd-nspawn-Manpage:

systemd-nspawn beschränkt den Zugriff auf verschiedene Kernel-Interfaces 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 dürfen nicht angelegt werden. Das Hostsystem kann nicht neu gestartet werden, und Kernelmodule können möglicherweise nicht aus dem Container geladen werden.

Matt
quelle