參考:https://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm2/index.html
從一臺(tái)物理主機(jī)上遷移 KVM 虛擬機(jī)到另一臺(tái)物理主機(jī)。
V2V 虛擬機(jī)的遷移是指在 VMM(Virtual Machine Monitor)上運(yùn)行的虛擬機(jī)系統(tǒng),能夠被轉(zhuǎn)移到其他物理主機(jī)上的 VMM 上運(yùn)行。VMM 對(duì)硬件資源進(jìn)行抽象和隔離,屏蔽了底層硬件細(xì)節(jié)。而遷移技術(shù)的出現(xiàn),使得操作系統(tǒng)能在不同的主機(jī)之間動(dòng)態(tài)的轉(zhuǎn)移,進(jìn)一步解除軟、硬件資源之間的相關(guān)性。
V2V 遷移方式的分類(lèi)
靜態(tài)遷移
靜態(tài)遷移:也叫做常規(guī)遷移、離線(xiàn)遷移(Offline Migration)。就是在虛擬機(jī)關(guān)機(jī)或暫停的情況下從一臺(tái)物理機(jī)遷移到另一臺(tái)物理機(jī)。因?yàn)樘摂M機(jī)的文件系統(tǒng)建立在虛擬機(jī)鏡像上面,所以在虛擬機(jī)關(guān)機(jī)的情況下,只需要簡(jiǎn)單的遷移虛擬機(jī)鏡像和相應(yīng)的配置文件到另外一臺(tái)物理主機(jī)上;如果需要保存虛擬機(jī)遷移之前的狀態(tài),在遷移之前將虛擬機(jī)暫停,然后拷貝狀態(tài)至目的主機(jī),最后在目的主機(jī)重建虛擬機(jī)狀態(tài),恢復(fù)執(zhí)行。這種方式的遷移過(guò)程需要顯式的停止虛擬機(jī)的運(yùn)行。從用戶(hù)角度看,有明確的一段停機(jī)時(shí)間,虛擬機(jī)上的服務(wù)不可用。這種遷移方式簡(jiǎn)單易行,適用于對(duì)服務(wù)可用性要求不嚴(yán)格的場(chǎng)合。
共享存儲(chǔ)的動(dòng)態(tài)遷移
動(dòng)態(tài)遷移(Live Migration):也叫在線(xiàn)遷移(Online Migration)。就是在保證虛擬機(jī)上服務(wù)正常運(yùn)行的同時(shí),將一個(gè)虛擬機(jī)系統(tǒng)從一個(gè)物理主機(jī)移動(dòng)到另一個(gè)物理主機(jī)的過(guò)程。該過(guò)程不會(huì)對(duì)最終用戶(hù)造成明顯的影響,從而使得管理員能夠在不影響用戶(hù)正常使用的情況下,對(duì)物理服務(wù)器進(jìn)行離線(xiàn)維修或者升級(jí)。與靜態(tài)遷移不同的是,為了保證遷移過(guò)程中虛擬機(jī)服務(wù)的可用,遷移過(guò)程僅有非常短暫的停機(jī)時(shí)間。遷移的前面階段,服務(wù)在源主機(jī)的虛擬機(jī)上運(yùn)行,當(dāng)遷移進(jìn)行到一定階段,目的主機(jī)已經(jīng)具備了運(yùn)行虛擬機(jī)系統(tǒng)的必須資源,經(jīng)過(guò)一個(gè)非常短暫的切換,源主機(jī)將控制權(quán)轉(zhuǎn)移到目的主機(jī),虛擬機(jī)系統(tǒng)在目的主機(jī)上繼續(xù)運(yùn)行。對(duì)于虛擬機(jī)服務(wù)本身而言,由于切換的時(shí)間非常短暫,用戶(hù)感覺(jué)不到服務(wù)的中斷,因而遷移過(guò)程對(duì)用戶(hù)是透明的。動(dòng)態(tài)遷移適用于對(duì)虛擬機(jī)服務(wù)可用性要求很高的場(chǎng)合。
目前主流的動(dòng)態(tài)遷移工具,VMware 的 VMotion,Citrix 的 XenMotion,他們都依賴(lài)于物理機(jī)之間采用 SAN(storage area network)或 NAS(network-attached storage)之類(lèi)的集中式共享外存設(shè)備,因而在遷移時(shí)只需要進(jìn)行虛擬機(jī)系統(tǒng)內(nèi)存執(zhí)行狀態(tài)的遷移,從而獲得較好的遷移性能。

