蔣熹
摘 要:在虛擬機的復制過程中,假設ubuntu-12.10.raw已經(jīng)安好操作系統(tǒng),復制Image就可以解決這個問題,但是如果直接復制,會導致開銷很大,盡管避免了在虛擬機中安裝操作系統(tǒng),但是如果Image的size上升之后,時間花銷也不小,本文通過筆者的實際操作經(jīng)驗,淺析了如何在Ubuntu系統(tǒng)中使用qcow2技術快速創(chuàng)建多個配置相同的虛擬磁盤,以便于在云計算平臺中快速的分發(fā)虛擬機環(huán)境。
關鍵詞:qcow2 虛擬磁盤 云計算
中圖分類號:TP311 文獻標識碼:A 文章編號:1672-3791(2016)11(a)-0000-00
在虛擬機的復制過程中,假設ubuntu-12.10.raw已經(jīng)安好操作系統(tǒng),復制Image就可以解決這個問題了。我們基于復制Image的方案,很容易寫出一個可運行的腳本來。但是可以看出,這種方案的關鍵在于復制Image,由于Image的大小一般都是幾個G至上百G,如果直接復制,會導致開銷很大,盡管避免了在虛擬機中安裝操作系統(tǒng),但是如果Image的size上升之后,時間花銷也不小。
由于raw格式磁盤復制會花費大量的時間,本文嘗試使用ubuntu-12.10.raw作backing file,創(chuàng)建出大量的qcow2磁盤,以供批量的虛擬機使用。根據(jù)使用經(jīng)驗可以知道,創(chuàng)建qcow2虛擬磁盤的時間,與運行l(wèi)s命令時間幾乎一樣。那么如果采用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的方案,除了主機名和網(wǎng)絡問題,已經(jīng)比較完善了,不過利用這種方法建立起來的虛擬機,容易遇到以下問題:
(1)主機名完全相同。
(2)網(wǎng)絡有時候無法使用,虛擬機內(nèi)保存的MAC地址仍是backing file中的MAC地址。
在解決這兩個個問題之前,我們首先考慮清楚問題的限制條件:
(1)主機名的更改不能手動,需要體現(xiàn)自動化。
(2)不能等到虛擬機啟動之后再更改。啟動之后再更改主機名,需要再次重啟主機。
(3)網(wǎng)絡問題,主要是由于MAC地址與定義文件中的MAC不一致導致。那么需要將qcow2文件中記錄的MAc地址修政得和定義文件中一致。
所以解決這個問題的唯一辦法就是將qcow2 image掛載之后,再更改其中的主機名及網(wǎng)絡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處理分區(qū)之后,需要查看qcow2文件中的各種分區(qū):
root@ubuntu:/image#ls /dev/mapper/
Control nbd0p1 nbd0p2 nbd0p5
在qcow2文件中,/dve/mapper/nbd0p1才是根分區(qū),確定方式如下:
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 修改主機名
找到正確的分區(qū),掛載此分區(qū)之后,修改主機名:
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 修改網(wǎng)絡MAC地址
ubuntu系統(tǒng)的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 設置網(wǎng)絡IP信息
虛擬機的IP信息,記錄在$tcmp-file/etc/network/interfaces文件中。
5 卸載分區(qū)
卸載分區(qū)的時候,首先需要卸載$tcmp-file目錄,再接著卸載nbd0模塊:
roo@ubuntu:/image#umount $temp_file
roo@ubuntu:/image#qemu-nbd –d /dev/nbd0
總結和展望
基于qcow2快速創(chuàng)建虛擬機方案,如果能夠修改qcow2文件,那么這個方案就可以用來大規(guī)模創(chuàng)建虛擬機(當然創(chuàng)建出來的是同一種系統(tǒng))。我們可以定義腳本定義虛擬機創(chuàng)建模版template.xml,來實現(xiàn)規(guī)模創(chuàng)建。
參考文獻
[1] 戰(zhàn)友.OpenStack開源云王者歸來[M].北京:清華大學出版社,2014.2
[2] 張子凡.OpenStack部署實踐[M].北京:人民郵電出版社,2016.1