我正在运行需要 vfio 访问 PCI 卡的虚拟机。使用这脚本我能够成功地将 PCI 设备及其 iommu 组绑定到 vfio-pci,然后让我启动虚拟机:
./vfio-pci-bind.sh 0000:03:00.0
virsh start myvm
我想自动执行此操作,而不必每次都手动绑定到 vfio-pci。是否有某种预检/预启动脚本可以让 virsh 在尝试启动虚拟机之前运行?
答案1
您可以使用libvirt 钩子当虚拟机或网络启动或停止时运行任意程序。
例如,您可以创建一个文件/etc/libvirt/hooks/qemu
来确定您的虚拟机是否正在被调用,然后执行任何需要执行的操作。
#!/bin/bash
if [ "$1" = "myvm" ] && [ "$2" = "prepare" ]; then
/path/to/vfio-pci-bind.sh '0000:03:00.0'
fi
答案2
@michael-hampton 有最正确的答案,但为了供任何人参考,我很不耐烦,还制作了一个名为的 systemd 服务vfio-pci-bind.service
来执行vfio-pci-bind.sh
:
[Unit]
Description=bind PCI card to vfio
[Service]
ExecStart=/opt/vfio-pci-bind/vfio-pci-bind.sh "0000:03:00.1"
Type=oneshot
RemainAfterExit=yes
然后我添加到libvirt-guests.service
:
[Service]
...
Wants=vfio-pci-bind.service
After=vfio-pci-bind.service
这方面的问题是
- 它依赖于 systemd 而不是独立于 libvirt
- 无论受影响的虚拟机是否会在启动时实际启动,它都会执行 vfio-pci-bind
所以是的,我将切换到 libvirt hooks,感谢您的帮助!