前言
最近覺得要填的坑太多了,想說要開始建立 Lab 環境來寫點東西,但寫一寫就想拆到別篇文章,所以這一篇基礎 Hyper-V 使用教學就誕生了
雖然平常都是用 GUI 建,但特別用個 powershell 來體驗一下~XD
這一篇是盡可能使用 windows powershell 操作 hyper-v 來建立虛擬機器的紀錄
環境
- Host - Windows11 Pro 23H2
※ Hyper-V 為 windows pro 版本以上內建的虛擬機器軟體,可透過啟用 windows 的功能來開始使用,如果是購買一般筆電,通常只有 Home 版 windows,可能就沒有這個方便的虛擬軟體囉
前置準備
- windows 的 iso 安裝檔案(我是直接用 windows 11 24H2 的映像檔)
建立虛擬機器腳本
微軟的範例如下:
# Set VM Name, Switch Name, and Installation Media Path.
$VMName = 'TESTVM'
$Switch = 'External VM Switch'
$InstallMedia = 'C:\Users\Administrator\Desktop\en_windows_10_enterprise_x64_dvd_6851151.iso'
# Create New Virtual Machine
New-VM -Name $VMName -MemoryStartupBytes 2147483648 -Generation 2 -NewVHDPath "D:\Virtual Machines\$VMName\$VMName.vhdx" -NewVHDSizeBytes 53687091200 -Path "D:\Virtual Machines\$VMName" -SwitchName $Switch
# Add DVD Drive to Virtual Machine
Add-VMScsiController -VMName $VMName
Add-VMDvdDrive -VMName $VMName -ControllerNumber 1 -ControllerLocation 0 -Path $InstallMedia
# Mount Installation Media
$DVDDrive = Get-VMDvdDrive -VMName $VMName
# Configure Virtual Machine to Boot from DVD
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive
下面是我改了一下,寫個中文說明,除了記憶體大小和硬碟大小故意用了單位表示可以這樣寫,不用換算之外,其他照抄...XD
但可以注意一下New-VM
指令的NewVHDPath
和Path
兩個參數,如果和我一樣有時候有路徑潔癖的,可以想一下會不會額外建立資料夾之類的
# Set VM Name, Switch Name, and Installation Media Path.
$VMName = '{虛擬機器名稱}'
$Switch = '{你要用的虛擬網卡名稱,某個世代之後都有個Default Switch,都設定好用Host網路了,非常方便}'
$InstallMedia = '{你要用來安裝windows的iso檔案完整路徑}'
# Create New Virtual Machine
New-VM -Name $VMName -MemoryStartupBytes 8GB -Generation 2 -NewVHDPath "{放磁碟的資料夾}\$VMName.vhdx" -NewVHDSizeBytes 200GB -Path "{放虛擬機的資料夾}" -SwitchName $Switch
# Add DVD Drive to Virtual Machine
Add-VMScsiController -VMName $VMName
Add-VMDvdDrive -VMName $VMName -ControllerNumber 1 -ControllerLocation 0 -Path $InstallMedia
# Mount Installation Media
$DVDDrive = Get-VMDvdDrive -VMName $VMName
# Configure Virtual Machine to Boot from DVD
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive
以為這樣就結束了嗎?
並沒有,因為拿來使用的 iso 檔案是 windows11,如果有關注 windows 迭代的話,就知道還有個萬惡的 TPM 模組要開才能安裝
不然在安裝的時候就會跳出警告說不能裝囉~
所以還要再補上一段設定是把 TPM 給啟用(GUI 的路徑是開啟該 VM 的設定,點開硬體下的安全性,在加密支援的地方,啟用信賴平台模組打勾)
# 變數$VMName來自於前一段所設定的,如果是不同Session就需要乖乖key in囉
# 建立一個金鑰保護裝置(KP)
Set-VMKeyProtector -VMName $VMName -NewLocalKeyProtector
# 啟用TPM
Enable-VMTPM -VMName $VMName
再來就一些個人喜好設定
# 設定CPU個數
Set-VMProcessor -VMName $VMName -Count 6 -CompatibilityForMigrationEnabled $true
# 關閉動態記憶體
Set-VMMemory -VMName $VMName -DynamicMemoryEnabled $false
# 關閉自動檢查點
Set-VM -VMName $VMName -AutomaticCheckpointsEnabled $false
啟動虛擬機器腳本
你可能以為這個段落要講的是終於可以開機了,腳本如下:
Start-VM $VMName
但你再透過 GUI 連線進去的時候,卻會發現根本動不了,放一段時間之後
就顯示一大片錯誤訊息
所以這裡要做的其實是啟動 GUI 連進去沒錯,但還要有足夠的時間按下任意按鍵進入到安裝畫面...XD
下面的指令就會開啟 VMConnect(就平常連線進 Hyper-V 內虛擬機器的 exe)
開啟之後再去點擊啟動,才來得及按下去任意按鍵
VMConnect.exe localhost $VMName
※ 這段錯誤訊息實際上應該是在 Hyper-V 第 2 世代才會出現,使用上我是覺得第 1 世代雖然好設定,但很多地方使用起來就是有點慢,很卡,所以這裡用第二世代來做虛擬機
開始安裝 Windows
開啟 VMConnect 後,快速的點一下鍵盤任意按鍵,就可以進到常見的 windows 安裝畫面囉!
基本上就是無腦的一直點下一步...
完整 powershell 範本
# Set VM Name, Switch Name, and Installation Media Path.
$VMName = '{虛擬機器名稱}'
$Switch = '{你要用的虛擬網卡名稱,某個世代之後都有個Default Switch,都設定好用Host網路了,非常方便}'
$InstallMedia = '{你要用來安裝windows的iso檔案完整路徑}'
# Create New Virtual Machine
New-VM -Name $VMName -MemoryStartupBytes 8GB -Generation 2 -NewVHDPath "{放磁碟的資料夾}\$VMName.vhdx" -NewVHDSizeBytes 200GB -Path "{放虛擬機的資料夾}" -SwitchName $Switch
# Add DVD Drive to Virtual Machine
Add-VMScsiController -VMName $VMName
Add-VMDvdDrive -VMName $VMName -ControllerNumber 1 -ControllerLocation 0 -Path $InstallMedia
# Mount Installation Media
$DVDDrive = Get-VMDvdDrive -VMName $VMName
# Configure Virtual Machine to Boot from DVD
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive
# 建立一個金鑰保護裝置(KP)
Set-VMKeyProtector -VMName $VMName -NewLocalKeyProtector
# 開啟TPM
Enable-VMTPM -VMName $VMName
# 以下都是個人喜好...XD
# 設定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
結語
最近由於工作上的轉換,開始寫起了 dotnet6 以上的版本,順勢就投入了 macOS
久久沒有使用 windows,所以來懷念一下~XD
所以這次嘗試了一下單純用 powershell 建立 Hyper-V 的感覺
當然這都是一些很簡短的步驟,微軟的 GUI 也都有安排一模一樣的功能
但是透過一個小小的指令檔案一次建起來的感覺就是舒服!!