You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即为正常
  • 补全域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特性
  • 确认libvirt连接目标正确
    • oVirt默认会运行专用libvirt管理实例,手动创建域时需要明确连接系统默认的libvirt实例,执行virsh uri确认当前连接为qemu:///system
    • 定义域时指定连接:virsh -c qemu:///system define clara.xml
  • 修复环境权限问题
    • 如果以上操作后仍报错,执行restorecon -v /usr/libexec/qemu-kvm恢复QEMU二进制的SELinux上下文
    • 重启libvirtd服务刷新能力缓存:systemctl restart libvirtd

内容的提问来源于stack exchange,提问作者meustrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:36:47