每次我virsh destroy ${KVM}
以 root 身份运行时,都会出现以下错误(virsh shutdown ${KVM}
完全没有反应,什么也没有发生):
error: Failed to destroy domain ${KVM}
error: Failed to terminate process 11956 with SIGTERM: Permission denied
当我shutdown -h now
在 KVM 内运行时,它会永远挂起,直到我终止 qemu-system-x86_64 进程 ( kill ${PID_OF_QEMU_PROCESS}
)。如系统日志中所述,apparmor 正在阻止调用( forvirsh shutdown
和virsh destroy
):
apparmor="DENIED" operation="ptrace" profile="/usr/sbin/libvirtd" pid=23212
comm="libvirtd" requested_mask="trace" denied_mask="trace" peer="unconfined"
在 qemu 配置文件中,/etc/libvirt/qemu.conf
我尝试禁用 Apparmor ( security_driver = "none"
),但仍然遇到相同的错误。
一些细节: OS = Debian 9
、 Kernel = 4.14.0-0.bpo.2-amd64
、 libvirt-version = 3.0.0-4
。
有谁知道如何在不禁用 apparmor 的情况下解决问题?
答案1
设置security_driver = "none"
不会禁用内核中的apparmor,只是libvirt
本身的一些支持
看看当前稳定版(debian 9/stretch)中的 apparmor 配置文件和当前不稳定版中的 apparmor 配置文件,我发现了一些差异。
我相信您可以添加以下规则/etc/apparmor.d/local/usr.sbin.libvirtd
(这是两个版本之间的众多差异之一):
ptrace (trace) peer=unconfined,
然后重新启动 apparmor 服务service restart apparmor
不过,可能需要其他规则才能使一切正常进行。
另一种解决方案是将配置文件设置为“投诉”模式aa-complain /usr/sbin/libvirtd
,这将防止 apparmor 拒绝任何内容,但您会保留问题记录。
您稍后可以使用它aa-logprof
来生成缺少的规则(之后仔细审查他们)或尝试从不稳定的地方获取apparmor配置文件。