如圖所示,動(dòng)態(tài)遷移,為了縮短遷移時(shí)間和服務(wù)中斷時(shí)間,源主機(jī)和目的主機(jī)共享了 SAN 存儲(chǔ)。這樣,動(dòng)態(tài)遷移只需要考慮虛擬機(jī)系統(tǒng)內(nèi)存執(zhí)行狀態(tài)的遷移,從而獲得較好的性能。
本地存儲(chǔ)的動(dòng)態(tài)遷移
動(dòng)態(tài)遷移基于共享存儲(chǔ)設(shè)備,為的是加速遷移的過(guò)程,盡量減少宕機(jī)時(shí)間。但是在某些情況下需要進(jìn)行基于本地存儲(chǔ)的虛擬機(jī)的動(dòng)態(tài)遷移,這就需要存儲(chǔ)塊動(dòng)態(tài)遷移技術(shù),簡(jiǎn)稱(chēng)塊遷移。
- 某些服務(wù)器沒(méi)有使用 SAN 存儲(chǔ),而且遷移的頻率很小,虛擬機(jī)上的服務(wù)對(duì)遷移時(shí)間的要求不嚴(yán)格,則可以使用存儲(chǔ)塊動(dòng)態(tài)遷移技術(shù);另一方面,SAN 存儲(chǔ)的價(jià)格比較高,盡管 SAN 存儲(chǔ)能夠提高遷移性能和系統(tǒng)的穩(wěn)定性,對(duì)于中小企業(yè)僅僅為了加快遷移速度而配置昂貴的 SAN 存儲(chǔ),性?xún)r(jià)比不高。
- 在集中式共享外部存儲(chǔ)的環(huán)境下,基于共享存儲(chǔ)的動(dòng)態(tài)遷移技術(shù)無(wú)疑能夠工作得很好。但是,考慮到目前一些計(jì)算機(jī)集群并沒(méi)有采用共享式外存,而是各自獨(dú)立擁有本地外存的物理主機(jī)構(gòu)成?;诠蚕泶鎯?chǔ)的遷移技術(shù)在這種場(chǎng)合下受到限制,虛擬機(jī)遷移到目的主機(jī)后,不能訪(fǎng)問(wèn)其原有的外存設(shè)備,或者需要源主機(jī)為其外存訪(fǎng)問(wèn)提供支持。
產(chǎn)生了一個(gè)需求:為了拓寬動(dòng)態(tài)遷移技術(shù)的應(yīng)用范圍,有必要實(shí)現(xiàn)一個(gè)包括虛擬機(jī)外存遷移在內(nèi)的全系統(tǒng)動(dòng)態(tài)遷移方案。使得在采用分散式本地存儲(chǔ)的計(jì)算機(jī)集群環(huán)境下,仍然能夠利用遷移技術(shù)轉(zhuǎn)移虛擬機(jī)環(huán)境,并且保證遷移過(guò)程中虛擬機(jī)系統(tǒng)服務(wù)的可用性。

