
私は、グループ kvm のユーザーが PCI デバイスのドライバーをアンバインドできるようにするための udev ルールのセットを記述しようとしています。問題のコマンドは次のとおりです。
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 属性が実際にカーネルによって使用されているものであるかどうかを確認する必要があります。
2 番目: 最終的に一致した場合は、udev ルールから再バインド コマンドを直接実行できます。
以下は、参考: Linux カーネルから unbinding を実行するには、次の手順を実行します。4.15 以降のカーネルではバインディング メカニズムの動作が異なるため、PCI デバイス (NVMe SSD) 用に変更しました。
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"