我正在尝试使用容器内的回送设备来装载一些图像文件:
> 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权限?
如果您使用systemd-nspawn,请使用--capability=CAP_MKNOD命令行开关启动容器。 这将允许您在容器内创build设备节点。 然后创build一个像这样的循环设备:
# mknod /dev/loop0 b 7 0
请记住,此循环设备与主机共享,并且在那里也称为/dev/loop0 。 如果您知道主要和次要的数字,现在可以访问主机设备。 还可能有其他的后果,我没有想过。 被警告。
循环设备由内核模块提供。 因此,您需要特殊的权限来访问它们。 您还需要将它们暴露在您的容器中,或者您需要手动创build设备文件。
快速的回答
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。 networking接口和系统时钟不能从容器内改变。 设备节点可能不会被创build。 主机系统无法重新启动,并且内核模块不能从容器内加载。