Linux容器中的循环设备?

Joh*_*nst 19 linux containers loop-device cgroup

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

> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory
Run Code Online (Sandbox Code Playgroud)

/dev/loop0 确实不存在,并且

> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这项工作?容器是否需要一些它可能没有的 cgroup 权限?

小智 22

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

# mknod /dev/loop0 b 7 0
Run Code Online (Sandbox Code Playgroud)

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

  • 我现在让它工作了,但除了给 `--capability=CAP_MKNOD` 之外,我还必须在 systemd-nspawn 单元中设置 `DeviceAllow=block-loop rwm` 以使其工作(从 [here] 得到这个想法) https://github.com/systemd/systemd/blob/3153ded003233b4431ee2fa4cea96cb987c08fd4/units/systemd-nspawn%40.service.in#L36-L40))。 (3认同)
  • 任何人都可以确认`--capability=CAP_MKNOD` 仍然有效吗?对我来说,它似乎没有效果,即使使用它,我也得到了“不允许操作”,[this user](https://bbs.archlinux.org/viewtopic.php?id=199015) 和 [this user] 也是如此](http://armbian2.rssing.com/browser.php?indx=63042733&item=411)。 (2认同)

hoo*_*enz 13

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

快速回答

docker run --privileged=true ...
Run Code Online (Sandbox Code Playgroud)

替代

sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...
Run Code Online (Sandbox Code Playgroud)

这几乎有效

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误:

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
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此链接。


关于 systemd-nspawn 手册页的说明:

systemd-nspawn 将容器中各种内核接口的访问权限限制为只读,例如 /sys、/proc/sys 或 /sys/fs/selinux。网络接口和系统时钟不能在容器内改变。可能无法创建设备节点。主机系统无法重新启动,内核模块可能无法从容器内加载。