virsh 预启动脚本

virsh 预启动脚本

我正在运行需要 vfio 访问 PCI 卡的虚拟机。使用脚本我能够成功地将 PCI 设备及其 iommu 组绑定到 vfio-pci,然后让我启动虚拟机:

  1. ./vfio-pci-bind.sh 0000:03:00.0
  2. 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,感谢您的帮助!

相关内容