使用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

CS50 HTTP (Hypertext Transfer Protocol)

CS50 HTTP (Hypertext Transfer Protocol)

詳解簡易 Timer 來學習 D3

詳解簡易 Timer 來學習 D3

5.  使用 props 向下傳遞資料

5. 使用 props 向下傳遞資料


Comments