今天,在管理Xen虚拟机的时候遇到了问题,新建了一台虚拟机后无法启动安装系统,查看了Xen的日志,以及手动启动的时候,都有如下错误:
Error: Device 5632 (vbd) could not be connected. /etc/xen/scripts/block failed; error detected.
这错误,让我直接摸不着头脑,于是修改设置继续启动尝试,突然发现,在没加载ISO镜像文件的时候,居然能启动,脑子里一个念头闪过,莫非是镜像文件的问题,导致无法加载?
于是,我打算检查一下ISO文件,但是我发现别的虚拟机也是使用的这个镜像文件,而且主要配置都是一样的,看来不是文件的问题。
不是文件问题,那就是挂载的问题了,因为Xen虚拟机是需要用loop设备来挂载ISO,所以我就执行了如下命令,来确认loop设备使用情况:

?
1
[root@Xen28 ~] # losetup -a

发现loop0到loop7的8个loop设备都在使用中,我心里开始怀疑是loop设备不够,导致无法挂载,于是执行:

?
1
2
[root@Xen28 ~] # losetup -f
losetup: could not find any free loop device

从命令的结果看,果然是没有空闲的loop设备了,欣喜万分。原来别的虚拟机用完ISO,并未卸载,所以造成loop设备没有释放。

接下来,开始解决这个问题,希望一切顺利,首先看下loop模块的信息:

?
1
2
3
4
5
6
7
8
9
[root@Xen28 ~] # modinfo loop
filename:       /lib/modules/2 .6.18-274.7.1.el5xen /kernel/drivers/block/loop .ko
alias :          block-major-7-*
license:        GPL
srcversion:     7B77C38DEABD5C685E795FF
depends:
vermagic:       2.6.18-274.7.1.el5xen SMP mod_unload gcc-4.1
parm:           max_loop:Maximum number of loop devices (1-256) (int)
module_sig:     883f3504ea0954be35359b9fcadd151125a9d09f649151114794604f3adde24c301a20c4f78c8fcf0a0c175da675dc147c01d440e1c9698cbe785e76c8

从parm:那行可以看出,我们的系统最多支持256个loop设备,并且在模块加载的时候支持max_loop参数指定loop设备最大加载个数,我打算设置128个,修改/etc/modprobe.conf文件,加入:

?
1
options loop max_loop=128

然后需要重新加载loop模块,我会的方法,有如下两种:
1.因为别的虚拟机正在使用loop设备,所以无法直接卸载loop模块,必须先卸载正在使用的loop设备,
并重启已经启动的虚拟机,让卸载生效,然后执行下面的命令:

?
1
[root@Xen28 ~] # rmmod loop && modprobe loop

如果没有错误发生,那么就会正常创建128个loop设备,你可以查看一下:

?
1
[root@Xen28 ~] # ls /dev/loop*

2.直接重启系统:

?
1
[root@Xen28 ~] # shutdown -r now

我采用的第一种方法,我的操作步骤是这样的(为了100%确认是loop设备不够):
1.先卸载某一台虚拟机的ISO,然后重启该虚拟机。
2.确认有一个loop设备处于空闲状态。
3.加载ISO文件启动新建的虚拟机,发现可以启动,顺利到了安装系统界面。
4.卸载所有虚拟机ISO并重启,开始执行rmmod loop && modprobe loop

后话,我暂时没找到不重启已经存在的虚拟机或者不重启系统来解决这个问题的方法,我尝试过手动创建loop设备文件,可是不生效。如果读者中有知道的,希望能够赐教。

我采用第一种方法,先关闭所有虚拟机,修改/etc/modprobe.conf

添加options loop max_loop=128

执行:rmmod loop && modprobe loop

ll /dev/loop*

开启虚拟机

来源:http://www.litvip.com/599/