2013年2月11日 星期一

虛擬機器轉移(V2V) : Windows 2003從VirtualBox到KVM

image

跟前幾篇講實體機器虛擬化(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硬碟格式

200px-Vmware.svg

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

image

因此簡單的想法,就是利用VirtualBox製作vmdk硬碟檔,再把它放到KVM環境中運作。

題外話,我寫這篇的時候才發現原來VirtualBox也支援建立了KVM主要用的虛擬機器硬碟格式QEMU增強硬碟,不過我想即使用QEMU來建立虛擬機器,轉移Windows 2003的時候依然會出現以下的問題。

Windows 2003的V2V步驟

經過了幾次失敗的嘗試之後,我參考了Alex寫的Converting Windows VMWare machines to KVM,將目前看來可行的作法整理如下。步驟中會用到兩個名詞:來源端是指VirtualBox虛擬機器,目的端則是指KVM虛擬機器。

1. 來源建立虛擬機器時用vmdk

image

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

image

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

2. 來源端使用mergeide.reg

2013-02-11_142222

如果你的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. 來源端完全關機

image

接著要把來源端電腦完全關機。不能只是儲存機器狀態喔,必須是完全關機。

4. 目的端建立新的虛擬機器

image

本篇使用的目的端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

image

設置完成,請注意Proxmox VE自動配給的VMID,在此是158。

5. 來源端vmdk傳送到目的端

2013-02-11_145222

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

/var/lib/vz/images/158

請將來源端的vmdk上傳到該路徑底下吧。

6. 目的端替換硬碟

image

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

image

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

image

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

image

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

image

vmdk插上KVM的虛擬機器囉。

7. 目的端關閉KVM功能

image

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

2013-02-11_161833

如果沒有做這個選項的話,目的端開機時會遇到「INTERNAL_POWER_ERROR」或其他各種問題的藍色當機畫面。

我找到現在仍不知道開關Disable KVM的意義何在。就連Griffon的Blog也是教說關掉KVM就好,目前也只能照做囉。

8. 目的端開機、檢查是否順利運作

image

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

image

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

image

順利的話,就進入Windows 2003囉。


結語:不要被藍白當機畫面打擊士氣了!

Image 11

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

6 意見:

  1. Elegant Tsai 提到...

    不好意思,借這篇發問
    請問布丁 該如何在blogger裡創建一個版主獨字的留言板呢?
    也就是自己的嘀咕之類的,別人沒辦法留言,只有自己可以留
    看您好像有研究Blogger,所以來問一問 ^^

  2. Pulipuli Chen 提到...

    To Elegant Tsai:

    網誌設定裡面調整:
    設定
    > 基本
    > 網誌讀者
    > 僅網誌作者
    https://lh4.googleusercontent.com/-7GNn5_aAlhA/URpUiGZZpiI/AAAAAAAAsYY/-d-MBk2BHeE/s0/2013-02-12_22-40-56.png

    布丁布丁吃什麼有專用的讀者留言板,不是跟特定文章相關的討論都在那邊進行會比較好,請看右邊導覽列:
    https://www.blogger.com/comment.g?blogID=16607461&postID=113544406852218769

  3. Elegant Tsai 提到...

    不好意思,是我表達的不清楚,
    我的意思是我想讓別人看到我的Blogger,但我可以新增一個網頁(Blogger的功能)然後這個網頁裡別人看的到我的留言,但別人無法留言,換句話說:只有我可以留言,不知道可以實現這種方法嗎?
    謝謝您的回覆 ^^

  4. Pulipuli Chen 提到...

    To Elegant Tsai:

    https://lh6.googleusercontent.com/-FR3-tWYLArQ/URx5n9zKkZI/AAAAAAAAsi0/NPrTWTxzYD0/s0/2013-02-14_13-43-42.png
    新文章
    -> 你的留言你就寫在blog內文吧
    -> 禁止讀者留言

  5. Neozeed 提到...

    Always happy to help someone migrate to Proxmox/ve (Linux KVM)!

    Oh and I'll be in Hong Kong next week, I can't wait!

  6. Pulipuli Chen 提到...

    To Neozeed:

    Thank you.
    Have a wonderful travel!

張貼留言