把 HyperV 的 VHDX 複製到 USB 進行 Native Boot

| | 0 Comments| 11:24
Categories:

VHDX 是微軟 Windows 內建的 Hyper-V 虛擬機器的虛擬磁碟檔案,它代表的基本上就是一顆虛擬的硬碟。

不過,虛擬機器雖然很方便,但是在硬體的存取上,還是會有些限制,像 Heresy 這邊要測試 OpenGL 的程式,就不能透過 Hyper-V 來進行(有的虛擬機器倒是可以了);微軟後來其實也有設計,讓 VHD 可以直接拿來原生開機(Native Boot),讓他可以不需要透過虛擬機器來開啟、變身為原生的系統。

這部分的說明,可以參考微軟的《Deploy Windows with a VHDX (Native Boot)》一文。

在 Heresy 來看,虛擬硬碟拿來直接開機,最大的好處,應該是:

  1. 不影響原有系統,不需要額外的硬碟、也不需要額外的分割區
  2. 單一檔案,方便備份、佈署(雖然檔案很大)

而如果搭配 USB 裝置的話,理論上也可以簡單地在多台電腦間交叉測試。

要這樣玩的話,基本上可以參考微軟官方的《Boot to a virtual hard disk: Add a VHDX or VHD to the boot menu》一文。

他這邊的教學,是連 vhdx 都使用指令來建置,如果是透過 Hyper-V 建立好虛擬電腦的情況下,理論上是可以更簡單地來進行。

不過,VHDX 基本上有三種類型:固定大小、動態擴充、差異。

這邊基本上是建議抓大一點的容量、使用「固定大小」這種類型。雖然會浪費一些空間,但是碰到的問題應該會比較少;像是 Heresy 使用「動態擴充」的時候,在開機的時候是會出現空間不足的錯誤、而無法完成開機的。


在已經有一個安裝好 Windows 10 的 vhdx 檔案的情況下,如果要讓他可以直接在本機上,透過開機選單來切換 native boot 的話,可以透過 bcdedit 這個命令,把它加入 Windows 10 的開機設定中。

要進行這邊的操作,要先開啟一個有系統管理員權限命令提示字元(最快的方法是壓住 Win 鍵後按 X,然後放開再按 A)。

Windows 10 1703 後,這樣教出來的可能會是 PowerShell,如果是的話,要先執行「cmd」這個指令,停用 PowerShell 的指令、關鍵字功能。

然後,可以先執行「bcdedit」(官方文件),來檢查目前的開機設定。(這部分可以跳過)

之後,則是:

  1. 複製目前預設的開機選項。這邊的指令是:

    bcdedit /copy {default} /d "VHD OS"

    其中,黃字的「VHD OS」是會出現在開機選單的文字,可以自行修改。

    正確執行的話,他應該會出現類似下面的訊息:

    已順利將項目複製到 {729ab474-534c-11e8-b705-8b5f2bef97fe}。

    其中綠色的字串就是這個開機設定的名稱,他會是系統產生的,每次都會不一樣。

  2. 接下來,則是要修改新的開基項目,把「osdevice」設定為指定的 vhdx 檔。這邊的指令是:

    bcdedit /set {729ab474-534c-11e8-b705-8b5f2bef97fe}
             osdevice vhd=[D:]Win10.vhdx

    上面的指令是一行,這邊只是為了方便顯示,才把他斷行的。

    其中,綠色的字串就是第一步驟的結果,而紅色的部分,則是 vhdx 檔所在的位置;這邊比較特別的是,磁碟代號要用中括號包住。

這樣執行後,理論上就算完成了。實際執行的螢幕畫面,大概會像下圖:

之後可以再執行「bcdedit」來確認結果,或是執行「msconfig」,切換到「開機」,應該也可以看到新加入的「VHD OS」。

而之後重開機,理論上就會看到開機選單,可以選要開到本來的系統,還是新加入的「VHD OS」了!

之後如果要刪除的話,也只要在 msconfig 裡面把「VHD OS」刪除就可以了。

由於之前「VHD OS」是用 Hyper-V 的虛擬機器安裝的,所以第一次開,他會要去重新偵測系統硬體、安裝驅動程式,時間會比較久,不過之後應該就會和正常的系統一樣了~


如果要轉移到 USB 外接硬碟上,讓他可以到處裝呢?

首先,這邊要先提醒一下,USB 外接裝置的速度影響應該會很大。Heresy 最初是想直接把牠放到 USB 3.0 的隨身碟上,但是玩了兩三次,雖然可以開機,但是都會一直維持在磁碟低速、連續存取的狀態中…結果就是整個系統慢到幾乎不能動。 orz

最後,Heresy 是把它複製到外接的 M.2 SATA 上,才算是能順暢地使用。所以看來要外接的話,應該是會有比較高的門檻的…

而要讓一個 USB 儲存裝置可以開機的話,Heresy 這邊是讓他有一個主要分割區,採用 NTFS 格式;之後可以透過「bcdboot」這個指令來進行:

bcdboot c:windows /s j:

這邊的「c:windows」是代表開機系統檔案的來源,「j:」則是 USB 儲存裝置的磁碟代號。

這邊可以直接用「c:windows」,主要應該是同樣都是 Windows 10,如果兩個系統不同,可能就不能這樣玩了?

執行完「bcdboot」後,在 J: 底下會多出一個「EFI」的資料夾(這邊是採用 UEFI 開機,如果不是的話,資料夾名稱似乎會是「boot」),裡面就是開機系統的檔案了。

而之後,則是透過 bcdedit,來修改裡面的設定,讓他去讀取指定的 vhdx 檔案。這邊找到的範例,是去修改「device」和「osdevice」兩個項目,其指令如下:

bcdedit /store j:efimicrosoftbootBCD /set {default} device vhd=[locate]win10.vhdx
bcdedit /store j:efimicrosoftbootBCD /set {default} osdevice vhd=[locate]win10.vhdx

這邊是先透過「/store」這個參數,來指定要修改的 BCD 檔(黃字的部分),如果要測試,可以先執行

bcdedit /store j:efimicrosoftbootBCD

來確認 BCD 檔是否正確。

而紅字則就是複製到 USB 裝置根目錄下的 VHDX 檔了。這邊的「[locate]」應該也是 bcdedit 的內建關鍵字了。

理論上,這樣完成後,這個 USB 儲存裝置,就可以拿來開機了~而如果要備份當下的系統狀態的話,也就只要把整個 VHDX 複製一分就可以了。


這個方法目前碰到的問題,是當有兩顆硬碟都有 Windows Boot Manager 的情況下,似乎會有一些詭異狀況?目前有碰到的:

  • 當實體電腦上有透過 bcdedit 加入開機選單的情況下,似乎沒辦法從 USB Boot?
    • 自己測試,基本上開機選單只顯示內建硬碟上的選單
  • 在這樣的情況下編輯,似乎還有可能改錯東西…
    • 本來想用 msconfig 把內建硬碟的 VHD 開機刪除,結果 USB 上的也只剩一個了…

感覺上,微軟針對系統內存在多個 Windows Boot Manager 的狀況,似乎不算處理得很好…

所以,這邊看來最好是用 bcdedit 的「/export」來做備份,再用「/import」來備份會比較好。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *