
我正在嘗試編寫一組 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"