udevを使用してデバイスを一致させ、デバイスが接続されるたびにコマンドを実行しようとしますRUNS
。デバイス(V4L2 USBカメラ)は常に同じUSBポートに接続されているため、そのKERNELS
属性に応じて一致させることができると思いました。私はいつもデバイスのsysfsパスが永続的だと思いましたが、KERNELS
同じUSBポートに接続されている同じデバイスに対して異なるパスと値が表示されます。
$ udevadm info -a /dev/video0
...
looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.4/3-1.4:1.0/video4linux/video0':
KERNEL=="video0"
SUBSYSTEM=="video4linux"
DRIVER==""
...
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.4/3-1.4:1.0':
KERNELS=="3-1.4:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="uvcvideo"
...
今すぐ再起動した後、別の値を取得します。
$ udevadm info -a /dev/video0
...
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/video4linux/video0':
KERNEL=="video0"
SUBSYSTEM=="video4linux"
DRIVER==""
...
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0':
KERNELS=="1-3:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="uvcvideo"
...
そのUSBポートに接続されているデバイスと一致する信頼できるudevルールを作成するにはどうすればよいですか?
パスが変更されても/dev/v4l/by-path
パスは変更されないことがわかりました/sysfs
。/dev/v4l/by-path/pci-0000:00:14.0-usb-0:3:1.0-video-index0
(しかし、これをどのように活用すべきかわかりません)。
答え1
KERNELS
これらのプロパティはUSBポートベースのマッチングには信頼できないことがわかりました。しかし、私はby-path
シンボリックリンクを利用する方法を見つけました:Match via SYMLINK=="..."
。
そのデバイスの場合は、次のように表示されます。
SYMLINK=="v4l/by-path/pci-0000:00:14.0-usb-0:3:1.0-video-index0"
ID_PATH
同様の方法で使用できるデバイス属性もあります。
シンボリックリンクとデバイスプロパティは、次のようにリストできます。
udevadm info -q all [device_path_or_name]