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那里调用。如果您知道主要和次要号码,现在可以访问主机设备。也可能有其他我没有想到的后果。被警告。
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。网络接口和系统时钟不能在容器内改变。可能无法创建设备节点。主机系统无法重新启动,内核模块可能无法从容器内加载。