與基于共享存儲(chǔ)的動(dòng)態(tài)遷移的不同:數(shù)據(jù)塊動(dòng)態(tài)遷移需要同時(shí)遷移虛擬機(jī)磁盤(pán)鏡像和虛擬機(jī)系統(tǒng)內(nèi)存狀態(tài),延長(zhǎng)了遷移時(shí)間,在遷移性能上打了折扣。
KVM 虛擬機(jī)的管理工具
準(zhǔn)確來(lái)說(shuō),KVM 僅僅是 Linux 內(nèi)核的一個(gè)模塊。管理和創(chuàng)建完整的 KVM 虛擬機(jī),需要更多的輔助工具。
QEMU-KVM:
在 Linux 系統(tǒng)中,首先我們可以用 modprobe 系統(tǒng)工具去加載 KVM 模塊,如果用 RPM 安裝 KVM 軟件包,系統(tǒng)會(huì)在啟動(dòng)時(shí)自動(dòng)加載模塊。加載了模塊后,才能進(jìn)一步通過(guò)其他工具創(chuàng)建虛擬機(jī)。但僅有 KVM 模塊是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)橛脩?hù)無(wú)法直接控制內(nèi)核模塊去做事情,還必須有一個(gè)用戶(hù)空間的工具。關(guān)于用戶(hù)空間的工具,KVM 的開(kāi)發(fā)者選擇了已經(jīng)成型的開(kāi)源虛擬化軟件 QEMU。QEMU 是一個(gè)強(qiáng)大的虛擬化軟件,它可以虛擬不同的 CPU 構(gòu)架。比如說(shuō)在 x86 的 CPU 上虛擬一個(gè) Power 的 CPU,并利用它編譯出可運(yùn)行在 Power 上的程序。KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 內(nèi)核模塊的用戶(hù)空間工具 QEMU-KVM。所以 Linux 發(fā)行版中分為 kernel 部分的 KVM 內(nèi)核模塊和 QEMU-KVM 工具。這就是 KVM 和 QEMU 的關(guān)系。
Libvirt、virsh、virt-manager:
盡管 QEMU-KVM 工具可以創(chuàng)建和管理 KVM 虛擬機(jī),RedHat 為 KVM 開(kāi)發(fā)了更多的輔助工具,比如 libvirt、libguestfs 等。原因是 QEMU 工具效率不高,不易于使用。Libvirt 是一套提供了多種語(yǔ)言接口的 API,為各種虛擬化工具提供一套方便、可靠的編程接口,不僅支持 KVM,而且支持 Xen 等其他虛擬機(jī)。使用 libvirt,你只需要通過(guò) libvirt 提供的函數(shù)連接到 KVM 或 Xen 宿主機(jī),便可以用同樣的命令控制不同的虛擬機(jī)了。Libvirt 不僅提供了 API,還自帶一套基于文本的管理虛擬機(jī)的命令—— virsh,你可以通過(guò)使用 virsh 命令來(lái)使用 libvirt 的全部功能。但最終用戶(hù)更渴望的是圖形用戶(hù)界面,這就是 virt-manager。他是一套用 python 編寫(xiě)的虛擬機(jī)管理圖形界面,用戶(hù)可以通過(guò)它直觀地操作不同的虛擬機(jī)。Virt-manager 就是利用 libvirt 的 API 實(shí)現(xiàn)的。
演示案例
系統(tǒng)環(huán)境:基于 Novell 公司的 Suse Linux Enterprise Server 11 Service Pack 1 發(fā)行版。
SLES11 SP1 發(fā)布于 2010 年 5 月 19 日
基于 Linux 內(nèi)核 2.6.32.12
包含了 kvm-0.12.3,libvirt-0.7.6,virt-manager-0.8.4
全面支持 KVM 虛擬機(jī)。
硬件配置:
| 物理主機(jī) | 硬件配置 | Host OS | Host Name | IP Address |
|---|---|---|---|---|
| 源主機(jī) | Xeon(R) E5506 x 4 core MEM: 10GB | SLES11 SP1 | vicorty3 | 192.168.0.73 |
| 目的主機(jī) | Xeon(R) E5506 x 8 core MEM: 18GB | SLES11 SP1 | vicorty4 | 192.168.0.74 |
| NFS Server | Pentium(R) D x 2 core MEM: 2G | SLES11 SP1 | server17 | 192.168.0.17 |
創(chuàng)建 KVM 虛擬機(jī)
遷移虛擬機(jī)之前,我們需要?jiǎng)?chuàng)建虛擬機(jī)。創(chuàng)建虛擬機(jī)可以使用 QEMU-KVM 命令或者通過(guò) virt-manager 圖形化管理工具。
- QEMU-KVM 創(chuàng)建虛擬機(jī)鏡像文件:見(jiàn)本文的參考資源“KVM 虛擬機(jī)在 IBM System x 上應(yīng)用”。
- virt-manager 創(chuàng)建虛擬機(jī):參考 virt-manager 幫助手冊(cè)。
KVM 虛擬機(jī)靜態(tài)遷移
1、在源主機(jī)上關(guān)閉虛擬機(jī)
2、移動(dòng)虛擬機(jī)的存儲(chǔ)鏡像和配置文件到目的主機(jī)
3、在目的主機(jī)上啟動(dòng)虛擬機(jī),恢復(fù)服務(wù)
虛擬機(jī)之間使用共享存儲(chǔ)
1、如果源主機(jī)和目的主機(jī)都能夠訪(fǎng)問(wèn)虛擬機(jī)的鏡像,則只需要遷移虛擬機(jī)配置文件。
2、無(wú)論你何時(shí)在 /etc/libvirt/qemu/ 中修改了虛擬機(jī)的 XML 文件,必須重新運(yùn)行 define 命令,以激活新的虛擬機(jī)配置文件
激活虛擬機(jī)配置文件
# virsh define /etc/libvirt/qemu/”your vm name.xml”
虛擬機(jī)鏡像使用本地存儲(chǔ)
本地存儲(chǔ)是指虛擬機(jī)的文件系統(tǒng)建立在本地硬盤(pán)上,可以是文件或者磁盤(pán)分區(qū)。
- 本地文件存儲(chǔ):如果虛擬機(jī)是基于鏡像文件,直接從源主機(jī)拷貝鏡像文件和 XML 配置文件到目的主機(jī)中,然后對(duì) XML 進(jìn)行適當(dāng)?shù)男薷牟⒓せ睢?/li>
- 本地磁盤(pán)分區(qū):如果虛擬機(jī)使用了磁盤(pán)分區(qū)(物理分區(qū)或者邏輯分區(qū))為存儲(chǔ)設(shè)備,首先用 dump 工具把磁盤(pán)分區(qū)轉(zhuǎn)換成鏡像文件再拷貝到目的主機(jī)。在目的主機(jī)恢復(fù)虛擬機(jī)時(shí),把鏡像文件恢復(fù)到目的主機(jī)的磁盤(pán)分區(qū)中去。對(duì)于虛擬機(jī)系統(tǒng)使用了多個(gè)磁盤(pán)分區(qū)的,需要每個(gè)分區(qū)單獨(dú) dump 成鏡像文件。
例如使用“/dev/VolGroup00/lv001” LVM 邏輯卷作為存儲(chǔ)設(shè)備
轉(zhuǎn)換邏輯卷為鏡像文件
dd if=/dev/VolGroup00/lv001 of=lv001.img bs=1M
保存虛擬機(jī)的運(yùn)行狀態(tài)
靜態(tài)遷移虛擬的過(guò)程中,虛擬機(jī)系統(tǒng)處于關(guān)機(jī)狀態(tài),這樣虛擬機(jī)關(guān)機(jī)前的運(yùn)行狀態(tài)不會(huì)保留。如果希望保留遷移前的系統(tǒng)狀態(tài),并且在遷移后能夠恢復(fù),需要對(duì)虛擬機(jī)做快照備份或者以休眠的方式關(guān)閉系統(tǒng)
基于共享存儲(chǔ)的動(dòng)態(tài)遷移
根據(jù)虛擬機(jī)連接存儲(chǔ)方式的不同,動(dòng)態(tài)遷移分為基于共享存儲(chǔ)的動(dòng)態(tài)遷移和基于本地存儲(chǔ)的存儲(chǔ)塊遷移。
實(shí)現(xiàn)這種實(shí)時(shí)遷移的條件之一就是把虛擬機(jī)存儲(chǔ)文件存放在公共的存儲(chǔ)空間。因此需要設(shè)定一個(gè)共享存儲(chǔ)空間,讓源主機(jī)和目的主機(jī)都能夠連接到共享存儲(chǔ)空間上的虛擬媒體文件,包括虛擬磁盤(pán)、虛擬光盤(pán)和虛擬軟盤(pán)。否則,即使遷移完成以后,也會(huì)因?yàn)闊o(wú)法連接虛擬設(shè)備,導(dǎo)致無(wú)法啟動(dòng)遷移后的虛擬機(jī)。
設(shè)置實(shí)驗(yàn)環(huán)境
動(dòng)態(tài)遷移實(shí)際上是把虛擬機(jī)的配置封裝在一個(gè)文件中,然后通過(guò)高速網(wǎng)絡(luò),把虛擬機(jī)配置和內(nèi)存運(yùn)行狀態(tài)從一臺(tái)物理機(jī)迅速傳送到另外一臺(tái)物理機(jī)上,期間虛擬機(jī)一直保持運(yùn)行狀態(tài)。現(xiàn)有技術(shù)條件下,大多虛擬機(jī)軟件如 VMware、Hyper-V、Xen 進(jìn)行動(dòng)態(tài)遷移都需要共享存儲(chǔ)的支持。典型的共享存儲(chǔ)包括 NFS 和 SMB/CIFS 協(xié)議的網(wǎng)絡(luò)文件系統(tǒng),或者通過(guò) iSCSI 連接到 SAN 網(wǎng)絡(luò)。選用哪一種網(wǎng)絡(luò)文件系統(tǒng),需要根據(jù)具體情況而定。

