非 root 使用者取消綁定 pci 驅動程式的 udev 規則?

非 root 使用者取消綁定 pci 驅動程式的 udev 規則?

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

相關內容