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?
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.
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.