a、確保網(wǎng)絡(luò)連接正確,源主機(jī)、目的主機(jī)和 NFS 服務(wù)器之間可以互相訪(fǎng)問(wèn)。
b、確保源主機(jī)和目的主機(jī)上的 VMM 運(yùn)行正常。
c、設(shè)置 NFS 服務(wù)器的共享目錄。本文的 NFS 服務(wù)器也安裝了 SLES11 SP1 操作系統(tǒng)。
配置 NFS 服務(wù)
修改 /etc/exports 文件,添加
/home/image *(rw,sync,no_root_squash)
rw:可讀寫(xiě)的權(quán)限;
ro:只讀的權(quán)限;
no_root_squash:登入到 NFS 主機(jī)的用戶(hù)如果是 ROOT 用戶(hù),他就擁有 ROOT 權(quán)限,此參數(shù)很不安全,建議不要使用。
sync:資料同步寫(xiě)入存儲(chǔ)器中。
async:資料會(huì)先暫時(shí)存放在內(nèi)存中,不會(huì)直接寫(xiě)入硬盤(pán)。
重新啟動(dòng) nfsserver 服務(wù)
# service nfsserver restart
使用 virt-manager 進(jìn)行動(dòng)態(tài)遷移
virt-manager 是基于 libvirt 的圖像化虛擬機(jī)管理軟件,請(qǐng)注意不同的發(fā)行版上 virt-manager 的版本可能不同,圖形界面和操作方法也可能不同。
1、在源主機(jī)和目的主機(jī)上添加共享存儲(chǔ)。這里以源主機(jī)為例,目的主機(jī)做相同的配置。
2、添加 NFS 存儲(chǔ)池到源主機(jī)和目的主機(jī)的 vit-manager 中。點(diǎn)擊 Edit menu->Host Details->Storage tab。

