如何在Ubuntu 20.04上修复QEMU / KVM未连接错误

在本教程中,您将学习如何在Ubuntu 20.04上修复QEMU / KVM未连接错误。也许您已在Ubuntu 20.04上安装了KVM虚拟机管理程序,以便您以常规的非root用户身份在其上运行虚拟机。但是由于某些原因,当您尝试运行时 virsh 命令甚至 virt-manager,显示虚拟机桌面管理工具,您最终会遇到诸如Qemu / KVM未连接的错误。让我们看看如何解决这种错误。

如何在Ubuntu 20.04上修复QEMU / KVM未连接错误

在Ubuntu 20.04上以非root用户身份运行KVM时遇到的错误示例可能包括以下示例;

virsh -c qemu:///system
error: failed to connect to the hypervisor
error: End of file while reading data: Input/output error
virsh list --all
error: failed to connect to the hypervisor
error: End of file while reading data: Input/output error

因此,通过将标准用户名添加到非root用户,您已经完成了以非root用户身份运行KVM所需的所有操作。 libvirt 组,但仍然不能以标准用户身份运行KVM。

id -nG
koromicha kvm netdev nm-openvpn libvirt

所有必需的模块均已加载;

lsmod | grep kvm
kvm_intel             282624  0
kvm                   663552  1 kvm_intel

您已经通过Internet进行搜索,但是没有建议的解决方案能够解决QEMU / KVM未连接的问题?也许有您不需要的东西?

那么AppArmor呢?

根据 Ubuntu AppArmor Wiki页面;

AppArmor是强制性访问控制(MAC)系统,是对内核(LSM)的增强,可以将程序限制在有限的资源集中。它的安全模型是将访问控制属性绑定到程序而不是用户。

它的限制是通过通常在引导时加载到内核的配置文件来提供的。 AppArmor配置文件可以处于以下两种模式之一:

  • enforcement –以强制模式加载的配置文件将导致配置文件中定义的策略得到强制执行,并报告违反策略的尝试(通过syslog或auditd)。
  • complain–处于投诉模式的配置文件将不强制执行策略,而是报告违反策略的尝试。

好了,所以在检查了系统日志之后;

sudo grep libvirt /var/log/syslog | grep -i apparmor | grep -i denied
Jun 28 14:53:27 koromicha kernel: [  334.660844] audit: type=1400 audit(1593345207.778:951): apparmor="DENIED" operation="bind" profile="libvirtd" pid=12254 comm="libvirtd" family="unix" sock_type="dgram" protocol=0 requested_mask="bind" denied_mask="bind" addr="@userdb-6228daaaf66b14dfd14d93ef46d962c3"
Jun 28 14:54:19 koromicha kernel: [  386.034970] audit: type=1400 audit(1593345259.145:952): apparmor="DENIED" operation="bind" profile="libvirtd" pid=14311 comm="libvirtd" family="unix" sock_type="dgram" protocol=0 requested_mask="bind" denied_mask="bind" addr="@userdb-c861507740da1fa0c3356ad3b78bffe9"
Jun 28 15:02:30 koromicha kernel: [  877.339057] audit: type=1400 audit(1593345750.437:968): apparmor="DENIED" operation="bind" profile="libvirtd" pid=16175 comm="libvirtd" family="unix" sock_type="dgram" protocol=0 requested_mask="bind" denied_mask="bind" addr="@userdb-7d70643a9f8da0342f6359907817b664"
...

来自内核的环形缓冲区消息;

dmesg| grep -i libvirt
[   12.737770] systemd[1]: Reached target Libvirt guests shutdown.
[   36.451935] audit: type=1400 audit(1593344909.127:909): apparmor="DENIED" operation="bind" profile="libvirtd" pid=1329 comm="libvirtd" family="unix" sock_type="dgram" protocol=0 requested_mask="bind" denied_mask="bind" addr="@userdb-17950adb1cf7fdce327fb745a8f96166"
[   82.906690] audit: type=1400 audit(1593344956.066:911): apparmor="DENIED" operation="bind" profile="libvirtd" pid=3295 comm="libvirtd" family="unix" sock_type="dgram" protocol=0 requested_mask="bind" denied_mask="bind" addr="@userdb-5f105e043aa71b33f878838eb17ed07a"
...

这表明AppArmor出于某些原因限制了libvirtd禁止普通用户/非root用户使用,无论他们是否添加到组中。

检查AppArmor状态;

sudo aa-status
...
6 processes have profiles defined.
1 processes are in enforce mode.
   /usr/sbin/libvirtd (110108) libvirtd
...

libvirtd是否使用AppArmor安全驱动程序?

sudo virsh capabilities | less
..
    
      apparmor
      0
    
..

您可以交叉检查AppArmor libvirtd 简介

cat /etc/apparmor.d/usr.sbin.libvirtd

和其他文件 /etc/apparmor.d/libvirt//etc/apparmor.d/abstractions/

解决问题的方法

好吧,我没有比禁用libvirtd的AppArmor强制性更好的解决方案的时间了;

sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/

重新引导计算机以实现libvirt禁用更改;

systemctl reboot -i

系统重新启动后,您现在应该能够以非root用户身份运行KVM。

如何在Ubuntu 20.04上修复QEMU / KVM未连接错误

virsh list --all
 Id   Name   State
--------------------

这是有关如何修复Ubuntu 20.04上的QEMU / KVM Not connected错误的信息。

进一步阅读

AppArmor:Libvirtd Wiki

AppArmor Ubuntu维基

在KVM上使用VirtualBox VM

Sidebar