libvirt定义KVM域报无法获取qemu-kvm首选machine类型错误解决
问题背景
在运行oVirt Node的主机上临时使用嵌套虚拟化环境(后续将切换为非嵌套部署),尝试创建配置如下的KVM域:
<domain type="kvm"> <name>clara</name> <memory unit="MiB">4096</memory> <vcpu>2</vcpu> <os> <type>hvm</type> <boot dev="hd"></boot> </os> <features> <pae></pae> <acpi></acpi> <apic></apic> </features> <cpu></cpu> <devices> <disk type="volume" device="disk"> <driver name="qemu" type="qcow2"></driver> <source pool="default" volume="clara-rootfs"></source> <target dev="vda" bus="scsi"></target> <wwn>05abcd62857fe8f1</wwn> </disk> <disk type="file" device="cdrom"> <driver name="qemu" type="raw"></driver> <source file="/var/lib/libvirt/images/cloudinit.clara.iso"></source> <target dev="hdd" bus="ide"></target> </disk> <controller type="scsi" model="virtio-scsi"></controller> <interface type="bridge"> <mac address="E2:F5:2A:A9:4A:42"></mac> <source bridge="bridge0"></source> <model type="virtio"></model> </interface> <channel type="unix"> <target type="virtio" name="org.qemu.guest_agent.0"></target> </channel> <graphics type="spice" autoport="yes"></graphics> <rng model="virtio"> <backend model="random">/dev/urandom</backend> </rng> </devices> </domain>
执行定义命令时返回报错:
# virsh define clara.xml error: Failed to define domain from clara.xml error: invalid argument: could not get preferred machine for /usr/libexec/qemu-kvm type=kvm
报错含义
该报错指libvirt在调用/usr/libexec/qemu-kvm二进制初始化KVM类型域时,无法匹配到适配当前主机环境、支持KVM硬件加速的默认机器类型。在oVirt Node这类定制化虚拟化宿主系统上,该问题通常由三类原因触发:
- 嵌套虚拟化未正确启用,KVM硬件加速能力不可用
- 域XML配置缺失必填的架构、机器类型声明,libvirt无法自动推导适配参数
- oVirt自带的专用libvirt实例与系统默认libvirt/QEMU环境冲突,或权限/SELinux规则拦截了libvirt读取QEMU能力的操作
修复步骤
按以下顺序排查修复:
- 验证嵌套虚拟化状态
- Intel CPU执行
cat /sys/module/kvm_intel/parameters/nested,AMD CPU执行cat /sys/module/kvm_amd/parameters/nested,如果返回值为N/0说明嵌套未启用 - 临时启用执行:
modprobe -r kvm_intel && modprobe kvm_intel nested=1(Intel平台,AMD替换为kvm_amd) - 永久启用在
/etc/modprobe.d/kvm.conf中写入options kvm_intel nested=1(AMD对应替换模块名) - 验证KVM可用性执行
kvm-ok,返回KVM acceleration can be used即为正常
- Intel CPU执行
- 补全域XML缺失配置
- 原XML的
<os>段未声明架构和机器类型,先执行/usr/libexec/qemu-kvm -machine help查看当前QEMU支持的机器类型,找到标记为default的x86_64 q35机型(oVirt Node上通常为pc-q35-rhel*格式) - 将原
<os>段修改为如下格式,替换machine值为上一步查到的默认机型:<os> <type arch='x86_64' machine='pc-q35-rhel9.0'>hvm</type> <boot dev="hd"></boot> </os> - 原XML中空的
<cpu></cpu>段在嵌套环境下易触发兼容问题,替换为<cpu mode='host-passthrough' check='none'/>透传宿主CPU特性
- 原XML的
- 确认libvirt连接目标正确
- oVirt默认会运行专用libvirt管理实例,手动创建域时需要明确连接系统默认的libvirt实例,执行
virsh uri确认当前连接为qemu:///system - 定义域时指定连接:
virsh -c qemu:///system define clara.xml
- oVirt默认会运行专用libvirt管理实例,手动创建域时需要明确连接系统默认的libvirt实例,执行
- 修复环境权限问题
- 如果以上操作后仍报错,执行
restorecon -v /usr/libexec/qemu-kvm恢复QEMU二进制的SELinux上下文 - 重启libvirtd服务刷新能力缓存:
systemctl restart libvirtd
- 如果以上操作后仍报错,执行
内容的提问来源于stack exchange,提问作者meustrus
相关产品推荐
相关产品推荐

