Ubuntu 14 默认对 loop devices 支持的最大数目是8,所以当我创建第九个虚拟机的时候,出现了下面的错误:
Parsing config from /home/ye/ubuntu-pv/ubuntu-pv-9/ubuntu-pv-9.cfg
libxl: error: libxl_exec.c:118:libxl_report_child_exitstatus: /etc/xen/scripts/block add [7615] exited with error status 1
libxl: error: libxl_device.c:1138:device_hotplug_child_death_cb: script: Failed to find an unused loop device
libxl: error: libxl_create.c:1176:domcreate_launch_dm: unable to add disk devices
libxl: error: libxl_exec.c:118:libxl_report_child_exitstatus: /etc/xen/scripts/block remove [7668] exited with error status 1
libxl: error: libxl_device.c:1138:device_hotplug_child_death_cb: script: /etc/xen/scripts/block failed; error detected.
libxl: error: libxl.c:1610:libxl__destroy_domid: non-existant domain 22
libxl: error: libxl.c:1568:domain_destroy_callback: unable to destroy guest with domid 22
libxl: error: libxl.c:1495:domain_destroy_cb: destruction of domain 22 failed
查看一下当前正在使用的的 loop devices:
root@ccrfox141:/home/ye/ubuntu-pv/ubuntu-pv-9# losetup -a
/dev/loop0: [0804]:79497528 (/home/ye/ubuntu-pv/ubuntu-pv-1/ubuntu-pv-1.img)
/dev/loop1: [0804]:79497536 (/home/ye/ubuntu-pv/ubuntu-pv-2/ubuntu-pv-2.img)
/dev/loop2: [0804]:79497539 (/home/ye/ubuntu-pv/ubuntu-pv-3/ubuntu-pv-3.img)
/dev/loop3: [0804]:79497546 (/home/ye/ubuntu-pv/ubuntu-pv-4/ubuntu-pv-4.img)
/dev/loop4: [0804]:79497552 (/home/ye/ubuntu-pv/ubuntu-pv-5/ubuntu-pv-5.img)
/dev/loop5: [0804]:79497556 (/home/ye/ubuntu-pv/ubuntu-pv-6/ubuntu-pv-6.img)
/dev/loop6: [0804]:79497564 (/home/ye/ubuntu-pv/ubuntu-pv-7/ubuntu-pv-7.img)
/dev/loop7: [0804]:79497570 (/home/ye/ubuntu-pv/ubuntu-pv-8/ubuntu-pv-8.img)
在Ubuntu14下增加loop设备数量的方法
通过查看内核的配置文件可知(/boot/config-VERSION-generic),默认情况下,loop内核模块是编译进内核的,而不是单独成一个独立模块,而且默认情况下是只有8个Loop设备(最少只能够是8个)。
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
这样的情况下,你有两种方法修改Loop设备的数量,一种是自己重新编译内核,修改内核的配置文件。而另外一种就是给内核传递参数,指定Loop设备的数量。这里不推荐使用第一种方式,所以忽略第一种,只讲解第二种方式:
一、Loop是一个独立的内核模块
Ubuntu14在默认情况下,loop内核模块是编译进内核的,可以通过lsmod命令查看模块是否是独立模块。
1. umount所有挂载在loop设备上的设备
2. 给loop模块指定参数
cat 'options loop max_loop=64 > /etc/modprobe
3. 卸载loop模块
4. 重新加载loop模块(有max_loop参数)
sudo modprobe loop
5. 查看现在loop设备的个数,现在loop设备的个数应该跟内核参数指定的一样
ls /dev/loop*
二、Loop模块被编译进内核
如果Loop被编译进内核,上面的方法是无效的,这个时候需要在启动系统的时候就告诉内核模块你需要的参数是什么,而不是进去系统后才告诉它。
把该参数添加到grub的控制文件中,只需要在/etc/default/grub里面进行修改:
GRUB_CMDLINE_LINUX="max_loop=64"
然后执行命令更新grub的配置
sudo update-grub
最后在/boot/grub里面检查配置文件,看是否更新成功后重启即可。
参考自: http://blog.csdn.net/kyle__shaw/article/details/53307252