热插拔 USB 驱动器至虚拟机

热插拔 USB 驱动器至虚拟机

根据本文:https://www.linux-kvm.org/page/USB 我可以创建一个磁盘映像并将其作为 USB 驱动器附加到我正在运行的 VM。

我尝试通过qemu-monitor-command选项进行此操作virsh,但无论我将img文件放在哪里,都无法访问!

$ sudo  virsh qemu-monitor-command --hmp MyVM1 'drive_add 0 id=my_usb_disk,if=none,file=/tmp/usb.img'
Could not open '/tmp/usb.img': Permission denied
$ ls -l /tmp/usb.img 
-rwxrwxrwx 1 libvirt-qemu kvm 8388608000 Apr 16 19:02 /tmp/usb.img

除非我运行这个,否则我想我做不到device_add?!

这是我的 qemu 版本(在 Bionic - 18.04 上):

$ qemu-system-x86_64 --version 
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.4)

有没有其他方法(例如libvirtXML)可以将原始图像附加为 USB 驱动器?(我在 libvirt 文档中搜索过,但找不到任何示例)

我在这里遗漏了什么?

- 谢谢

答案1

您没有说明这样做的原因,在帮助您之前,我想让您知道“以 USB 形式连接”在大多数情况下都是一个糟糕的决定,大多数其他方式(virtio 磁盘、scsi 磁盘、直通等)更适合将块设备(如果由文件或真实设备支持)传递给客户机。将 USB 传递给客户机通常仅用于将真实设备传递给客户机。

但是您可能已经考虑了一个特定的测试,所以现在让我假设这里有使用 USB 的原因:-) 如果您需要一个作为 USB 磁盘的图像,那么有两件事要做。

首先,如果您使用 libvirt,那么您也可以在这里使用它,而不仅仅是传递命令。它为您完成最复杂的工作(这就是它的用途):

# qemu-img create -f qcow2 test.img 10M
Formatting 'test.img', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=10485760 lazy_refcounts=off refcount_bits=16
# virsh attach-disk ubuntu20.04-Desktop --targetbus usb --source /var/lib/libvirt/images/test.img --target hda
Disk attached successfully

当然,您可以将其转换为 XML(或直接使用 XML)以实现更具程序化的方法,但上述方法也可以。

几秒钟后,您需要了解常见和不常见的路径。如果您恰好将文件附加到 qemu,它将被 apparmor 隔离阻止 - 请参阅服务器指南。您需要告诉 libvirt 您使用什么路径,以使其允许该路径。在我上面的例子中,一切都为您完成并且正常工作。有一组路径定义,所有这些可以自动发生,例如 /var/lib/libvirt/images + 告诉 libvirt 您使用附加磁盘做什么就是其中之一。

如果需要让它在其他路径上运行,则需要为 virt-aa-helper 添加额外的规则/etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper

如果您进一步“坚持”必须手动执行此操作而不是通过 libvirt,则需要添加一条规则,允许客户机将给定路径/文件添加到 /etc/apparmor.d/libvirt/libvirt-,然后重新加载该配置文件(或重新启动客户机)。然后 qemu 就可以访问该路径了。

相关内容