3、添加一個(gè)新的存儲(chǔ)池。點(diǎn)擊左下角的“+”號(hào),彈出一個(gè)新的窗口。輸入以下參數(shù):
4、Name:存儲(chǔ)池的名字。
5、Type:選擇 netfs:Network Exported Directory。因?yàn)楸疚氖褂昧?NFS 作為共享存儲(chǔ)協(xié)議。

6、點(diǎn)擊“Forward”后,輸入以下參數(shù):
7、Target Path:共享存儲(chǔ)在本地的映射目錄。本文中這個(gè)目錄在源主機(jī)和目的主機(jī)上必須一致。
8、Format:選擇存儲(chǔ)類(lèi)型。這里必須是 nfs。
9、Host Name:輸入共享存儲(chǔ)服務(wù)器,也就是 NFS 服務(wù)器的 IP 地址或 hostname。
10、Source Path:NFS 服務(wù)器上輸出的共享目錄。

11、點(diǎn)擊”Finish”后,共享存儲(chǔ)添加成功。此時(shí)在物理機(jī)上查看 Linux 系統(tǒng)的文件系統(tǒng)列表,可以看到共享存儲(chǔ)映射的目錄。
12、源主機(jī)上創(chuàng)建基于共享存儲(chǔ)的 KVM 虛擬機(jī)。
13、選擇共享存儲(chǔ)池,點(diǎn)擊”New Volume”創(chuàng)建新的存儲(chǔ)卷。
14、輸入存儲(chǔ)卷參數(shù)。本例為虛擬機(jī)創(chuàng)建了大小為 10G,格式為 qcow2 的存儲(chǔ)卷。

