pxu*_*xul 15 linux mount centos6 docker
我正在使用一个docker容器(基于官方的centos:6.4图像)来构建一个ISO,然后我需要安装和验证.我无法使用以下方式安装ISO:
sudo mount -o loop /path/to/iso /mnt
Run Code Online (Sandbox Code Playgroud)
得到:
mount: Could not find any loop device. Maybe this kernel does not know
about the loop device? (If so, recompile or `modprobe loop'.)
Run Code Online (Sandbox Code Playgroud)
看起来内核已经编译而没有循环设备支持.是否可以构建支持循环设备的docker镜像?我找不到任何关于此的信息,但是,看看这个帖子似乎这可能是一个持续的主题.
我想知道是否有办法规避这种限制?
jpe*_*zzo 24
要在容器中安装ISO,您需要两件事:
默认情况下,Docker会锁定这两件事; 这就是你收到错误信息的原因.
最简单的解决方案是以特权模式启动容器:
docker run --privileged ...
Run Code Online (Sandbox Code Playgroud)
更精细的解决方案是深入了解设备cgroup和容器功能,以提供所需的权限.
请注意,您不能将特权操作作为Dockerfile的一部分执行; 即如果您需要在Dockerfile中安装该ISO,您将无法执行此操作.
但是,我建议您查看Xorriso,特别是osirrox工具,它可以让您从ISO映像中提取文件,就像提取tar文件一样,无需任何特殊访问,例如:
osirrox -indev /path/to/iso -extract / /full-iso-contents
Run Code Online (Sandbox Code Playgroud)
我觉得这不是一个解决我问题的好方法,但这是我暂时所做的,直到一个更理智的想法出现.
我的容器开始变成bash,从这个shell我可以使用以下命令添加循环设备:
# mknod /dev/loop0 -m0660 b 7 0
# mknod /dev/loop1 -m0660 b 7 1
...
# mknod /dev/loop9 -m0660 b 7 9
Run Code Online (Sandbox Code Playgroud)
现在,我有循环设备可用,所以我可以安装ISO.但是,我注意到第一个可用的循环设备是/dev/loop2:
bash-4.1# losetup -f
/dev/loop2
Run Code Online (Sandbox Code Playgroud)
这意味着loop0和loop1已经在使用中,这可以通过以下方式确认:
bash-4.1# losetup -a
/dev/loop0: [fd00]:1978974 (/dev/loop0)
/dev/loop1: [fd00]:1978975 (/dev/loop1)
/dev/loop2: [fd00]:2369514 (/path/to/my/iso)
Run Code Online (Sandbox Code Playgroud)
而且,这就是为什么我认为这个解决方案很糟糕,从容器外部:
12:36:02 $ losetup -a
/dev/loop0: []: (/var/lib/docker/devicemapper/devicemapper/data)
/dev/loop1: []: (/var/lib/docker/devicemapper/devicemapper/metadata)
/dev/loop2: []: (/path/to/my/iso)
Run Code Online (Sandbox Code Playgroud)
所以它看起来像我在容器中创建的前2个循环设备映射到容器外的loop0和loop1,这就是它们无法使用的原因.我想必须有一种方法来设置这些设备与devicemapper(由docker使用,看起来像),但我没有能够提供很多信息.
目前,这个解决方案对我来说没问题 - 我umount完成它时,我必须小心记住图像.
我知道这远不是一个理智的解决方案,所以如果其他人能够提出更好的计划,我会全神贯注.
| 归档时间: |
|
| 查看次数: |
19341 次 |
| 最近记录: |