
Я пытаюсь написать набор правил 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"