15、在這個(gè)共享存儲(chǔ)卷上創(chuàng)建虛擬機(jī)。本文創(chuàng)建了一個(gè)基于 Window 2008 R2 系統(tǒng)的虛擬機(jī)。創(chuàng)建虛擬機(jī)的具體步驟見(jiàn)本文前面“創(chuàng)建 KVM 虛擬機(jī)“小節(jié)。
16、連接遠(yuǎn)程物理主機(jī)上的 VMM。這里以源主機(jī)為例,目的主機(jī)做相同的配置。
17、在源主機(jī)上打開(kāi) virt-manager 應(yīng)用程序,連接 localhost 本機(jī)虛擬機(jī)列表。點(diǎn)擊 File->Add Connection,彈出添加連接窗口,輸入以下各項(xiàng):
18、Hypervisor:選擇 QEMU。
19、Connection:選擇連接方式 。本文選擇 SSH 連接。
20、Hostname:輸入將要連接的主機(jī)名或 IP 地址,這里填寫(xiě)目的主機(jī)名 victory4。

21、點(diǎn)擊 Connect,輸入 SSH 連接的密碼后,將顯示源主機(jī)和目的主機(jī)上的虛擬機(jī)列表。

從源主機(jī)動(dòng)態(tài)遷移 KVM 虛擬機(jī)到目的主機(jī)。
- 在源主機(jī)上啟動(dòng)虛擬機(jī) Windwos 2008 R2。
- 在虛擬機(jī)中,開(kāi)啟實(shí)時(shí)網(wǎng)絡(luò)服務(wù)(用來(lái)驗(yàn)證遷移過(guò)程中服務(wù)的可用性)。
- 開(kāi)啟遠(yuǎn)程連接服務(wù) remote access,在其他主機(jī)上遠(yuǎn)程連接此虛擬機(jī)。
- 開(kāi)啟網(wǎng)絡(luò)實(shí)時(shí)服務(wù)。例如打開(kāi)瀏覽器并且播放一個(gè)實(shí)時(shí)網(wǎng)絡(luò)視頻。
- 準(zhǔn)備動(dòng)態(tài)遷移,確保所有的虛擬存儲(chǔ)設(shè)備此時(shí)是共享的,包括 ISO 和 CDROM。
- 在源主機(jī)的 virt-manager 窗口中,右鍵點(diǎn)擊等待遷移的虛擬機(jī),選擇“Migrate ”。
- New host:選擇目的主機(jī)的 hostname。
- Address:填入目的主機(jī)的 IP 地址。
- Port and Bandwith:指定連接目的主機(jī)的端口和傳輸帶寬,本文中沒(méi)有設(shè)定,使用默認(rèn)設(shè)置。

- 點(diǎn)擊“Migrate”和“Yes”開(kāi)始動(dòng)態(tài)遷移虛擬機(jī)。

