Linux容器中的循环设备?


14

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

> 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权限?

Answers:


17

如果您使用的是systemd-nspawn,请使用--capability=CAP_MKNOD命令行开关启动容器。这将允许您在容器内创建设备节点。然后创建一个像这样的循环设备:

# mknod /dev/loop0 b 7 0

请记住,此循环设备与主机共享,并在其中也被调用/dev/loop0。现在,如果您知道主设备号和次设备号,便可以访问主机设备。我可能还没有想到其他后果。被警告。


有人可以确认--capability=CAP_MKNOD仍然有效吗?对我来说,它似乎没有任何作用,我Operation not permitted什至无法接受,因此该用户该用户也是如此
nh2

2
我现在开始使用它,但是除了付出之外,--capability=CAP_MKNOD我还必须DeviceAllow=block-loop rwm在systemd-nspawn单元中进行设置以使其起作用(从此处获得该想法)。
nh2

我必须添加--device-cgroup-rule="b 7:* rmw"docker run以允许完全访问回送设备(但没有其他设备,因为没有--privilege)。通过docs.docker.com/edge/engine/reference/commandline/create/…找到并在docker 18.06.1-ce上进行了测试(该文件声称仅适用于Docker Edge)
RobM

9

循环设备由内核模块提供。因此,您需要特殊的特权才能访问它们。您还需要将它们公开到您的容器中,或者您需要手动创建设备文件。

快速答案

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.