我正在尝试将物理光驱传递到 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 错误会让您知道是否是这种情况,因为如果您没有覆盖所有设备,您将在将设备列入读取或写入白名单时看到更新的错误。