Running nested guests with KVM.
巢狀虛擬化(nested virtualization),也有人稱作嵌套虛擬化,指的是在虛擬機裡面再跑一個虛擬機。Linux的KVM不只可以在Linux虛擬機跑KVM,還可以在虛擬機裡面啟用Hyper-V、bhyve、VMware等其他虛擬化技術呢。更瘋狂的作法還有利用QEMU的PCI Passthrough功能,將硬體裝置層層直通到虛擬機裡的虛擬機。
整個過程請參考Linux Kernel Archive的示意圖,L為layer之意。L0是為執行KVM的宿主機,L1為執行KVM的虛擬機,L2則是執行於KVM虛擬機內的虛擬機。我們要讓L1的虛擬機也可以使用KVM加速技術執行其他L2的虛擬機。
本文討論的是在Linux宿主機啟用巢狀KVM,並讓Linux虛擬機可執行KVM。
如果想看Linux宿主機+Windows虛擬機Hyper-V的設定方法,以便執行WSA或WSL,左轉 在Windows 11虛擬機啟用Hyper-V
1. 環境#
- 宿主機:Ubuntu 24.04 LTS (核心版本6.5.0)
- 虛擬機:Arch Linux (核心版本6.9.7)
- CPU:Intel i5-7400
2. 調整L0宿主機KVM核心模組選項#
先在 Ubuntu安裝QEMU/KVM與Virt Manager,確認虛擬化功能可以使用。
我的CPU是Intel,對應的KVM核心模組為
kvm_intel
,使用cat /sys/module/kvm_intel/parameters/nested
指令,確認KVM核心模組的nested選項是否有啟用。印出的結果應該為
N
所以要取消載入KVM核心模組
sudo modprobe -r kvm_intel
- 再重新以nested=1的選項載入
sudo modprobe kvm_intel nested=1
這樣
cat /sys/module/kvm_intel/parameters/nested
指令印出的結果應該就會是Y
了。將此選項設定為開機自動載入
echo "options kvm_intel nested=1" | sudo tee -a /etc/modprobe.d/kvm.conf
3. 修改L1虛擬機的選項#
開啟Virt Manger,在虛擬機的CPU欄位,將其修改為複製主機CPU配置(host-passthrough)
將L1的Linux虛擬機開機,執行指令確認CPU支援虛擬化,
sudo grep -E -c '(vmx|svm)' /proc/cpuinfo
- 以及確認KVM模組有載入
sudo modprobe kvm_intel
lsmod | grep kvm
- 然後L1的虛擬機裡面就可以使用Virt Manager建立L2虛擬機了。
不過KVM官方文件提到,如果在L2虛擬機不關機的情況下遷移L1虛擬機,可能會造成無法預期的後果。所以要處理L1的虛擬機之前得先把L2虛擬機關機。