建立可重複使用的虛擬機器(Hyper-V)硬碟檔案(VHD)


Posted by 江馬特 on 2024-11-17

前言

剛開始試著用虛擬機器開發的時候,在好幾個機器間連線的環境,模擬的方式就是裝著一台又一台的機器,再一步步建立成想要的樣子。但是每次這樣做就有長時間在等待 OS 裝完,一次又一次的等待下,就會很懷疑有沒有更好的方式來加速這個流程,所以這一篇就是整理如何建立一個已經安裝好 OS 的硬碟檔案,讓 Lab 環境可以更快速的建立。

環境

  1. Host - Windows11 Pro 23H2

前置準備

安裝一台裝好的虛擬機器,可以參考先前寫過的文章:使用 powershell 建立 hyper-v 的虛擬機器(windows11) (說的坑就是這樣堆疊起來的,這其實算是個系列文?XD)

流程

安裝 windows

再怎麼樣都還是要有這一次製作主要磁碟的動作,就乖乖等待吧

稍後圖

命令提示字元輸入指令

cd c:\Windows\System32\Sysprep  
sysprep /oobe /mode:vm /shutdown

在開始各種花花綠綠的畫面時(例如選擇時區或語系之類的地方),鍵盤按下shift+F10就可以叫出 CMD 視窗了

完成

其實做到這就差不多做完,可以把虛擬機刪除,留下 VHD 硬碟檔,如果要建立新的虛擬機器,就是複製這個 VHD 硬碟檔,建立虛擬機的時候選擇複製的 VHD 檔案就可以了,開機的時候就會進到 windows 的 OOBE 畫面

差異硬碟

知道怎麼使用 VHD 檔案來建立虛擬機後,最後補充一點進階用法,建立一個差異硬碟,並指定父碟為剛才建立的 VHD

New-VHD "{vhd檔案路徑}" -ParentPath "{父碟路徑}" -Differencing

建立VHD

再來就是建立新的虛擬機器,並且選擇新建立的 VHD 來用就可以了

由於是差異硬碟,就不會像複製出來的整個 VHD 來使用這麼大,對於硬碟空間有要求的人比較友善~XD

當然是可以用 GUI 建立更簡單,但這裡就不特別標示常見的做法了

修改一下先前文章的內容,一樣搭配 powershell 來建立新的虛擬機器

$VMName = "{虛擬機器名稱}"  

# 建立差異碟  
New-VHD "{vhd檔案路徑}" -ParentPath "{父碟路徑}" -Differencing  

# 建立虛擬機器  
New-VM -Name $VMName -MemoryStartupBytes 8GB -Generation 2 -Path "{放虛擬機的資料夾}"  
# 將差異碟掛載到虛擬機上  
Add-VMHardDiskDrive -VMName $VMName -Path "{vhd檔案路徑}"  

# 設定CPU個數  
Set-VMProcessor -VMName $VMName -Count 10 -CompatibilityForMigrationEnabled $true  
# 關閉動態記憶體  
Set-VMMemory -VMName $VMName -DynamicMemoryEnabled $false  
# 關閉自動檢查點  
Set-VM -VMName $VMName -AutomaticCheckpointsEnabled $false  

# 使用VMConnect開啟虛擬機器  
VMConnect.exe localhost $VMName

結語

到這裡為止是我先前在 windows 環境下很常做的事情 (當然是用 GUI 建一建啦) ,由於先前案子需要各種 Server Role 來處理各式各樣的任務,因此需要好幾台隔離的環境來模擬,在那個時候真的是有個 1~20 台虛擬機在機器上都不意外,例如:Sitecore 的 CM、CD、xConnect、solr、processing、資料庫之類的,我可能就會各別建立一台來模擬客戶家實際會出現的狀況 (當然全部都在同一個 IIS 上安裝數個站台也可以) ,真的是各種想盡辦法節省資源的配置才湊得出比較像客戶家的環境,再來才能重現想要解決的問題
不過現在移動到寫 dotnet core 的案子,換成跨平台的關係,對虛擬機就沒有這麼剛性需求了,docker 真的是好物 (系列文埋坑?) !

參考

  1. [Windows]如何建立重複使用 Hyper-V VM 的虛擬硬碟檔
  2. Sysprep 命令列選項
  3. Add-VMHardDiskDrive
  4. New-VHD

#Windows #powershell #hyper-v #Virtual Machine







Related Posts

物件導向

物件導向

淺談 AJAX、JSONP 和 CORS

淺談 AJAX、JSONP 和 CORS

5.  SpringBoot使用jms錯誤處理延(2)

5. SpringBoot使用jms錯誤處理延(2)


Comments