當前我們有一整套運行長(cháng)達5年之久的VMware,因服務(wù)器逐步報廢的原因,我們決定將所有的VMware虛擬主機遷移至OpenStack。OpenStack是采用Kolla部署的Train版本的高可用環(huán)境,Ceph為獨立部署的Nautilus版本。
當前我們需要從VMware ESXi 遷移超過(guò)220個(gè)VMware虛擬機(Linux和Windows)到OpenStack。除了VMware主機外,還有少部分的Hyper-V虛擬主機也要進(jìn)行遷移。本文將為大家演示用于遷移虛擬機的步驟和命令。通過(guò)這些步驟和命令,可以輕松創(chuàng )建自動(dòng)進(jìn)行遷移的腳本。

本次遷移僅僅涉及V2V,不涉及任何的P2V。
比較新版本的libguestfs-tools和qemu-img convert可以很好地處理VMDK文件(舊版本的工具存在一些問(wèn)題),因此遷移效率更高。遷移過(guò)程中去除了從VMDK到VMDK(單個(gè)文件)以及從VMDK到RAW 的轉換步驟。通過(guò)減少這些步驟,使遷移速度將加倍。
遷移過(guò)程中需要注意本文涉及到的命令,因為一些命令非常強大,并且可以破壞Ceph和OpenStack中的配置和數據。因此,請謹慎的使用相關(guān)的命令
全局步驟
- 安裝VirtIO驅動(dòng)程序
- 擴展分區(可選)
- 自定義虛擬機(可選)
- 創(chuàng )建Cinder卷
- 將VMDK轉換為Ceph
- 創(chuàng )建Neutron端口(可選)
- 在OpenStack中創(chuàng )建和啟動(dòng)實(shí)例
技術(shù)指標
以下是用于遷移的基礎結構的規范:
- 云平臺:OpenStack Train
- 云存儲:Ceph
- Windows實(shí)例:Windows Server 2012R2至2016
- Linux實(shí)例:RHEL5/6/7,SLES,Debian和Ubuntu
- 只能轉換來(lái)自ESXi的VMDK文件,無(wú)法使用qemu-img從VMware Player轉換VMDK文件
- 不涉及加密磁盤(pán)的遷移
- OpenStack為實(shí)例提供VirtIO半虛擬化硬件
需求
Linux“遷移服務(wù)器”(可以使用Ubuntu 14.04/16.04/18.04,CentOS6/CentOS7,Redhat6/Redhat7,Fedora19-22),同時(shí)需滿(mǎn)足以下需求:
服務(wù)器操作系統(已成功通過(guò)以下測試):
- RHEL6(RHEL7沒(méi)有“ libguestfs-winsupport”)
- Fedora 19、20、21和22
- Ubuntu 14.04,16.04和18.04
與正在運行的OpenStack環(huán)境的網(wǎng)絡(luò )連接。最好不要通過(guò)公網(wǎng)Internet,因為我們需要“超級管理員”權限。本地網(wǎng)絡(luò )連接通常比Internet連接更快。如果能保證是萬(wàn)兆網(wǎng)絡(luò )的話(huà)將會(huì )更好。
足夠的硬件性能與功能來(lái)轉換磁盤(pán)并能在KVM中運行實(shí)例(大小取決于您要在一定時(shí)間內遷移的實(shí)例,如有SSD最佳)。
我們使用的服務(wù)器配置為,8核Intel Xeon E3-1230@3.3 GHz,64 GB RAM,8塊1TB SSD,并且每小時(shí)能夠遷移超過(guò)500 GB 。但是,這實(shí)際上取決于實(shí)例磁盤(pán)空間的使用情況。我的舊公司筆記本電腦(Core i5和8GB RAM和一個(gè)舊的4500rmp HDD)也可以工作,但是顯然性能很差。
在遷移之前還要滿(mǎn)足如下需求:
- 擁有Linux遷移主機上的本地sudo(root)權限
- QEMU/KVM主機
- OpenStack的權限(通過(guò)Keystone獲取)
- 對Ceph的相應的操作權限
- 對OpenStack API和Ceph的不受限制網(wǎng)絡(luò )訪(fǎng)問(wèn)
- VirtIO驅動(dòng)程序(可從Red Hat,Fedora等主站下載)
軟件包(所有軟件包都應位于默認的發(fā)行版存儲庫中):
- python-cinderclient”(用于云盤(pán))
- python-keystoneclient”(用于向OpenStack進(jìn)行身份驗證)
- python-novaclient”(控制實(shí)例)
- python-neutronclient”(用于控制網(wǎng)絡(luò ))
- python-httplib2”(以便能夠與Web服務(wù)通信)
- libguestfs-tools”(用于訪(fǎng)問(wèn)磁盤(pán)文件)
- ibguestfs-winsupport”(應該僅在基于RHEL的系統上單獨安裝)
- libvirt-client”(控制KVM)
- qemu-img”(轉換磁盤(pán)文件)
- ceph”(將虛擬磁盤(pán)導入Ceph)
- vmware-vdiskmanager”(用于擴展VMDK磁盤(pán),可從VMware站點(diǎn)下載)
步驟
1.注入VirtIO驅動(dòng)程序
1.1 Windows Server 2012
從Windows Server 2012和Windows 8.0開(kāi)始,驅動(dòng)程序受Windows 保護。在脫機Windows磁盤(pán)中注入驅動(dòng)程序非常困難。Windows Server 2012默認無(wú)法從VirtIO硬盤(pán)啟動(dòng)。因此,我采取了以下后續步驟將VirtIO驅動(dòng)程序安裝到Windows中。請注意,這些步驟應適用于所有經(jīng)過(guò)測試的Windows版本(2008/2012/2016)。
創(chuàng )建一個(gè)新的KVM實(shí)例。確保將Windows vmdk磁盤(pán)創(chuàng )建為IDE磁盤(pán)!網(wǎng)卡應該是VirtIO設備。
添加額外的VirtIO磁盤(pán),以便Windows可以安裝VirtIO驅動(dòng)程序。
當然,您應該添加包含驅動(dòng)程序的VirtIO ISO或軟盤(pán)驅動(dòng)器。您還可以使用virt-copy-in 注入驅動(dòng)程序文件,并注入必要的注冊表設置以自動(dòng)安裝驅動(dòng)程序。
啟動(dòng)虛擬機,并給Windows大約兩分鐘時(shí)間,以找到新的VirtIO硬件。為所有新發(fā)現的硬件安裝驅動(dòng)程序。確認沒(méi)有設備沒(méi)有安裝驅動(dòng)程序。
關(guān)閉系統并卸下額外的VirtIO磁盤(pán)。
將Windows vmdk磁盤(pán)重新定義為VirtIO磁盤(pán)(這是IDE)并啟動(dòng)實(shí)例。現在應該可以正常啟動(dòng)了。關(guān)閉 虛擬機。
1.2 Linux(內核2.6.25及更高版本)
Linux 2.6.25及更高版本的內核已經(jīng)內置了對VirtIO硬件的支持。因此,無(wú)需注入VirtIO驅動(dòng)程序。 使用VirtIO硬件創(chuàng )建并啟動(dòng)新的KVM虛擬機。如果LVM分區沒(méi)有自動(dòng)安裝,請運行以下命令進(jìn)行修復:
- mount -o remount,rw /
- pvscan
- vgscan
- reboot
- (重新啟動(dòng)后,所有LVM分區都應該掛載,Linux應該可以正常啟動(dòng))
- 完成后關(guān)閉虛擬機。
- 1.3 Linux(2.6.25之前的內核)
一些Linux發(fā)行版提供了用于較舊內核版本的VirtIO模塊:
- 紅帽為RHEL 3.9及更高版本提供VirtIO支持
- SuSe為SLES 10 SP3及更高版本提供VirtIO支持
較舊內核的步驟是:
創(chuàng )建KVM實(shí)例:
Linux(內核2.6.25之前):使用IDE硬件創(chuàng )建和啟動(dòng)KVM實(shí)例(由于只能配置一個(gè)IDE 控制器而導致產(chǎn)生4個(gè)磁盤(pán),因此KVM中限于4 個(gè)磁盤(pán)!)。我沒(méi)有嘗試過(guò)SCSI或SATA,因為本次遷移中只有不超過(guò)4個(gè)磁盤(pán)的Linux虛擬機。Linux應該啟動(dòng)沒(méi)有問(wèn)題。
加載virtio模塊(特定于發(fā)行版):RHEL(舊版本):https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/ch10s04.html 和SLES 10 SP3系統:https://www.suse.com/documentation/opensuse121/book_kvm/data/app_kvm_virtio_install.html
關(guān)閉實(shí)例。
將所有磁盤(pán)更改為VirtIO磁盤(pán)并啟動(dòng)實(shí)例。現在應該可以正常啟動(dòng)了。
完成后關(guān)閉虛擬機。對于Red Hat,請參閱:https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/ch10s04.html對于SuSe,請參閱:https://www.suse.com/documentation/opensuse121/book_kvm/data/app_kvm_virtio_install.htm
1.4 Windows Server 2008(及更低版本);不推薦使用
對于2012之前的Windows版本,您還可以使用以下步驟插入驅動(dòng)程序。
將相應Windows版本的所有VirtIO驅動(dòng)程序文件復制到C:Drivers。您可以使用工具virt-copy-in將文件和文件夾復制到虛擬磁盤(pán)中。
將* .sys文件復制到%WINDIR%system32%drivers(您可能希望使用virt-ls查找正確的目錄。請注意Windows中的大小寫(xiě))。您可以使用工具virt-copy-in將文件和文件夾復制到虛擬磁盤(pán)中。
Windows注冊表應結合硬件ID和驅動(dòng)程序,但默認情況下Windows中未安裝VirtIO驅動(dòng)程序。因此,我們需要自己做。您可以使用virt-win-reg 注入注冊表文件。如果您選擇將所有VirtIO驅動(dòng)程序復制到C:Drivers以外的其他位置,則必須在最后一行更改“ DevicePath” 變量(最簡(jiǎn)單的方法是在外部Windows系統上進(jìn)行更改,然后導出注冊表文件,從而提供給遷移虛擬機使用)。
注冊表文件(也稱(chēng)為mergeviostor.reg,因為它僅保存VirtIO存儲信息):
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00000000]
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00020000]
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}"
"Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00021AF4]
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00021AF4&rev_00]
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}"
"Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1004&subsys_00081af&rev_00]
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001Servicesviostor]
"ErrorControl"=dword:00000001
"Group"="SCSI miniport"
"Start"=dword:00000000
"Tag"=dword:00000021
"Type"=dword:00000001
"ImagePath"="system32driversviostor.sys"
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion]
"DevicePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,69,00,6e,00,66,00,3b,00,63,00,3a,00,5c,00,44,00,72,00,69,00,76,00,65,00,72,00,73,00,00,00
執行完這些步驟后,Windows應從不帶BSOD的VirtIO 磁盤(pán)引導。
Windows引導時(shí),所有其他驅動(dòng)程序(網(wǎng)絡(luò ),balloon等)也應自動(dòng)安裝。
請參閱:https://support.microsoft.com/zh-cn/kb/314082 (為Windows XP 編寫(xiě),但仍可用于Windows 2003和2008)。
另請參閱:http://libguestfs.org/virt-copy-in.1.html和http://libguestfs.org/virt-win-reg.1.html
2.展開(kāi)分區(可選)
遷移的某些Windows服務(wù)器在Windows分區上的可用磁盤(pán)空間有限。沒(méi)有足夠的空間來(lái)安裝新的管理應用程序。所以,可以使用用vmware-vdiskmanager工具,以增加磁盤(pán)的大小。然后,您仍然需要從操作系統擴展分區。您可以在下一步中自定義虛擬機時(shí)執行此操作。
3.自定義虛擬機(可選)
要準備在OpenStack中運行的操作系統,您可能需要卸載某些軟件(例如VMware Tools和驅動(dòng)程序),更改密碼并安裝新的管理工具等。您可以通過(guò)編寫(xiě)腳本來(lái)自動(dòng)執行此操作。您應該能夠使用virt-copy-in命令將腳本和文件注入虛擬磁盤(pán)。
3.1在Linux中自動(dòng)啟動(dòng)腳本
由于只有幾個(gè)Linux服務(wù)器需要遷移,因此我在Linux中手動(dòng)啟動(dòng)了腳本。而且很容易就做到了自動(dòng)化。
3.2在Windows中自動(dòng)啟動(dòng)腳本
可以選擇RunOnce方法在Windows啟動(dòng)時(shí)啟動(dòng)腳本,因為該方法適用于所有Windows版本。您可以 通過(guò)注入注冊表文件將腳本放入RunOnce。僅當用戶(hù)登錄時(shí)才運行RunOnce腳本。因此,還應該注入Windows 管理員的用戶(hù)名,密碼,并將AutoAdminLogon設置為'1'。當Windows啟動(dòng)時(shí),它會(huì )自動(dòng)登錄的用戶(hù)定義。完成后,請確保關(guān)閉虛擬機。
自動(dòng)登錄Windows(使用用戶(hù)“ Administrator”和密碼“ Password”)并啟動(dòng)C:StartupWinScript.vbs的示例注冊表文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce]
"Script"="cscript C:StartupWinScript.vbs"
"Parameters"=""
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon]
"AutoAdminLogon"="1"
"UserName"="Administrator"
"Password"="Password"
4.創(chuàng )建Glance鏡像
當前OpenStack平臺使用Ceph作為存儲、鏡像后端。如果創(chuàng )建云主機希望通過(guò)從鏡像的方式啟動(dòng)而不是云盤(pán)的方式啟動(dòng)的話(huà),那么鏡像上傳需要通過(guò)glance-api。我們在vMware上的云主機,系統盤(pán)數據大小約為200G。不管是作為上傳體積較大的raw或者qcow2鏡像,由于要經(jīng)過(guò)glance-api上傳,速度會(huì )比較慢,此時(shí)可以采用先上傳到Ceph,再在glance中create的方式,因為連接到Ceph后端的通常是萬(wàn)兆光口,上傳速度會(huì )很快:
具體步驟如下:
生成隨機uuid,作為鏡像id
uuid=$(uuidgen)
通過(guò)rbd的方式上傳鏡像,同時(shí)添加相應的快照與快照保護
rbd -p images --image-format 2 import image_file $uuid
rbd -p images snap create --snap snap $uuid
rbd -p images snap protect --snap snap $uuid
glance創(chuàng )建鏡像,同時(shí)與rbd鏡像進(jìn)行關(guān)聯(lián)
glance image-create --os-image-api-version 1 --id $uuid --name image_name --disk-format raw --container-format bare --is-public false --location rbd://$(ceph fsid)/images/$uuid/snap
5.創(chuàng )建Cinder卷
對于要導入的每個(gè)磁盤(pán),您需要創(chuàng )建一個(gè)Cinder卷。Cinder命令中指定的卷大小并不重要,因為下一步我們將刪除(并通過(guò)ceph直接導入的方式重新創(chuàng )建)Ceph塊設備。我們僅創(chuàng )建cinder卷以創(chuàng )建Cinder和Ceph 之間的鏈接。
但是,您應該使卷大小與計劃導入的磁盤(pán)相同。這對于擁有OpenStack管理界面(Horizon)用戶(hù)來(lái)說(shuō),操作很簡(jiǎn)單。
使用以下命令創(chuàng )建一個(gè)cinder卷(大小以GB為單位,您可以通過(guò)cinder type-list檢查可用的卷類(lèi)型):
cinder create --display-name <name_of_disk> <size> --volume-type <volumetype>
注意卷ID(您也可以使用以下命令找到卷ID ),因為下一步需要使用這些ID。
cinder list | grep <name_of_disk>
Cinder命令信息:http://docs.openstack.org/cli-reference/content/cinderclient_commands.html
6.將VMDK轉換為Ceph
一旦創(chuàng )建了Cinder卷,就可以將VMDK磁盤(pán)文件轉換為RBD塊(Ceph)。但是首先我們需要刪除實(shí)際的Ceph 磁盤(pán)。請確保刪除正確的Ceph塊設備!
首先,您應該知道磁盤(pán)駐留在哪個(gè)Ceph池中。然后從Ceph中刪除該卷(volume-id是您在上一步“創(chuàng )建Cinder卷”中記錄的卷ID ):
rbd -p <ceph_pool> rm volume-<volume-id>
下一步是將VMDK文件轉換為Ceph上的卷(所有ceph的參數都是為了更好的性能。vmdk_disk_file變量是vmdk文件的完整路徑。volume-id**是您之前記下的ID)。
qemu-img convert -p <vmdk_disk_file> -O rbd rbd:<ceph_pool>/volume-<volume-id>
對虛擬機的所有虛擬磁盤(pán)執行此操作。
小心!rbd命令非常強大(可能會(huì )破壞Ceph上比預期更多的數據,請謹慎使用)!
7.創(chuàng )建Neutron端口(可選)
在某些情況下,您可能需要設置固定的IP地址或MAC地址。您可以通過(guò)使用neutron創(chuàng )建端口并在下一步中使用該端口(在OpenStack中創(chuàng )建和啟動(dòng)實(shí)例中進(jìn)行關(guān)聯(lián))來(lái)實(shí)現。您首先應該知道network_name是什么(nova net-list),需要使用“ Label”。僅network_name是必需的。您還可以通過(guò)添加來(lái)添加安全組。
--security-group <security_group_name>
為每個(gè)安全組添加此參數,因此,如果要添加6個(gè)安全組,則應添加此參數6次。
neutron port-create --fixed-ip ip_address=<ip_address> --mac-address <mac_address> <network_name> --name <port_name>
注意neutron端口的ID,下一步將需要它。
8.在OpenStack中創(chuàng )建并啟動(dòng)實(shí)例
現在,我們已經(jīng)準備就緒,可以使用Cinder卷和可選的neutron端口創(chuàng )建實(shí)例。注意啟動(dòng)磁盤(pán)的卷ID。現在,您只需要知道要選擇的flavor的ID。運行nova flavor-list,以獲取所所需要flavor的flavor ID。
現在,您可以創(chuàng )建并啟動(dòng)新實(shí)例:
nova boot <instance_name> --flavor <flavor_id> --boot-volume <boot_volume_id> --nic port-id=<neutron_port_id>
注意實(shí)例ID。現在,通過(guò)執行此命令來(lái)添加實(shí)例的其他磁盤(pán)(如果要添加其他卷):
nova volume-attach <instance_ID> <volume_id>
總結
遷移過(guò)程中可能會(huì )出現失敗的情況,尤其是windows。錯誤版本的驅動(dòng)程序極易導致windows系統藍屏,所以正確的安裝驅動(dòng)非常重要。對于較大的數據盤(pán),本案例是使用直接上傳到ceph中,替換掉相同大小的空卷,如果通過(guò)鏡像glance的方式上傳,然后創(chuàng )建云盤(pán),那么會(huì )多花幾倍的時(shí)間。所以合理以及靈活的使用Ceph能大大加快遷移的速度。
本文主要講解了操作的流程,如果是批量操作的話(huà),完全可以寫(xiě)成對應的編排腳本,進(jìn)行批量遷移。腳本運行之前一定要充分測試。