udev_rulesでデバイス名固定とファイル書き込み

udevのrulesでは、とあるデバイスが見つかったり、無くなったりするときに行う行動を決めることができます。

今回の目的

今回行いたい行動は、usb-serialモジュールが接続された時に、FTDIドライバによって生成される、
/sys/bus/usb-serial/devices/ttyUSB0/latency_timer
の値を1に書き換えたいのです。

また、デバイス名が変わられても、いろいろ不便なので固定も同時に行いたいです。

まず、ruleを作るにあたって、デバイスの情報が必要になります。

バイスの情報を得る

簡単に情報を得る方法としてlsusbコマンドを使います。私の場合のお目当てのデバイスの情報の結果は以下になります。

Bus 001 Device 015: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

このとき、

  • Bus番号 001
  • Device番号 015
  • vender番号 0403
  • product番号 6001

となります。

更に情報が欲しい時は、
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)

が便利です。

ruleの表記

次にrulesの書き方として、条件部分と実行部分が必要になります。
条件部分は、どのデバイスに反応するのかで、==で示します。
実行部分は、そのデバイスに対してどんな処理をするのかです。=は変更で、+=は追加です。

以下に一例を示します。

ファイル名、92-test.rules

ACTION=="add", \ #デバイスが見つかった時の実行
KERNEL=="ttyUSB*", \
ATTRS{idVendor}=="0403", \ #vender番号で条件
ATTRS{idProduct}=="6001", \ #product番号で条件
SYMLINK+="ttyUSB_FTDI", \ #新しい別名の追加
MODE="666", \ #権限
RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb-serial/devices/$kernel/latency_timer'" #実行する行動

このファイルを

/etc/udev/rules.d/

に置くことで、完了となります。

注意として、

  • rulesファイル名の最初は連番を降ること
  • 改行には意味があるので、意味のない改行には\を行末につけること、
  • #コメントアウト
  • $kernelはそのデバイスカーネル名の置換である。
  • ruleの変更後は、sudo udevadm control --reload-rules で再読み込みする必要がある。

結果を見てみます。
ls -l /dev/ttyUSB*

crw-rw-rw- 1 root dialout 188, 0 12月 27 20:52 /dev/ttyUSB0
lrwxrwxrwx 1 root root 7 12月 27 20:52 /dev/ttyUSB_FTDI -> ttyUSB0

ttyUSB_FTDIがttyUSB0のリンクとなっており、権限もlrwxrwxrwxとなり、リンクに依存していることが読み取れます。

cat /sys/bus/usb-serial/devices/ttyUSB0/latency_timer

とコマンドを実行すると、1の値が入っていることも分かります。

これでUSBを挿すたびに、コマンドを打たなくて済みそうです

環境
Ubuntu16.04

参考:
udevで値の置換名