尽管 qemu-kvm 可以工作,但 Libvirt 没有 KVM 功能

尽管 qemu-kvm 可以工作,但 Libvirt 没有 KVM 功能

我了解到 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”部分。

答案1

大多数发行版 libvirt 软件包将配置为以 qemu:qemu 用户身份运行 qemu。查看 报告的 UID+GID virsh --connect qemu:///system capabilities | grep baselabel。如果您的发行版是这种情况,则 qemu 无权访问 /dev/kvm,因此 libvirt 不会宣传 kvm 支持。chmod 666 /dev/kvm应该修复它。这是 Fedora 中的默认设置(仅供参考)

答案2

对于 ubuntu,我遇到了同样的事情。

我运行这个来确保没有东西被删除

sudo apt-get install qemu uml-utilities virt-manager git wget libguestfs-tools p7zip-full uml-utilities virt-viewer qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -y

全部安装好了,这很奇怪。

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'qemu-system-x86' instead of 'qemu-kvm'
bridge-utils is already the newest version (1.7-1ubuntu2).
git is already the newest version (1:2.32.0-1ubuntu1).
wget is already the newest version (1.21-1ubuntu3).
libguestfs-tools is already the newest version (1:1.44.1-1ubuntu6).
p7zip-full is already the newest version (16.02+dfsg-8).
uml-utilities is already the newest version (20070815.4-1).
virt-manager is already the newest version (1:3.2.0-3).
virt-viewer is already the newest version (7.0-2build1).
qemu-system-x86 is already the newest version (1:6.0+dfsg-2expubuntu1.2).
qemu is already the newest version (1:6.0+dfsg-2expubuntu1.2).
libvirt-clients is already the newest version (7.6.0-0ubuntu1.1).
libvirt-daemon-system is already the newest version (7.6.0-0ubuntu1.1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

然后我重新运行了用户组的命令,bam 又开始工作了。非常奇怪,但可能对其他人有帮助

sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

答案3

这稍微扩展了 Cole Robinson 的答案,这对我解决 Ubuntu 上的类似问题非常有帮助。

我认为 Debian 的做法与 Ubuntu 相同,您需要安装qemu-system-x86,然后 /dev/kvm 神奇地变为组可写并由kvm组拥有(而不是 0600 root:root)。

Debian/Ubuntu 上的 libvirtdlibvirt-qemu默认使用用户,并且该用户的主要组是kvm

答案4

我遇到了完全相同的问题——kvm命令有效但virt-install以相同的错误结束。

罪魁祸首是有一个正在运行的 Virtualbox VM。

相关内容