web-dev-qa-db-fra.com

périphérique en boucle dans un conteneur Linux?

J'essaie d'utiliser un périphérique de boucle à l'intérieur d'un conteneur, pour monter un fichier image:

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

/dev/loop0 en effet n'existe pas, et

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

Comment puis-je faire fonctionner cela? Le conteneur a-t-il besoin d'une autorisation de groupe de contrôle qu'il pourrait ne pas avoir?

15
Johannes Ernst

Si vous utilisez systemd-nspawn, démarrez votre conteneur avec le --capability=CAP_MKNOD commutateur de ligne de commande. Cela vous permettra de créer des nœuds de périphérique à l'intérieur de votre conteneur. Créez ensuite un périphérique de boucle comme celui-ci:

# mknod /dev/loop0 b 7 0

N'oubliez pas que ce périphérique de boucle est partagé avec l'hôte et s'appelle /dev/loop0 là aussi. Et qu'il est désormais possible d'accéder aux appareils Host si vous connaissez les nombres majeurs et mineurs. Il pourrait également y avoir d'autres conséquences auxquelles je n'ai pas pensé. Être averti.

18
Troels Folke

Les périphériques en boucle sont fournis par un module du noyau. Par conséquent, vous avez besoin de privilèges spéciaux pour y accéder. Vous avez également besoin qu'ils soient exposés dans votre conteneur, ou vous devez créer manuellement les fichiers de périphérique.

La réponse rapide

docker run --privileged=true ...

Une alternative

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

Cela fonctionne presque

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

Cependant, j'obtiens cette erreur:

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

Voir ce lien pour plus information .


Remarque sur la page de manuel de systemd-nspawn:

systemd-nspawn limite l'accès aux différentes interfaces du noyau dans le conteneur en lecture seule, comme/sys,/proc/sys ou/sys/fs/selinux. Les interfaces réseau et l'horloge système ne peuvent pas être modifiées à partir du conteneur. Les nœuds de périphérique ne peuvent pas être créés. Le système hôte ne peut pas être redémarré et les modules du noyau peuvent ne pas être chargés à partir du conteneur.

11
Matt