- 動(dòng)態(tài)遷移的時(shí)間與網(wǎng)絡(luò)帶寬、物理主機(jī)的性能和虛擬機(jī)的配置相關(guān)。本實(shí)驗(yàn)中的網(wǎng)絡(luò)連接基于 100Mbps 的以太網(wǎng),整個(gè)遷移過(guò)程大約耗時(shí) 150 秒。使用 RDC(Remote Desktop Connection)遠(yuǎn)程連接虛擬機(jī)在遷移過(guò)程中沒(méi)有中斷;虛擬機(jī)中播放的實(shí)時(shí)網(wǎng)絡(luò)視頻基本流暢,停頓的時(shí)間很短,只有 1 秒左右。如果采用 1000Mbps 的以太網(wǎng)或者光纖網(wǎng)絡(luò),遷移時(shí)間將會(huì)大大減少,而虛擬機(jī)服務(wù)停頓的時(shí)間幾乎可以忽略不計(jì)。
- 遷移完成后,目的主機(jī)的 VMM 中自動(dòng)創(chuàng)建了一個(gè)同名的 Windows 2008 R2 虛擬機(jī),并且繼續(xù)提供遠(yuǎn)程連接服務(wù)和播放在線(xiàn)視頻。源主機(jī)上的虛擬機(jī)變?yōu)闀和顟B(tài),不再提供服務(wù)。至此,動(dòng)態(tài)遷移勝利完成。
基于數(shù)據(jù)塊的動(dòng)態(tài)遷移
從 qemu-kvm-0.12.2 版本,引入了 Block Migration (塊遷移)的特性。
有了塊遷移技術(shù)以后,可以在動(dòng)態(tài)遷移過(guò)程中,把虛擬磁盤(pán)文件從源主機(jī)遷移至目的主機(jī)。QEMU-KVM 有了這個(gè)特性以后,共享存儲(chǔ)不再是動(dòng)態(tài)遷移的必要條件,從而降低了動(dòng)態(tài)遷移的難度,擴(kuò)大了動(dòng)態(tài)遷移的應(yīng)用范圍。
設(shè)置實(shí)驗(yàn)環(huán)境
塊遷移過(guò)程中,虛擬機(jī)只使用本地存儲(chǔ),因此物理環(huán)境非常簡(jiǎn)單。只需要源主機(jī)和目的主機(jī)通過(guò)以太網(wǎng)連接
- QEMU 的控制終端和遷移命令
QEMU 控制終端的開(kāi)啟,可以在 QEMQ-KVM 的命令中加參數(shù)“-monitor”。
-monitor stdio: 輸出到文本控制臺(tái)。
-monitor vc: 輸出到圖形控制臺(tái)。
圖形控制臺(tái)和虛擬機(jī) VNC 窗口的切換命令是:
Ctrl+Alt+1: VNC window
Ctrl+Alt+2: monitor console
Ctrl+Alt+3: serial0 console
Ctrl+Alt+4: parallel0 console
QEMU-KVM 提供了的“-incoming”參數(shù)在指定的端口監(jiān)聽(tīng)遷移數(shù)據(jù)。目的主機(jī)上需要此參數(shù)接收來(lái)自源主機(jī)的遷移數(shù)據(jù)。
使用 QEMU-KVM 進(jìn)行數(shù)據(jù)塊動(dòng)態(tài)遷移
在源主機(jī)上創(chuàng)建和啟動(dòng)虛擬機(jī)。
victory3:~ # qemu-img create -f qcow2 /var/lib/kvm/images/sles11.1ga/disk0.qcow2 10G
源主機(jī)上安裝虛擬機(jī)
victory3:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on -device virtio-blk-pci,bus=pci.0,
addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 -drive
file=/media/83/software/Distro/SLES-11-SP1-DVD-x86_64-GM-DVD1.iso,
if=none,media=cdrom,id=drive-ide0-1-0 -device ide-drive,bus=ide.1,
unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device virtio-net-pci,vlan=0,
id=net0,mac=52:54:00:13:08:96 -net tap -vnc 127.0.0.1:3
源主機(jī)上啟動(dòng)虛擬機(jī)
victory3:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on -device virtio-blk-pci,bus=pci.0,addr=0x4,
drive=drive-virtio-disk0,id=virtio-disk0 -drive if=none,media=cdrom,
id=drive-ide0-1-0 -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,
id=ide0-1-0 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:13:08:96
-net tap -vnc 127.0.0.1:3
“-monitor stdio”是為了開(kāi)啟文本控制臺(tái)
去掉了虛擬光驅(qū)中的 ISO 文件是為了保證遷移時(shí),源主機(jī)和目的主機(jī)上虛擬設(shè)備的一致性。
如果你在目的主機(jī)的相同路徑下存在相同名字的 ISO 文件,則可以在遷移時(shí)保留 ISO 文件參數(shù)。
目的主機(jī)上創(chuàng)建虛擬機(jī)
victory4:~ # qemu-img create -f qcow2 dest.img 20G
Formatting 'dest.img', fmt=qcow2 size=21474836480 encryption=off cluster_size=0
在目的主機(jī)上為遷移后的系統(tǒng)創(chuàng)建鏡像文件,文件的大小必須大于或等于源主機(jī)的鏡像文件大小。
目的主機(jī)上的遷移命令
victory4:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/root/dest.img,if=none,id=drive-virtio-disk0,
boot=on -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,
id=virtio-disk0 -drive if=none,media=cdrom,id=drive-ide0-1-0 -device ide-drive,
bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device virtio-net-pci,vlan=0,
id=net0,mac=52:54:00:13:08:96 -net tap -vnc 127.0.0.1:8 -incoming tcp:0:8888
QEMU 0.12.3 monitor - type 'help' for more information
(qemu) info status
VM status: paused
使用與源主機(jī)上相同的 qemu-kvm 參數(shù),更改鏡像文件為目的主機(jī)上創(chuàng)建的鏡像文件,加上 -incoming 參數(shù)指定動(dòng)態(tài)遷移所使用的協(xié)議、IP 地址和端口號(hào)。
因?yàn)?-incoming 參數(shù)的作用是監(jiān)聽(tīng)端口,所以目的主機(jī)上的虛擬機(jī)一啟動(dòng)就處于 paused 狀態(tài),等待源主機(jī)上虛擬機(jī)開(kāi)始遷移。
遷移源主機(jī)上的虛擬機(jī)到目的主機(jī)。
- 回到源主機(jī)上,在等待遷移的虛擬機(jī)中開(kāi)啟一些實(shí)時(shí)服務(wù)以驗(yàn)證動(dòng)態(tài)遷移不會(huì)中斷服務(wù)的運(yùn)行。本例中在虛擬機(jī)的終端窗口中用“top -d 1“命令開(kāi)啟 TOP 服務(wù),每秒刷新一次系統(tǒng)進(jìn)程的信息。

