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
相关产品推荐
相关产品推荐

