USB機器(おんどとり)を固定デバイス名で使う方法

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

新年も明けまして大分経ってしまいますが、私(mi2yo4)にとって今年初エントリとなります。
今年も宜しくお願いします。

さて、今日はLinux上でUSBを抜き差しした際に困る点について調べてみました。

困った現象:USBデバイス名がころころ変わる

現在職場の実験マシンではFedora release18 を使っています。
この実験マシンにUSBデバイスを抜き差しするとタイミングによってlinux上のデバイス名が/dev/ttyUSB0になったり/dev/ttyUSB1になったりしてしまいます。

これが何故困るかと言いますと…
linux上でお目当てのデバイスにアクセスしたい場合に/dev/ttyUSB0等で指定するのですが、そのデバイス名がコロコロ変わってしまうとアクセス出来なくなってしまうのです。

今回具体的に困ったのは、「おんどとり」という温度・湿度ロガーをUSB-シリアル変換器を通して計測値を取得しているのですが、linux上で管理しているデバイス名が変わってしまう場合があり、USBを抜き差しすると上手く取得出来ないという現象がありました。

11864061393_fb180cda97_n

ちなみに上記写真がおんどとりです。写真がボケ気味なのはカメラマン(=私)の撮り方が悪かったためです…

linuxでデバイスを管理しているudev

linux上のデバイス管理について調べてみますと、最近ではudevがlinux上でデバイス管理を行っているようです。
archlinux – udev (日本語)

USB機器をホットプラグ出来るようにはなったのですが、標準のままですとデバイス番号はランダムに割り付けらます。ここが今回の問題点となっているようです。
…出来ればこのデバイスだけは固定のデバイス名を割りつけたいですよねぇ?

固定デバイス名を割りつけたい

USBシリアル変換器のIDを調査する

上記で紹介したページの下の方に、そのものズバリ「固定デバイス名の設定」という項目がありますので、それを参考に設定してみましょう。

まずはUSB-シリアル変換器を抜き差ししてメッセージを見てみましょう。

# tail -f /var/log/messages
Jan  9 16:48:19 itkobo kernel: [1044278.177019] usb 5-2: new full-speed USB device number 5 using uhci_hcd
Jan  9 16:48:20 itkobo kernel: [1044278.326021] usb 5-2: New USB device found, idVendor=0557, idProduct=2008
Jan  9 16:48:20 itkobo kernel: [1044278.326025] usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Jan  9 16:48:20 itkobo kernel: [1044278.326028] usb 5-2: Product: USB-Serial Controller D
Jan  9 16:48:20 itkobo kernel: [1044278.326031] usb 5-2: Manufacturer: Prolific Technology Inc.
Jan  9 16:48:20 itkobo kernel: [1044278.329070] pl2303 5-2:1.0: pl2303 converter detected
Jan  9 16:48:20 itkobo kernel: [1044278.341089] usb 5-2: pl2303 converter now attached to ttyUSB0
Jan  9 16:48:20 itkobo mtp-probe: checking bus 5, device 5: "/sys/devices/pci0000:00/0000:00:1a.2/usb5/5-2"
Jan  9 16:48:20 itkobo mtp-probe: bus: 5, device: 5 was not an MTP device

USBが挿された事を示すログが出てきたかと思います。ここでidVendorの値とidProductの値をメモしておきましょう。
今回の場合ではidVender=0557,idProduct=2008となります。

/etc/udev/rules.d/以下にルールを記述する

先ほど調べたidVendor,idProductを使ってudevルールを作成します。
/etc/udev/rules.d/以下に適当な名前をつけてテキストファイルを作成しましょう。
適当といってもある程度のフォーマットは決まっていて、0詰め2桁数値-名前.rulesとしましょう。

99-local.rules

今回は上記の名前でファイルを作成しました。
数値は小さい方が優先度が高いようです(だった気がします…)。今回は一番低めの99としました。

KERNEL=="ttyUSB*", ATTRS{idVendor}=="0557", ATTRS{idProduct}=="2008", SYMLINK+="ttyUSBSerial"

99-local.rulesの内容は上記の通りに記述しました。idVendorが0557,idProductが2008の場合はttyUSBSerialというシンボリックリンクを作成してね、という意味合いです。
“==”を間違えて”=”と記述しないで下さいね(私はしましたが…ここで少しハマりましたorz)

そして実行!

記述した内容が問題なければ、udevデーモンの再起動などは必要ないようです。そのままUSBシリアル変換器を抜き差しして動作確認しましょう。

crw-rw---- 1 root dialout 188, 0  1月 10 10:20 /dev/ttyUSB0
lrwxrwxrwx 1 root root         7  1月  9 16:52 /dev/ttyUSBSerial -> ttyUSB0

お!無事にリンクが貼られたようです。
これからは/dev/ttyUSB0を使うのではなく、/dev/ttyUSBSerialを指定すれば固定デバイス番号(ちっく)に使えるというわけですね!