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