使用powershell建立hyper-v的虛擬機器(windows11)


Posted by 江馬特 on 2024-11-10

前言

最近覺得要填的坑太多了,想說要開始建立 Lab 環境來寫點東西,但寫一寫就想拆到別篇文章,所以這一篇基礎 Hyper-V 使用教學就誕生了
雖然平常都是用 GUI 建,但特別用個 powershell 來體驗一下~XD

這一篇是盡可能使用 windows powershell 操作 hyper-v 來建立虛擬機器的紀錄

環境

  1. Host - Windows11 Pro 23H2

※ Hyper-V 為 windows pro 版本以上內建的虛擬機器軟體,可透過啟用 windows 的功能來開始使用,如果是購買一般筆電,通常只有 Home 版 windows,可能就沒有這個方便的虛擬軟體囉

前置準備

  1. 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指令的NewVHDPathPath兩個參數,如果和我一樣有時候有路徑潔癖的,可以想一下會不會額外建立資料夾之類的

# 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

所以還要再補上一段設定是把 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 也都有安排一模一樣的功能
但是透過一個小小的指令檔案一次建起來的感覺就是舒服!!

參考

  1. Create a virtual machine in Hyper-V
  2. Create a virtual machine with Hyper-V on Windows
  3. Enable-VMTPM

#Windows #hyper-v #powershell #Virtual Machine







Related Posts

React hook form(4) - useFormContext & useFormState & useWatch

React hook form(4) - useFormContext & useFormState & useWatch

[Power BI] 讀書會 #5 Analysis Services 概念(4)

[Power BI] 讀書會 #5 Analysis Services 概念(4)

Day02 messenger、LINE、Telegram差異

Day02 messenger、LINE、Telegram差異


Comments