我正在尝试使用容器内的循环设备来挂载一些图像文件:
> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory
/dev/loop0
确实不存在,并且
> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted
我该如何实现这一点?容器是否需要一些它可能没有的 cgroup 权限?
答案1
如果您使用的是 systemd-nspawn,请使用命令行开关启动容器--capability=CAP_MKNOD
。这将允许您在容器内创建设备节点。然后创建一个循环设备,如下所示:
# mknod /dev/loop0 b 7 0
请记住,此循环设备与主机共享,并且/dev/loop0
也在那里调用。如果您知道主编号和次编号,现在就可以访问主机设备。还可能存在我尚未想到的其他后果。请注意。
答案2
循环设备由内核模块提供。因此,您需要特殊权限才能访问它们。您还需要将它们暴露到您的容器中,或者您需要手动创建设备文件。
快速答案
docker run --privileged=true ...
替代
sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...
这几乎有效
docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...
但是我收到这个错误:
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
请参阅此链接了解更多信息。
关于 systemd-nspawn 手册页的说明:
systemd-nspawn 将容器中各种内核接口的访问限制为只读,例如 /sys、/proc/sys 或 /sys/fs/selinux。网络接口和系统时钟不能从容器内更改。设备节点不能创建。主机系统不能重新启动,内核模块也不能从容器内加载。