
在多種虛擬機格式之間,VMDK 可以說是最廣泛支援的格式,過去我經常做 V2V 例如 VirtualBox、ESXi、Proxmox VE 之間的轉換,即常用 VMDK 格式進行處理。
例如,協助客戶導入開源軟體應用系統時,可以先在我自己的 Proxmox VE 或 VirtualBox 裡將虛擬機建置完成,再將虛擬機轉出 VMDK 檔案帶去客戶端匯入,節省現場建置的時間。
問題來了
在過去的時代,我只要使用 Proxmox VE 所內建的 qemu-img 工具即可輕鬆轉換格式,若是在 Windows 裡也可以下載 for Windows 的版本使用。
常用的轉換指令如下:
VMDK 轉為 QCOW2
qemu-img convert -f vmdk disk.vmdk -O qcow2 disk.qcow2
QCOW2 轉為 VMDK
qemu-img convert -f qcow2 disk.qcow2 -O vmdk disk.vmdk
VMDK 轉為 RAW
qemu-img convert -f vmdk disk.vmdk -O raw disk.raw
RAW 轉為 VMDK
qemu-img convert -f raw disk.raw -O vmdk disk.vmdk
VDI 轉為 VMDK
qemu-img convert -f vdi disk.vdi -O vmdk disk.vmdk
VHD 轉為 VMDK
qemu-img convert -f vpc disk.vpc -O vmdk disk.vmdk
一直以來都這麼使用,轉換到 ESXi 上輕鬆寫意,但自從 6.5 橫空出世以後,事情就再也不單純了,更何況接下來的 6.7。
不管是經 qemu-img 轉換而來的 VMDK,或是 VirtualBox 製作出來的 VMDK,只要丟進 ESXi 6.5 以上都會發生錯誤,錯誤的類型有相當多,以下是其中一種情況。

這一種情況,通常進入 [設定],將 [控制器設定] 由 [SCSI 控制器 0] 修改為 [IDE 控制器 0] 即可開機。

雖然可以開機,但使用 IDE 模式並不是最理想的選擇,因為在效能上差異不小,我想這是絕大多數 IT 人員所無法忍受的事。
解決方法一
遇到無法以 SCSI 開啟虛擬機電源時,最簡單的方法是用 vi 或 nano 編輯器打開 VMDK 檔,將其中的這個區段做修改:
ddb.adapterType = "ide"
修改為
ddb.adapterType = "lsilogic"
或是使用 qemu-img 轉換時,增加參數 adapter_type、subformat 與 compact6
增加轉換參數
qemu-img convert
-f qcow2 disk.qcow2
-O vmdk
-o adapter_type=lsilogic,subformat=streamOptimized,compact6
disk.vmdk
解決方法二
但我們還有遇到某些情況,修改後還是有 無法匯入 或是 無法開機 等各種情況,例如:


經過朋友的測試結果,他提出一個解決辦法:
使用 VMware Workstation Pro 14 以上的版本開啟 VMDK 後再轉存。
在轉換之前,順帶提一下「Virtual Hardware Version」版本的對應,參考下面這個對照表就可以得知該選用什麼版本,主要應該要讓 Virtual Hardware Version 的版本號在 13 以上。

雖然這個方法他說可行,但我沒有購買 VMware Workstation Pro 14 版本,也不想使用試用版,所以繼續考慮其它方案。
解決方案三
在找尋相關工具的過程中,找到了一套功能完整的磁碟格式轉換工具軟體,而且提供免費版本。

StarWind V2V Converter 支援的格式不少,舉凡 VHD/VHDX、VMDK、QCOW2 以及 IMG/RAW 都在列,而且標榜支援 Hyper-V、ESXi、KVM,以免費軟體的等級來說已經相當驚人。
從 9.0.0.75 版開始,已經能夠支援至 VMware 6.5 與 6.7 格式,經過測試確實沒問題,只是選項上需要注意選擇方式。
他有一個非常方便的功能,可以直接邊轉換邊丟到 ESXi 伺服器上,甚至可以勾選轉換完成後直接附掛到指定的虛擬機上,但在我的測試下容易會失敗。

改變作法後,再經多次測試出可以用的組合,請來源與目的都選用 Local File 項目,格式均為 VMDK。



當轉換完成後,即可將相關 VMDK 檔上傳至 ESXi 伺服器進行使用。
請注意,轉出的 disk.vmdk、disk-flat.vmdk 兩個檔案都要上傳,而且要放置到該虛擬機所屬的 datastore 目錄下。
下圖是來自 VirtualBox/VirtualPC,原格式為 VHD 的虛擬機,經過轉檔後置入 ESXi 6.7 上運作的測試案例。

下圖是來自 Proxmox VE,原格式為 QCOW2 的虛擬機,經過轉檔後置入 ESXi 6.7 上運作的測試案例。

使用 QCOW2 說明
若要以 StarWind V2V Converter 將來自於 Proxmox VE 的 QCOW2 直轉為 VMDK 給 ESXi 使用,要有前置作業先以 qemu-img 將 QCOW2 轉換為 VMDK,否則會遇到這個情況:

這個問題主因在於 Proxmxo VE 使用的 QCOW2 版本是 1.1,而 StarWind V2V Converter 支援的是 0.10 所致。
預先用工具轉為 VMDK 再給 StarWind V2V Converter 轉換,可以減少這個困擾。
或是用 qemu-img 把 QCOW2 給降版也是可行。
QCOW2 1.1 降轉為 0.10 版本
qemu-img amend -f qcow2 disk.qcow2 -O qcow2 -o compat=0.10 disk.qcow2
註:
既然都要轉檔了,就乾脆直接 qemu-img 轉 VMDK,完成後再讓 StarWind V2V Converter 轉成 ESXi 適用的 VMDK 就好啦!
最後一招
若遇到的情況是無論如何都無法把 VMDK 讓 ESXi 掛到虛擬機器上,還有最後一招可以使用,這招效率最差也最麻煩,但我在某次專案裡真的用上了。
來源端
- 在虛擬機裡用 DD 把磁碟 dump 成一個 RAW 檔
- 用 GZIP 進行壓縮,以免檔案過大
- 把這個 RAW.GZ 寫進一個 ISO 檔裡面
- 提供兩個 ISO 檔到目的機,一個是內含 RAW.GZ 的,另外一個是 Clonezilla
目的端
- 把兩個 ISO 檔都掛載到 ESXi 裡的虛擬機器上
- 用 Clonezilla 開機,並進到指令行模式
- 使用指令將第二個 ISO 檔裡的 RAW.GZ 寫進 VM 的磁碟
- 搞定
指令碼
匯出磁碟指令
dd if=/dev/sda | gzip > disk.raw.gz
寫入磁碟指令
gzip -dc disk.raw.gz | dd of=/dev/sda
參考
- qemu-img 指令用法
https://linux.die.net/man/1/qemu-img - qemu-img for Windows
https://cloudbase.it/qemu-img-windows/ - 将虚拟 IDE 磁盘转换为虚拟 SCSI 磁盘
https://kb.vmware.com/s/article/2089439 - Virtual machine hardware versions
https://kb.vmware.com/s/article/1003746 - VMware Virtual Disk (VMDK) format specification
https://github.com/libyal/libvmdk/blob/master/documentation/VMWare%20Virtual%20Disk%20Format%20(VMDK).asciidoc - StarWind V2V Converter
https://www.starwindsoftware.com/starwind-v2v-converter

