dispositivo loop in un contenitore Linux?


14

Sto tentando di utilizzare un dispositivo loop all'interno di un contenitore, per montare alcuni file di immagine:

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

/dev/loop0 anzi non esiste, e

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

Come posso farlo funzionare? Il contenitore necessita di alcune autorizzazioni cgroup che potrebbe non avere?

Risposte:


17

Se si utilizza systemd-nspawn, avviare il contenitore con l' --capability=CAP_MKNODopzione della riga di comando. Ciò ti consentirà di creare nodi di dispositivo all'interno del tuo contenitore. Quindi creare un dispositivo loop come questo:

# mknod /dev/loop0 b 7 0

Ricorda che questo dispositivo loop è condiviso con l'host e viene chiamato anche /dev/loop0lì. E che ora è possibile accedere ai dispositivi host se si conoscono i numeri maggiori e minori. Potrebbero esserci anche altre conseguenze a cui non ho pensato. Essere avvisati


Qualcuno può confermare che --capability=CAP_MKNODfunziona ancora? Per me sembra non avere alcun effetto, ci riesco Operation not permittedanche, e così fanno questo utente e questo utente .
nh2

2
L'ho fatto funzionare ora, ma oltre a dare --capability=CAP_MKNODho dovuto impostare DeviceAllow=block-loop rwml'unità systemd-nspawn per farlo funzionare (ho avuto l'idea da qui ).
nh2,

Ho dovuto aggiungere --device-cgroup-rule="b 7:* rmw"a docker runper consentire l'accesso completo ai dispositivi di loopback (ma nessun altro, poiché non esiste --privilege). Trovato tramite docs.docker.com/edge/engine/reference/commandline/create/… e testato sulla docker 18.06.1-ce (il documento afferma di essere applicabile solo a Docker Edge)
RobM,

9

I dispositivi loop sono forniti da un modulo kernel. Pertanto, sono necessari privilegi speciali per accedervi. È inoltre necessario che siano esposti nel contenitore oppure è necessario creare manualmente i file del dispositivo.

La risposta rapida

docker run --privileged=true ...

Un'alternativa

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

Questo funziona quasi

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

Tuttavia ottengo questo errore:

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

Vedi questo link per maggiori informazioni .


Una nota sulla pagina man di systemd-nspawn:

systemd-nspawn limita l'accesso a varie interfacce del kernel nel contenitore in sola lettura, come / sys, / proc / sys o / sys / fs / selinux. Le interfacce di rete e l'orologio di sistema non possono essere modificati all'interno del contenitore. I nodi del dispositivo non possono essere creati. Non è possibile riavviare il sistema host e non è possibile caricare i moduli del kernel dall'interno del contenitore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.