Udev-Regel für Nicht-Root-Benutzer zum Aufheben der Bindung von PCI-Treibern?

Udev-Regel für Nicht-Root-Benutzer zum Aufheben der Bindung von PCI-Treibern?

Ich versuche, eine Reihe von Udev-Regeln zu schreiben, die es einem Benutzer in einer KVM-Gruppe ermöglichen, Treiber auf einem PCI-Gerät zu trennen. Die betreffenden Befehle sind:

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

Ich möchte diese als Benutzer in der KVM-Gruppe ausführen können, hatte bisher aber kein Glück. Ursprünglich habe ich versucht, die Gruppe auf dem Gerät selbst einzurichten, dann sowohl die xhci_hcd- als auch die vfio-pci-Treiber, wobei ich Variationen des Folgenden verwendet habe:

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"

Dies hatte jedoch keine Wirkung. Ich habe sogar versucht, die Gruppe testweise auf den gesamten Subsystemen einzurichten, und es gab keine Berechtigungsänderungen. Ich gehe also davon aus, dass ich etwas völlig falsch mache.

Irgendwelche Hinweise, was ich falsch mache? Danke.

Antwort1

Nun, ich bin nicht sicher, ob die Frage selbst nicht bestimmte Ergebnisse erwartet, die es eher schwieriger als einfacher machen können, Ihre Antwort zu erhalten.

Erstens: Sie sollten „udevadm info -a -p /sys/devices/“ verwenden, um zu überprüfen, ob die KERNEL-/SUBSYSTEM-Attribute, die Sie verwenden wollten, wirklich diejenigen sind, die vom Kernel verwendet werden.

Zweitens: Wenn es schließlich übereinstimmt, können Sie Ihre Neubindungsbefehle einfach direkt aus den Udev-Regeln ausführen.

Hier ist ein Beispiel basierend aufhttp://vogelchr.blogspot.com/2016/02/linuxudev-unbinding-from-one-kernel.htmldas ich für mein PCI-Gerät (nämlich NVMe-SSD) geändert habe, da sich der Bindungsmechanismus bei mir auf dem Kernel 4.15+ anders verhält.

udev-Regel:DRIVER=="nvme", ATTRS{subsystem_device}=="0xa801",ATTRS{subsystem_vendor}=="0x144d", RUN+="/usr/local/sbin/rebind_pci_driver.sh %k vfio-pci"

Und das Skript, das wir aufrufen:

#!/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"

verwandte Informationen