簡介
過去,在準備 Nested Virtualization 環境時,一直沒有碰到問題。然而,就在上週 Cloud Summit 2023 大會之前,為了準備實戰工作坊的環境時,卻吃了蠻大的苦頭。因此,透過此篇把需要注意的事項整理一下,最近有碰到問題的朋友可以參考看看。當然,也可以參考黑大的精采文章 【茶包射手日記】無法在 Azure VM 使用 WSL、Android 模擬器-黑暗執行緒。由於,我需要的測試環境為 Windows Server 2022 以及 Azure Stack HCI,所以跟黑大的文章內容會有些許不同。下列便是在 Azure VM 環境中,如何順利打造 Nested Virtualization 環境的要點。
選擇支援 Nested Virtualization 的 VM Size
首先,在選擇 Azure VM Size 時,必須要注意的是所選擇的 VM Size 是否支援 Nested Virtualization 功能。舉例來說,這次準備Cloud Summit 2023 大會實戰工作坊時,採用的 VM Size 為 Standard_E8ds_v5,可以看到有正確支援 Nested Virtualization 功能。
採用 Gen 1 或 Gen 2?
那麼在選擇 VM Images 時,應該選擇 Gen 1 或 Gen 2? 簡單來說,原則上當然是選擇較新功能更全面的 Gen 2,舉例來說,我這次實作選擇就是 Windows Server 2022 - x64 Gen2。
然而,Gen 2 採用的「Security Type」預設為「Trusted launch virtual machines」。簡單來說,多了許多安全性功能的增強,但是卻阻斷了 Nested Virtualization 功能。在 Trusted launch for Azure VMs | Microsoft Learn 文章中可以看到,明確說明一旦採用 Trusted launch 時,那麼 Azure VM 將不支援 Nested Virtualization 功能,即便你選擇了支援的 VM Size 也沒用!! 😩
所以,簡單的結論:
- 採用 Gen 1 的話,只要先前選對支援 Nested Virtualization 的 Azure VM Size 即可。
- 採用 Gen 2 的話,除了要選對支援 Nested Virtualization 的 Azure VM Size 之外,在 Security Type 還要選擇採用 Standard 才行。
組態設定 VM 支援 ExposeVirtualizationExtensions
接著,就是熟悉的組態設定了,一旦 Azure VM 啟用 Hyper-V 虛擬化功能,在建立 Nested VM 完成後,即可執行「Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true -Verbose」指令,將伺服器虛擬化功能給予 VM,然後再執行「Get-VMProcessor -VMName <VMName> | fl -Property ExposeVirtualizationExtensions」指令進行確認。詳細資訊請參考:
當然,也別忘了執行「Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On」指令,啟用 VM 的 MAC Address Spoofing 功能,確保 Nested VM 的網路封包能夠路由和通過 vSwitch。
至此,如果 Nested VM 是採用 Windows Server 2022 的話,那麼 Hyper-V 功能便能順利安裝和啟用在 Nested VM 當中。
Azure Stack HCI in Azure Nested VM 時
倘若,Nested VM 是 Azure Stack HCI 時,你會發現即便上述動作都完成且都有注意到,但是為 Azure Stack HCI 安裝和啟用 Hyper-V 功能時,仍然會失敗並出現「Hyper-V cannot be installed because virtualization support is not enabled in the BIOS」錯誤訊息。
簡單來說,因為 Azure Stack HCI 預設要使用硬體伺服器才行。因此,當執行 Install-WindowsFeature 指令,嘗試安裝 Hyper-V 功能時會檢查相容性,系統檢查後發現為 VM Based 便會產生失敗的情況。
此時,只要改為採用「Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V" -All」或「DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V」指令,便能略過相容性檢查進而成功安裝和啟用 Hyper-V 功能在 Azure Stack HCI VM 環境中。詳細資訊請參考下列二篇文章內容:
值得注意的是,從 Run Hyper-V in a Virtual Machine with Nested Virtualization | Microsoft Learn 文章中可知,只要滿足下列條件,採用 AMD 處理器也是沒問題的才對:
- AMD EPYC/Ryzen processor or later
- The Hyper-V host must be Windows Server 2022/Windows 11 or greater
- VM configuration version 10.0 or greater
然而,當我嘗試使用 Standard_E8ads_v5 的 VM Size,也就是採用 AMD EPYC 處理器時,卻無法實作成功,必須採用 Intel Xeon 處理器的 Standard_E8ds_v5 才能實作成功 Nested Virtualization。