如何授予 KVM 对 /dev/sg0 的读取访问权限?

如何授予 KVM 对 /dev/sg0 的读取访问权限?

我正在尝试将物理光驱传递到 KVM 客户机。

以下是我在 XML 中定义设备的方式:

<controller type='scsi' index='0' model='virtio-scsi'/>
    <hostdev mode='subsystem' type='scsi'>
      <source>
        <adapter name='scsi_host4'/>
        <address type='scsi' bus='0' target='0' unit='0'/>
      </source>
  <readonly/>
  <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</hostdev>

不幸的是,当我尝试启动虚拟机时,出现此错误:

驱动器文件 = /dev/sg0,if=none,id = drive-hostdev0,readonly = on:无法打开'/dev/sg0':权限被拒绝

我怎样才能解决这个问题?

答案1

首先,您应该检查是否是 AppArmor 阻止了您的设备:

dmesg | grep /dev/sg0

如果您看到类似以下内容的消息:

[159883.682167] 审核:类型 = 1400 审核(1534114680.047:392):apparmor =“DENIED”操作 =“file_lock”配置文件 =“libvirt-40d3ad0d-0574-4823-ae7d-eaf38afa7fb6”名称 =“/dev/sg0”

然后它被 AppArmor 锁定。如果配置文件字段如上所示,且域的标识符位于profile=部分之后,则它是在域启动后由 KVM 动态创建的配置文件,是 KVM 与 AppArmor 集成的一部分。

您可以通过编辑模板文件(通常位于)来允许 KVM 主机访问部分或全部 SCSI 设备/etc/apparmor.d/libvirt。您应该看到一个TEMPLATE.qemu文件,该文件用作动态创建的 AppArmor 配置文件的基础。您可以在此文件中将设备列入白名单,或编辑模板文件中列出的包含指向的文件(通常为)/etc/apparmor.d/abstractions/libvirt-qemu。要列入白名单,只需将您的条目添加到文件中的单独行中,如下所示:

阅读:

/dev/sg* rk,

对于读/写:

/dev/sg* rwk,

如果您使用 GUI 编辑域中的 SCSI 设备,您可能会注意到设备在 GUI 中显示不正确。例如,如果您尝试通过光盘驱动器,即使存在介质,也可能无法显示介质在驱动器中。您还需要将这些设备添加到 KVM 服务中,方法是向文件中添加类似的条目,/etc/apparmor.d/usr.lib.libvirt.virt-aa-helper然后告诉 AppArmor 重新加载配置:

service apparmor reload

如果 SCSI 设备是符号链接的,您可能还需要将这些符号链接的设备添加到白名单中。AppArmor 错误会让您知道是否是这种情况,因为如果您没有覆盖所有设备,您将在将设备列入读取或写入白名单时看到更新的错误。

相关内容