快轉到主要內容

Linux KVM啟用巢狀虛擬化,在虛擬機裡面跑虛擬機

分類   資訊科技 虛擬機與容器技術
標籤   Libvirt QEMU-KVM Linux
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

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核心模組選項
#

  1. 先在 Ubuntu安裝QEMU/KVM與Virt Manager,確認虛擬化功能可以使用。

  2. 我的CPU是Intel,對應的KVM核心模組為kvm_intel,使用cat /sys/module/kvm_intel/parameters/nested指令,確認KVM核心模組的nested選項是否有啟用。

  3. 印出的結果應該為N

  4. 所以要取消載入KVM核心模組

sudo modprobe -r kvm_intel
  1. 再重新以nested=1的選項載入
sudo modprobe kvm_intel nested=1
  1. 這樣cat /sys/module/kvm_intel/parameters/nested指令印出的結果應該就會是Y了。

  2. 將此選項設定為開機自動載入

echo "options kvm_intel nested=1" | sudo tee -a /etc/modprobe.d/kvm.conf

3. 修改L1虛擬機的選項
#

  1. 開啟Virt Manger,在虛擬機的CPU欄位,將其修改為複製主機CPU配置(host-passthrough)

  2. 將L1的Linux虛擬機開機,執行指令確認CPU支援虛擬化,

sudo grep -E -c '(vmx|svm)' /proc/cpuinfo
  1. 以及確認KVM模組有載入
sudo modprobe kvm_intel

lsmod | grep kvm
  1. 然後L1的虛擬機裡面就可以使用Virt Manager建立L2虛擬機了。

不過KVM官方文件提到,如果在L2虛擬機不關機的情況下遷移L1虛擬機,可能會造成無法預期的後果。所以要處理L1的虛擬機之前得先把L2虛擬機關機。

參考資料
#

相關文章

Spice Guest Tools用法,QEMU/KVM虛擬機自動縮放解析度、共享資料夾
分類   資訊科技 虛擬機與容器技術
標籤   Libvirt QEMU-KVM
Ubuntu安裝QEMU/KVM和Virt Manager虛擬機管理員
分類   資訊科技 虛擬機與容器技術
標籤   Libvirt Ubuntu QEMU-KVM
如何用圖形化程式調整QEMU/KVM虛擬機的硬碟大小,開啟編輯qcow2檔
分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM Libvirt

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請貼Imgur或Postimages。