
跟前幾篇講實體機器虛擬化(Physical-to-Virtual,P2V)不同,這一篇要講的是虛擬機器(VirtualBox 4.2.6)轉移到另一種虛擬機器(Proxmox VE 1.9底下的KVM)的過程,亦即所謂的虛擬機器轉移(Virtual-to-Virtual,V2V,或是遷移migration)。這次轉移的客體作業系統(Guest OS)是Winodws 2003,儘管只是把VirtualBox上製作的VMDK虛擬機器硬碟映像檔換到KVM執行,但還是有很多細節需要注意。以下記錄大致上的過程供大家參考。
為什麼要做V2V?
目前我常用的免費虛擬機器技術有兩種:適合工作站使用的VirtualBox,以及適合伺服器用的KVM。
我常常在自己的電腦用VirtualBox安裝作業系統來進行各種測試,VirtualBox可以調整的參數多、網路設定也很方便,操作起來很容易。另一方面,我會將開發到穩定狀態、不太需要常常修改的系統放置到Proxmox VE的KVM上,讓系統提供服務就好,我們平常就不太再去更動作業系統的基層設定。
從VirtualBox到KVM這之間的轉換,就需要V2V的協助。
V2V作法概述:利用共同支援vmdk硬碟格式

多虧於VMware如此盛行,VMware制定的vmdk(Virtual Machine Disk,虛擬機器硬碟映像檔)幾乎成為了各家虛擬機器爭相支援的對象,這包括了VirtualBox與KVM。

因此簡單的想法,就是利用VirtualBox製作vmdk硬碟檔,再把它放到KVM環境中運作。
題外話,我寫這篇的時候才發現原來VirtualBox也支援建立了KVM主要用的虛擬機器硬碟格式QEMU增強硬碟,不過我想即使用QEMU來建立虛擬機器,轉移Windows 2003的時候依然會出現以下的問題。
Windows 2003的V2V步驟
經過了幾次失敗的嘗試之後,我參考了Alex寫的Converting Windows VMWare machines to KVM,將目前看來可行的作法整理如下。步驟中會用到兩個名詞:來源端是指VirtualBox虛擬機器,目的端則是指KVM虛擬機器。
1. 來源建立虛擬機器時用vmdk

就如前面所說,這篇V2V是利用共同支援的虛擬機器硬碟格式vmdk,所以建立VirtualBox虛擬機器時請選擇VMDK。

硬碟大小其實只要符合作業系統最低需求即可,不過有趣的地方在於,似乎因為VMware建立vmdk預設的大小都是8GB,所以許多Virtual Appliance都是8GB。在這邊我們也參考一下傳統,設成8GB。
2. 來源端使用mergeide.reg

如果你的Windows 2003是裝在IDE控制器上,那麼第一個步驟就是使用mergeide.reg(免空、Box.net)。請下載這個檔案,然後在來源虛擬機器中執行(如上圖),調整虛擬機器的登錄檔即可。
mergeide.reg是來自於Alex教學中的一個登錄檔,但是連Alex也不知道原作者是誰。在此我也要感謝這位作者的提供,他的mergeide.reg真的幫了我們很大的忙。
以下是mergeide.reg的檔案內容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\primary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\secondary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\*pnp0600]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\*azt0502]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\gendisk]
"ClassGUID"="{4D36E967-E325-11CE-BFC1-08002BE10318}"
"Service"="disk"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#cc_0101]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_0e11&dev_ae33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1039&dev_0601]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1039&dev_5513]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1042&dev_1000]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_105a&dev_4d33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0640]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1097&dev_0038]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0001]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0150]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5215]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5219]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5229]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1106&dev_0571]
"Service"="pciide"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1222]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1230]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2411]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2421]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7111]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7199]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
;Add driver for Atapi (requires atapi.sys in drivers directory)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\atapi]
"ErrorControl"=dword:00000001
"Group"="SCSI miniport"
"Start"=dword:00000000
"Tag"=dword:00000019
"Type"=dword:00000001
"DisplayName"="Standard IDE/ESDI Hard Disk Controller"
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
52,00,49,00,56,00,45,00,52,00,53,00,5c,00,61,00,74,00,61,00,70,00,69,00,2e,\
00,73,00,79,00,73,00,00,00
;Add driver for intelide (requires intelide.sys in drivers directory)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IntelIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000004
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6e,00,74,00,65,00,6c,00,69,\
00,64,00,65,00,2e,00,73,00,79,00,73,00,00,00
;Add driver for pciide (requires pciide.sys and pciidex.sys in drivers directory)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PCIIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000003
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
52,00,49,00,56,00,45,00,52,00,53,00,5c,00,70,00,63,00,69,00,69,00,64,00,65,\
00,2e,00,73,00,79,00,73,00,00,00
3. 來源端完全關機

接著要把來源端電腦完全關機。不能只是儲存機器狀態喔,必須是完全關機。
4. 目的端建立新的虛擬機器

本篇使用的目的端KVM是透過Proxmox VE 1.9來控管,這邊我們先建立一個新的虛擬機器。以下是需要注意的參數:
- Type: Fullyvirtualized (KVM)
- Image Format: vmdk
- DIsk space (GB): 8 (同來源端)
- Disk type: IDE (同來源端)
- Memory (MB): 256 (同來源端)
- Guest Type: Windows 2003

設置完成,請注意Proxmox VE自動配給的VMID,在此是158。
5. 來源端vmdk傳送到目的端

接下來就要把來源端的vmdk硬碟檔案傳送到目的端伺服器上。Proxmox VE在配置KVM虛擬機器時都有規定好的路徑,如果VMID為158,那麼158的虛擬機器硬碟檔案就放在以下路徑:
請將來源端的vmdk上傳到該路徑底下吧。
6. 目的端替換硬碟

當vmdk上傳到目的端的指定路徑之後,我們切換到Hardware這一頁,你會發現剛剛上傳的vmdk已經在下面列表了。

接著我們先移除原本的硬碟,按下原本硬碟左邊的紅色向下鍵頭按鈕
,它會跳出DELETE選單。按下去之後,原本的硬碟會從虛擬機器上拔除,但是檔案還是在Proxmox VE裡面喔。

然後按下Hardware device list for VM 158左邊的紅色下向箭頭
,點下「Add a hard disk」。

從Existing Disks選擇剛剛上傳的vmdk,然後按下add按鈕。

vmdk插上KVM的虛擬機器囉。
7. 目的端關閉KVM功能

切換到Options這一頁,然後在Disable KVM這選項後面打鉤,按下save儲存。(感謝來自neozeed的教學)

如果沒有做這個選項的話,目的端開機時會遇到「INTERNAL_POWER_ERROR」或其他各種問題的藍色當機畫面。
我找到現在仍不知道開關Disable KVM的意義何在。就連Griffon的Blog也是教說關掉KVM就好,目前也只能照做囉。
8. 目的端開機、檢查是否順利運作

回到Status,按下「Start」按鈕。

然後再按下Open VNC console,來看看虛擬機器現在的狀況。

順利的話,就進入Windows 2003囉。
結語:不要被藍白當機畫面打擊士氣了!

這個藍白畫面是我在這次V2V過程中最常看到的景象,實在是非常無奈。我想到頭來還是Windows 2003綁定硬體,導致VirtualBox的IDE控制器轉換到KVM上的時候不合所導致的。出現這種藍白當機畫面,大多都是硬體上的問題。只是在不知道解法的時候總是會很無奈。希望這篇記錄的方法可以幫助大家在做V2V更加順利啊。
(more...)
Comments