udevのカーネルは再起動後も持続しません。

udevのカーネルは再起動後も持続しません。

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]

関連情報