源主機(jī)遷移命令
(qemu) migrate -d -b tcp:victory4:8888
-d 可以在遷移的過(guò)程中查詢(xún)遷移狀態(tài),否則只能在遷移結(jié)束后查詢(xún)。
-b 遷移虛擬機(jī)存儲(chǔ)文件
tcp:ivctory4:8888 數(shù)據(jù)遷移的協(xié)議、目的主機(jī)和端口。協(xié)議和端口必須和目的主機(jī)上虛擬機(jī)的 -incoming 參數(shù)一致。
- 動(dòng)態(tài)遷移期間,源主機(jī)的虛擬機(jī)繼續(xù)運(yùn)行,TOP 服務(wù)沒(méi)有中斷。同時(shí)可以在源主機(jī)的 QEMU 控制臺(tái)查詢(xún)遷移的狀態(tài)。目的主機(jī)的虛擬機(jī)處于 paused 狀態(tài),從目的主機(jī)的 QEMU 控制臺(tái)可以看到遷移進(jìn)度的百分比。
監(jiān)視虛擬機(jī)遷移過(guò)程
源主機(jī) QEMU 控制臺(tái)顯示正在遷移的數(shù)據(jù)
(qemu) info migrate
Migration status: active
transferred ram: 52 kbytes
remaining ram: 541004 kbytes
total ram: 541056 kbytes
transferred disk: 2600960 kbytes
remaining disk: 5787648 kbytes
total disk: 8388608 kbytes
目的主機(jī) QEMU 控制臺(tái)顯示遷移完成的百分比
(qemu) Receiving block device images
Completed 28 %
- 直到動(dòng)態(tài)遷移完成,源主機(jī)的虛擬機(jī)變成 paused 狀態(tài)而目的主機(jī)上的虛擬機(jī)由 paused 狀態(tài)變成運(yùn)行狀態(tài),TOP 服務(wù)繼續(xù)運(yùn)行且沒(méi)有中斷。
- 關(guān)閉源主機(jī)的虛擬機(jī),所有服務(wù)已經(jīng)遷移到了目的主機(jī),至此遷移完成。