Debian

即使 qemu-kvm 工作,Libvirt 也沒有 KVM 功能

  • March 1, 2022

我了解到 CirrusCI 在他們的免費包中為公共儲存庫提供了嵌套虛擬化,我正在嘗試利用它來測試我的 Ansible 劇本。

不幸的是,libvirt 堅持認為 CI 環境不支持完全虛擬化。所有檢查(我知道)都證明了相反的情況,直接呼叫 qemu-kvm 可以正常工作。我幾乎可以肯定問題出在我的主機作業系統配置上,而不是 CI 引擎上。我見過其他人在 CirrusCI 上使用完全虛擬化來實現他們的目的(Android 仿真、氧化還原測試)。

我將 Debian 10 用於主機系統,來自 DockerHub 的苗條圖像,安裝了以下額外軟體包(–no-install-recommends):

bridge-utils  libguestfs-tools       python3-dev
coreutils     libosinfo-bin          python3-venv
cpu-checker   libssl-dev             qemu-kvm
curl          libvirt-clients        qemu-kvm
gcc           libvirt-daemon         qemu-utils
gpg           libvirt-daemon-system  systemd
gpg-agent     linux-image-amd64      vagrant
iproute2      make                   vagrant-libvirt
kmod          procps                 virt-goodies
libc-dev      python3                virtinst
libffi-dev

基礎鏡像CirrusCI 配置

我可能會錯過什麼?當 qemu-kvm 完美執行時,為什麼 libvirt 會告訴沒有 KVM?

libvirt 錯誤

Error while creating domain: Error saving the server: Call to virDomainDefineXML failed: invalid argument: could not find capabilities for domaintype=kvm

virsh capabilities僅包含 <domain type='qemu'/>條目。

不一致行為展示

任何基於 libvirt 的工具都無法呼叫 KVM:

$ virt-install --import --virt-type kvm --name debian10-vm --memory 512 --disk path=/debian.qcow2,format=qcow2 --os-variant debian10 --noautoconsole || echo "Exit code: $?"
ERROR    Host does not support domain type kvm for virtualization type 'hvm' arch 'x86_64'
Exit code: 1

但是 qemu-kvm 在直接執行時可以工作:

$ kvm -nographic /debian.qcow2
cSeaBIOS (version 1.12.0-1)
iPXE (http://ipxe.org) 00:03.0 C980 PCI2.10 PnP PMM+07F900F0+07ED00F0 C980
Press Ctrl-B to configure iPXE (PCI 00:03.0)...

Booting from Hard Disk...
GNU GRUB  version 2.02+dfsg1-20
...

完整的 CI 日誌

診斷

  • lsmod顯示 kvm 和 kvm_intel 已載入
  • cat /proc/cpuinfo- 包含 vmx 標誌
  • lscpu- 虛擬化類型:完整
  • kvm-ok- 好的
  • ls -l /dev/kvm- 存在,歸 root:rdma 所有
  • ls -l /var/run/libvirt- 套接字存在,由 root:root 擁有
  • whoami- 根
  • groups $(whoami)- 根
  • systemctl status- systemd 沒有啟動,libvirtd 是通過 CI 規則啟動的
  • virt-host-validate- 所有檢查都通過,除了 IOMMU - 對我的案例來說應該不重要

完整列表可在CI 日誌的“kvm_before”部分中找到。

大多數發行版 libvirt 軟體包將被配置為以 qemu:qemu 使用者身份執行 qemu。查看由 報告的 UID+GID virsh --connect qemu:///system capabilities | grep baselabel。如果您的發行版是這種情況,那麼 qemu 沒有訪問 /dev/kvm 的權限,因此 libvirt 不會宣傳 kvm 支持。chmod 666 /dev/kvm應該修復它。這是 Fedora FWIW 中的預設設置

這稍微擴展了 Cole Robinson 的答案,這對我在 Ubuntu 上找出類似問題非常有幫助。

我認為 Debian 的做法與 Ubuntu 相同,您需要在其中安裝qemu-system-x86/dev/kvm 神奇地變為組可寫並歸kvm組所有(而不是 0600 root:root)。

Debian/Ubuntu 上的 libvirtdlibvirt-qemu預設使用使用者,該使用者的主要組是kvm.

引用自:https://serverfault.com/questions/1002043