2014-02-25 111 views
9

我正在使用Docker容器(基于官方的centos:6.4映像)构建一个ISO,然后我需要进行安装和验证。我无法安装使用ISO:是否可以在码头集装箱内安装ISO?

sudo mount -o loop /path/to/iso /mnt 

给出:

mount: Could not find any loop device. Maybe this kernel does not know 
    about the loop device? (If so, recompile or `modprobe loop'.) 

它看起来像内核已经没有循环设备支持编译。是否有可能建立支持循环设备的码头图像?我找不到任何有关这方面的信息,但是,看着this thread似乎这可能是一个持续的话题。

我想知道是否有办法绕过这个限制?

回答

1

我怀疑这是内核。它看起来更像是您的码头集装箱没有回路设备。您是否尝试过使用losetup

+0

嗨,谢谢你的回复。你能给我多一点关于你的建议的信息吗? 'losetup'手册页上的例子表明/ dev中的循环条目存在,在这种情况下它们不存在('/ dev'的内容:'console full kmsg mapper null ptmx pts random shm stderr stdin stdout tty tty1 urandom zero ')。它看起来像使用'dmsetup'可能是一个选择,但再次,没有太多的信息如何做到这一点。 – pxul

+0

'losetup -f'给你什么? – abligh

+0

与我从mount命令中获得的一样:'losetup:找不到任何循环设备。也许这个内核不知道循环设备? (如果是这样,重新编译或modprobe循环。)' – pxul

4

我有一种感觉,这不是解决我的问题的好方法,但这是我目前所做的,直到一个更理智的想法出现。

我的容器开始到bash的,从这个shell我能够添加使用循环设备:

# mknod /dev/loop0 -m0660 b 7 0 
# mknod /dev/loop1 -m0660 b 7 1 
... 
# mknod /dev/loop9 -m0660 b 7 9 

,现在,我有循环设备可用,所以我能够挂载ISO。然而,我注意到,我的第一个可用的loop设备是/dev/loop2

bash-4.1# losetup -f 
/dev/loop2 

这意味着回路0和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) 

和,这是为什么我认为这个解决方案是坏的,从容器外部:

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) 

所以它看起来像我在映射到外LOOP0和LOOP1容器创建的第一个2台回路设备的容器,这就是为什么他们不能使用。我想必须有一种方式来设置这些设备devicemapper(这是由码头使用,看起来),但我一直没有能够提出这方面的很多信息。

目前,这个解决方案对我来说可以 - 我只需要小心地记住umount这张图片。

我知道,这是远远不够理智的解决方案,所以如果任何人都可以拿出更好的计划,我都耳熟能详。

13

要装入容器内的ISO,你需要两样东西:

  • 进入循环设备,
  • 权限装载的文件系统。

默认情况下,Docker锁定这两件事;这就是为什么你得到这个错误信息。

最简单的解决方案是以特权模式启动容器(docker run -privileged ...)。

更细致的解决方案是深入了解设备cgroup和容器功能以提供所需的权限。

请注意,您不能执行特权操作作为Dockerfile的一部分;即如果您需要将该ISO挂载到Dockerfile中,您将无法做到这一点。

不过,我建议你看看Xorriso并专门osirrox工具,它能让您从ISO映像文件,就像你会提取tar文件,而不需要任何特殊的访问,如:

osirrox -indev /path/to/iso -extract//full-iso-contents