前言
剛開始試著用虛擬機器開發的時候,在好幾個機器間連線的環境,模擬的方式就是裝著一台又一台的機器,再一步步建立成想要的樣子。但是每次這樣做就有長時間在等待 OS 裝完,一次又一次的等待下,就會很懷疑有沒有更好的方式來加速這個流程,所以這一篇就是整理如何建立一個已經安裝好 OS 的硬碟檔案,讓 Lab 環境可以更快速的建立。
環境
- 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 來使用這麼大,對於硬碟空間有要求的人比較友善~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 真的是好物 (系列文埋坑?) !