在多種虛擬機格式之間,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 以上。
Virtual Hardware Version 對照表
雖然這個方法他說可行,但我沒有購買 VMware Workstation Pro 14 版本,也不想使用試用版,所以繼續考慮其它方案。
解決方案三
在找尋相關工具的過程中,找到了一套功能完整的磁碟格式轉換工具軟體,而且提供免費版本。
從 9.0.0.75 版開始,已經能夠支援至 VMware 6.5 與 6.7 格式,經過測試確實沒問題,只是選項上需要注意選擇方式。
他有一個非常方便的功能,可以直接邊轉換邊丟到 ESXi 伺服器上,甚至可以勾選轉換完成後直接附掛到指定的虛擬機上,但在我的測試下容易會失敗。
直接轉換 VMDK 並傳輸至 ESXi 6.7 失敗
改變作法後,再經多次測試出可以用的組合,請來源與目的都選用 Local File 項目,格式均為 VMDK。
在選擇 VMDK 格式的畫面,請選擇 ESXi Server Image。
當轉換完成後,即可將相關 VMDK 檔上傳至 ESXi 伺服器進行使用。
請注意,轉出的 disk.vmdk、disk-flat.vmdk 兩個檔案都要上傳,而且要放置到該虛擬機所屬的 datastore 目錄下。
下圖是來自 VirtualBox/VirtualPC,原格式為 VHD 的虛擬機,經過轉檔後置入 ESXi 6.7 上運作的測試案例。
順利啟動的 Windows XP 虛擬機
下圖是來自 Proxmox VE,原格式為 QCOW2 的虛擬機,經過轉檔後置入 ESXi 6.7 上運作的測試案例。
順利啟動的 Windows Server 2008 虛擬機
使用 QCOW2 說明
若要以 StarWind V2V Converter 將來自於 Proxmox VE 的 QCOW2 直轉為 VMDK 給 ESXi 使用,要有前置作業先以 qemu-img 將 QCOW2 轉換為 VMDK,否則會遇到這個情況:
QCOW2 轉換失敗
這個問題主因在於 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