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で値の置換名