久しぶりに udev を設定しようとして思いがけず時間を消耗してしまったので,注意点について紹介します.
落とし穴
udev ルールは,ベンダーIDやプロダクトIDを文字列として比較します.
大文字と小文字は区別されます.
ルールの記述に使う ID には通常小文字が使われるので,下記のように表記すると意図通りに動作しません.
1 |
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0590", ATTR{idProduct}=="00CC", MODE="0664", GROUP="nut", SYMLINK+="ups" |
「ATTR{idProduct}==”00CC”」を「ATTR{idProduct}==”00cc”」に直すと動くようになります.
ルール記載の Tips
ルールを書く際の参考情報につい手紹介します.
udev ルールで使える属性の一覧
特定のデバイスに関し,udev ルールで使える属性を知りたい場合,udevadm info
コマンドが使えます.
具体的には,ベンダー ID が 0590 のデバイスの属性を表示したい場合,次のようにします.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
% udevadm info $(find /sys/devices -name 'idVendor' | xargs grep -l 0590 | xargs dirname) --attribute-walk Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.1': KERNEL=="2-2.1" SUBSYSTEM=="usb" DRIVER=="usb" ATTR{authorized}=="1" ATTR{avoid_reset_quirk}=="0" ATTR{bConfigurationValue}=="1" ATTR{bDeviceClass}=="00" ATTR{bDeviceProtocol}=="00" ATTR{bDeviceSubClass}=="00" ATTR{bMaxPacketSize0}=="8" ATTR{bMaxPower}=="100mA" ATTR{bNumConfigurations}=="1" ATTR{bNumInterfaces}==" 1" ATTR{bcdDevice}=="0100" ATTR{bmAttributes}=="e0" ATTR{busnum}=="2" ATTR{configuration}=="" ATTR{devnum}=="4" ATTR{devpath}=="2.1" ATTR{idProduct}=="00cc" ATTR{idVendor}=="0590" ATTR{ltm_capable}=="no" ATTR{manufacturer}=="OMRON" (以下,省略) |
udev ルールのテスト
記述した udev ルールをテストするには,ルールを読み直した後,udevadm test
コマンドが使えます.
具体的には,ベンダー ID が 0590 のデバイス対するルールをテストする場合,次のようにします.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
% sudo udevadm control --reload-rules % sudo udevadm test $(find /sys/devices -name 'idVendor' | xargs grep -l 0590 | xargs dirname) Trying to open "/etc/systemd/hwdb/hwdb.bin"... Trying to open "/etc/udev/hwdb.bin"... Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"... Trying to open "/lib/systemd/hwdb/hwdb.bin"... Trying to open "/lib/udev/hwdb.bin"... === trie on-disk === (中略) 2-2.1: /usr/lib/udev/rules.d/50-udev-default.rules:13 Importing properties from results of builtin command 'usb_id' 2-2.1: /usr/lib/udev/rules.d/50-udev-default.rules:13 Importing properties from results of builtin command 'hwdb --subsystem=usb' 2-2.1: hwdb modalias key: "usb:v0590p00CC:BL75T" 2-2.1: /usr/lib/udev/rules.d/50-udev-default.rules:50 MODE 0664 2-2.1: /usr/lib/udev/rules.d/60-drm.rules:3 Importing properties from results of builtin command 'path_id' 2-2.1: /etc/udev/rules.d/90-omron-ups.rules:7 GROUP 124 2-2.1: /etc/udev/rules.d/90-omron-ups.rules:7 MODE 0664 2-2.1: /etc/udev/rules.d/90-omron-ups.rules:7 LINK 'ups' 2-2.1: Preserve permissions of /dev/bus/usb/002/004, uid=0, gid=124, mode=0664 2-2.1: Handling device node '/dev/bus/usb/002/004', devnum=c189:131 2-2.1: sd-device: Created db file '/run/udev/data/c189:131' for '/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.1' (以下,省略) |
上の例では,/etc/udev/rules.d/90-omron-ups.rules
に記載した,下記のルールが適用される様が読み取れます.
1 |
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0590", ATTR{idProduct}=="00CC", MODE="0664", GROUP="nut", SYMLINK+="ups" |
コメント