蒋熹
摘 要:在虚拟机的复制過程中,假设ubuntu-12.10.raw已经安好操作系统,复制Image就可以解决这个问题,但是如果直接复制,会导致开销很大,尽管避免了在虚拟机中安装操作系统,但是如果Image的size上升之后,时间花销也不小,本文通过笔者的实际操作经验,浅析了如何在Ubuntu系统中使用qcow2技术快速创建多个配置相同的虚拟磁盘,以便于在云计算平台中快速的分发虚拟机环境。
关键词:qcow2 虚拟磁盘 云计算
中图分类号:TP311 文献标识码:A 文章编号:1672-3791(2016)11(a)-0000-00
在虚拟机的复制过程中,假设ubuntu-12.10.raw已经安好操作系统,复制Image就可以解决这个问题了。我们基于复制Image的方案,很容易写出一个可运行的脚本来。但是可以看出,这种方案的关键在于复制Image,由于Image的大小一般都是几个G至上百G,如果直接复制,会导致开销很大,尽管避免了在虚拟机中安装操作系统,但是如果Image的size上升之后,时间花销也不小。
由于raw格式磁盘复制会花费大量的时间,本文尝试使用ubuntu-12.10.raw作backing file,创建出大量的qcow2磁盘,以供批量的虚拟机使用。根据使用经验可以知道,创建qcow2虚拟磁盘的时间,与运行ls命令时间几乎一样。那么如果采用qcow2格式来解决这个问题,就可以成功快速地建立起大批量的虚拟机。
01 #!/bin/bash
02 For I in $(seq 10); do
03 File=ubuntu-$(i),xml
04 Cp template.xml $file
05 Sed -I “s,%VM_NAME%,ubuntu-$(i),g” $file
06 UUID=~uuidgen~ #更改UUID
07 Sed -I “s,%UUID,$UUID,g” $file
08 Qemu-img creat -f qcow2 -o \
基于qcow2的方案,除了主机名和网络问题,已经比较完善了,不过利用这种方法建立起来的虚拟机,容易遇到以下问题:
(1)主机名完全相同。
(2)网络有时候无法使用,虚拟机内保存的MAC地址仍是backing file中的MAC地址。
在解决这两个个问题之前,我们首先考虑清楚问题的限制条件:
(1)主机名的更改不能手动,需要体现自动化。
(2)不能等到虚拟机启动之后再更改。启动之后再更改主机名,需要再次重启主机。
(3)网络问题,主要是由于MAC地址与定义文件中的MAC不一致导致。那么需要将qcow2文件中记录的MAc地址修政得和定义文件中一致。
所以解决这个问题的唯一办法就是将qcow2 image挂载之后,再更改其中的主机名及网络MAC地址。
1 挂载qcow2文件
挂载qcow2文件,首先需要安装依赖包:root@ununtu:/image#apt-get install kpartx接下来,需要使用nbd模块挂载qcow2文件,运行如下命令:
01 Modprobe nbd max_part=63
02 qemu-nbd –c /dev/nbd0 /image/ubuntu-$i.qcow2
03 kpartx –a /dev/nbd0
04 sleep 1
kpartx处理分区之后,需要查看qcow2文件中的各种分区:
root@ubuntu:/image#ls /dev/mapper/
Control nbd0p1 nbd0p2 nbd0p5
在qcow2文件中,/dve/mapper/nbd0p1才是根分区,确定方式如下:
01 root@ubuntu:/image#temp_file=~mktemp~
02 root@ubuntu:/image#rm -rf $temp_file;mkdir -p $temp_file
03 root@ubuntu:/image#mount /dev/mapper/nbd0p1 $temp_file
04 root@jiyou-os:/image#ls $temp_file/usr
05 Bin games include lib local sbin share src
2 修改主机名
找到正确的分区,挂载此分区之后,修改主机名:
root@ubuntu:/image#HOST _NAME=ubuntu-$I
root@ubuntu:/iname#sed -I “s,127.0.0.1.*,127.0.0.1 $HOST_NAME,g” $temp_file/etc/hosts
root@ubuntu:/image#echo $HOST_NAME > $temp_file/etc/hostname
3 修改网络MAC地址
ubuntu系统的MAC地址配置需要修改$temp_file/etc/udev/rules.d/70-persistent-net.rules。首先需要修改此文件:
01 root@ubuntu:/image#file=$temp_fiel/etc/udev/rules.d/70-persistent-net.rules
02 root@ubuntu:/image#cat <<“EOF”>$file
03 #This file was automatcially generated by the /lib/udev/write_net_rules
04 #program,run by the persistent-net-generator,rules rules file.
05 #
4 设置网络IP信息
虚拟机的IP信息,记录在$tcmp-file/etc/network/interfaces文件中。
5 卸载分区
卸载分区的时候,首先需要卸载$tcmp-file目录,再接着卸载nbd0模块:
roo@ubuntu:/image#umount $temp_file
roo@ubuntu:/image#qemu-nbd –d /dev/nbd0
总结和展望
基于qcow2快速创建虚拟机方案,如果能够修改qcow2文件,那么这个方案就可以用来大规模创建虚拟机(当然创建出来的是同一种系统)。我们可以定义脚本定义虚拟机创建模版template.xml,来实现规模创建。
参考文献
[1] 戰友.OpenStack开源云王者归来[M].北京:清华大学出版社,2014.2
[2] 张子凡.OpenStack部署实践[M].北京:人民邮电出版社,2016.1



