
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 속성이 실제로 커널에서 사용되는 속성인지 확인해야 합니다.
둘째: 최종적으로 일치하면 udev 규칙에서 직접 리바인딩 명령을 실행할 수 있습니다.
다음은 다음을 기반으로 한 예입니다.http://vogelchr.blogspot.com/2016/02/linuxudev-unbound-from-one-kernel.html바인딩 메커니즘이 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"