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

Libvirt调用自行编译QEMU时qxl报错、权限拒绝问题求解

自行编译QEMU对接libvirt异常处理

问题现象

  • 直接在终端执行自行编译的QEMU二进制可以正常启动,修改libvirt虚拟机配置替换模拟器路径后,虚拟机启动失败
  • 执行virsh edit VM_name(注:原文写的virus edit为命令笔误)编辑虚拟机配置,将原本的系统QEMU路径:
<emulator>/usr/bin/qemu-system-x86_64</emulator>

替换为自行编译的QEMU路径:

<emulator>/home/user/Documents/qemu/build/x86_64-softmmu/qemu-system-x86_64</emulator>

修改后配置的devices片段示例:

<devices>
    <emulator>/home/user/Documents/qemu/build/x86_64-softmmu/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' discard='unmap'/>
      <source file='/var/lib/libvirt/images/ubuntu20.04.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
  • 初始报错为权限拒绝,调整AppArmor配置添加对应PUx规则后,出现新报错:error: unsupported configuration: domain configuration does not support video model 'qxl'
  • 将qxl视频模型替换为旧版兼容模型后,qxl相关报错消失,但权限拒绝问题始终存在

环境信息

  • 操作系统:Ubuntu 22.04 LTS
  • apt安装的Libvirt版本:8.0.0
  • 系统自带QEMU版本:6.2.0
  • 自行编译的QEMU版本:7.0.0,拉取自virtio-fs开发分支

排查过程&已尝试操作

  • 已尝试添加AppArmor规则"/home/user/Documents/qemu/build/x86_64-softmmu/qemu-system-x86_64 PUx,"
  • 已在/etc/apparmor.d/usr.sbin.libvirtd中添加对应路径规则,执行systemctl reload apparmor重载配置后问题未解决
  • dmesg日志明确显示AppArmor拦截了libvirt对自定义QEMU二进制的执行操作,核心报错日志如下:
[12227.019203] virbr0: port 2(vnet5) entered blocking state
[12227.019211] virbr0: port 2(vnet5) entered disabled state
[12227.019390] device vnet5 entered promiscuous mode
[12227.019765] virbr0: port 2(vnet5) entered blocking state
[12227.019769] virbr0: port 2(vnet5) entered listening state
[12227.179234] audit: type=1400 audit(1654891381.082:487): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="libvirt-16b54d8a-be5c-4530-a8d8-ebc1bd02481d" pid=317483 comm="apparmor_parser"
[12227.233741] audit: type=1400 audit(1654891381.134:488): apparmor="DENIED" operation="exec" profile="libvirt-16b54d8a-be5c-4530-a8d8-ebc1bd02481d" name="/home/xlf/Documents/qemu/build/qemu-system-x86_64" pid=317485 comm="rpc-libvirtd" requested_mask="x" denied_mask="x" fsuid=0 ouid=0
[12227.256173] virbr0: port 2(vnet5) entered disabled state
[12227.257559] device vnet5 left promiscuous mode
[12227.257569] virbr0: port 2(vnet5) entered disabled state
[12227.482556] audit: type=1400 audit(1654891381.386:489): apparmor="STATUS" operation="profile_remove" profile="unconfined" name="libvirt-16b54d8a-be5c-4530-a8d8-ebc1bd02481d" pid=317503 comm="apparmor_parser"

解决方案

1. 修复qxl视频模型不兼容问题

该报错是编译QEMU时未开启qxl显示设备的依赖特性,按以下步骤操作:

  • 安装编译qxl/spice所需的依赖包:
sudo apt install -y libspice-server-dev libspice-protocol-dev libusbredirparser-dev libusb-1.0-0-dev
  • 重新配置QEMU编译选项,开启spice和qxl支持后重新编译:
./configure --enable-spice --enable-usb-redir --target-list=x86_64-softmmu
make -j$(nproc)

如果暂时不需要qxl特性,直接将虚拟机配置中video段的模型从qxl改为virtio或cirrus即可临时绕过。

2. 修复AppArmor权限拦截问题

你之前添加规则的文件错误,libvirt为虚拟机生成动态AppArmor规则时不会读取usr.sbin.libvirtd中的自定义模拟器路径,按以下步骤操作:

  • 编辑QEMU对应的AppArmor抽象规则文件/etc/apparmor.d/abstractions/libvirt-qemu,在文件末尾添加自定义QEMU路径的访问规则。
    注意:规则中的路径必须和dmesg日志里被拦截的二进制路径完全一致,不要直接复制示例路径,你的环境中用户名为xlf,不要写成默认的user。
/home/xlf/Documents/qemu/build/** PUx,
/home/xlf/Documents/qemu/build/x86_64-softmmu/qemu-system-x86_64 PUx,
  • 给用户家目录添加其他用户的遍历权限,避免文件系统层面的权限拦截:
sudo chmod o+rx /home/xlf
  • 重载AppArmor配置并重启libvirtd服务:
sudo systemctl reload apparmor
sudo systemctl restart libvirtd
  • 如果是测试环境不想逐行调AppArmor规则,可以直接关闭libvirt的AppArmor安全驱动:编辑/etc/libvirt/qemu.conf,找到security_driver配置项修改为security_driver = "none",重启libvirtd即可绕过所有安全拦截,生产环境不建议使用该方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:12:21