即使 qemu-kvm 可以工作,Libvirt 也没有 KVM 功能

SIO*_*SIO 4 debian libvirt kvm-virtualization

我了解到 CirrusCI 在其公共存储库的免费软件包中提供嵌套虚拟化,我正在尝试利用它来测试我的 Ansible 剧本。

不幸的是,libvirt 坚持认为 CI 环境不支持完全虚拟化。所有检查(我知道的)都证明了相反的情况,并且 qemu-kvm 在直接调用时可以正常工作。我几乎可以肯定问题出在我的主机操作系统配置上,而不是出在 CI 引擎上。我见过其他人出于他们的目的(Android 仿真、氧化还原测试)在 CirrusCI 上使用完全虚拟化。

我使用 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
Run Code Online (Sandbox Code Playgroud)

基础图像 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是 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
...
Run Code Online (Sandbox Code Playgroud)

完整的 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”部分提供了完整列表。

小智 6

大多数发行版 libvirt 软件包将被配置为以 qemu:qemu 用户身份运行 qemu。请参阅 报告的 UID+GID virsh --connect qemu:///system capabilities | grep baselabel。如果您的发行版就是这种情况,那么 qemu 没有访问 /dev/kvm 的权限,因此 libvirt 不会宣传 kvm 支持。chmod 666 /dev/kvm应该修复它。这是 Fedora FWIW 中的默认设置

  • 是的,就是这样。谢谢!我已经向 /etc/libvirt/qemu.conf 添加了明确的 `user = "root"`,而不是更改 /dev/kvm 的所有者。这是出乎意料的,因为该文件包含默认使用“root”的注释。猜猜评论已经过时了。 (2认同)