我了解到 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
我可能遗漏了什么?当 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
...
诊断
lsmod
显示 kvm 和 kvm_intel 已加载cat /proc/cpuinfo
- 包含 vmx 标志lscpu
- 虚拟化类型:完整kvm-ok
- 好的ls -l /dev/kvm
- 存在,归 root:rdma 所有ls -l /var/run/libvirt
- 套接字存在,所有者为 root:rootwhoami
- 根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。