我正在尝试编写一组 udev 规则,以允许组 kvm 中的用户取消绑定 pci 设备上的驱动程序。有问题的命令是:
echo '0000:0b:00.0' > /sys/bus/pci/devices/0000:0b:00.0/driver/unbind
echo 0x1912 0x0014 > /sys/bus/pci/drivers/vfio-pci/new_id
我希望能够以 kvm 组中的用户身份执行这些操作,但到目前为止我还没有运气。我最初尝试在设备本身上设置组,然后在 xhci_hcd 和 vfio-pci 驱动程序上设置组,使用以下变体:
SUBSYSTEM=="pci", ATTR{vendor}=="0x1912", ATTR{device}=="0x0014", OWNER="root", GROUP="kvm"
KERNEL=="xhci_hcd", SUBSYSTEM=="drivers", OWNER="root", GROUP="kvm"
KERNEL=="vfio-pci", SUBSYSTEM=="drivers", OWNER="root", GROUP="kvm"
但这些没有任何效果,我什至尝试在整个子系统上设置组只是为了测试并且没有权限更改,所以我认为我做的事情完全错误。
关于我做错了什么的任何指示吗?谢谢。
答案1
好吧,我不确定问题本身是否不期望具体的结果,这会让你的答案变得更难而不是更容易。
首先:您应该使用“udevadm info -a -p /sys/devices/”来检查您尝试使用的 KERNEL/SUBSYSTEM 属性是否确实是内核使用的属性。
其次:如果它最终匹配,您可以直接从 udev 规则运行重新绑定命令。
这是一个基于的示例http://vogelchr.blogspot.com/2016/02/linuxudev-unbinding-from-one-kernel.html我针对 PCI 设备(即 NVMe SSD)进行了修改,因为绑定机制在 4.15+ 内核上的行为有所不同。
udev规则:DRIVER=="nvme", ATTRS{subsystem_device}=="0xa801",ATTRS{subsystem_vendor}=="0x144d", RUN+="/usr/local/sbin/rebind_pci_driver.sh %k vfio-pci"
我们称之为脚本:
#!/bin/sh
set -e
logger -t "$0" "Rebind device $1 to driver $2."
echo "$1" >"/sys/bus/pci/devices/$1/driver/unbind"
sleep 1
echo "$1" >"/sys/bus/pci/drivers/$2/bind"