Linux容器中的循环设备?

Linux容器中的循环设备?

我正在尝试使用容器内的循环设备来挂载一些图像文件:

> 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。网络接口和系统时钟不能从容器内更改。设备节点不能创建。主机系统不能重新启动,内核模块也不能从容器内加载。

相关内容