dispositivo de loopback em um contêiner do Linux?

12

Estou tentando usar um dispositivo de loopback dentro de um contêiner para montar algum arquivo de imagem:

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

/dev/loop0 de fato não existe e

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

Como posso fazer isso funcionar? O container precisa de alguma permissão do cgroup que talvez não tenha?

    
por Johannes Ernst 24.06.2015 / 19:23

2 respostas

14

Se você estiver usando systemd-nspawn, inicie seu contêiner com a opção de linha de comando --capability=CAP_MKNOD . Isso permitirá que você crie nós de dispositivo dentro do seu contêiner. Em seguida, crie um dispositivo de loop como este:

# mknod /dev/loop0 b 7 0

Lembre-se de que esse dispositivo de loop é compartilhado com o host e também é chamado de /dev/loop0 . E agora é possível acessar dispositivos host se você souber os números principais e secundários. Também poderia haver outras consequências que eu não tenha pensado. Esteja avisado.

    
por 06.09.2015 / 22:21
8

Os dispositivos de loop são fornecidos por um módulo do kernel. Portanto, você precisa de privilégios especiais para acessá-los. Você também precisa que eles sejam expostos em seu contêiner ou você precisa criar manualmente os arquivos do dispositivo.

A resposta rápida

docker run --privileged=true ...

Uma alternativa

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

Isso quase funciona

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

No entanto, recebo este erro:

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

Veja este link para mais informações .

Uma nota na página do manual systemd-nspawn:

systemd-nspawn limits access to various kernel interfaces in the container to read-only, such as /sys, /proc/sys or /sys/fs/selinux. Network interfaces and the system clock may not be changed from within the container. Device nodes may not be created. The host system cannot be rebooted and kernel modules may not be loaded from within the container.

    
por 24.06.2015 / 22:17