Posted at

udevでデバイス名を固定する

More than 3 years have passed since last update.


はじめに

カーネルで認識するデバイスファイル名は、デバイスの抜き差しを行った時に変わってしまう場合がある。

そういった場合、デバイスファイルに直接読み書きを行うプログラムを作るとデバイスファイル名が定まらないために面倒なことになる。

こっちとしては特定の機器が接続された時、特定のデバイスファイルとしてアクセスしたいのである。

udevの恩恵にすがると動的にデバイスファイルを作成してくれる。その作成されたデバイスファイルはカーネルが認識したデバイスファイルのリンクである。

今回は手元にあったソニーのNFCカードリーダhを使ってデバイス名を固定にしてみたのをメモ。


  • ubuntu14.04


USB情報を取得

まず、必要なのはデバイスのUSB情報にあるベンダーIDプロダクトIDだ。ベンダーIDは企業ごとにあるIDでマックアドレスのベンダーコードよのうなもの。プロダクトIDは名前の通り、プロダクトのIDで企業が決めるIDである。

今回使うNFCカードリーダーを調べたところ以下の通りだった。

vender
product

0x054c
0x06c1

usbの接続情報をみる方法はいくつかある。


lsusb

lsusbコマンドを打つとずらっと接続の情報がでる。接続したデバイスが何かを調べる場合、プリミティブな方法だが抜き差しでの表示する差分で把握する。

$ lsusb

Bus 002 Device 002: ID 8087:8001 Intel Corp.
Bus 003 Device 016: ID 054c:06c1 Sony Corp.
:
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

割り当てられたUSB BUSがわかったら、更に詳細を表示してみる。(長いから省略)

$ lsusb -s 003:016 -v

Bus 003 Device 022: ID 054c:06c1 Sony Corp.
:
idVendor 0x054c Sony Corp.
idProduct 0x06c1
:


syslog

syslogを監視してデバイス情報を得る。

$ tail -f /var/log/syslog

Apr 22 15:24:42 sss-trz kernel: [455013.359205] usb 3-10.3: new full-speed USB device number 22 using xhci_hcd
Apr 22 15:24:42 sss-trz kernel: [455013.377018] usb 3-10.3: New USB device found, idVendor=054c, idProduct=06c1
Apr 22 15:24:42 sss-trz kernel: [455013.377022] usb 3-10.3: New USB device strings: Mfr=1, Product=2, SerialNumber=4
Apr 22 15:24:42 sss-trz kernel: [455013.377024] usb 3-10.3: Product: RC-S380/S
Apr 22 15:24:42 sss-trz kernel: [455013.377026] usb 3-10.3: Manufacturer: SONY
Apr 22 15:24:42 sss-trz kernel: [455013.377028] usb 3-10.3: SerialNumber: 0011179
Apr 22 15:24:42 sss-trz kernel: [455013.378153] port100 3-10.3:1.0: NFC: Sony NFC Port-100 Series attached (firmware v1.11)
Apr 22 15:24:42 sss-trz mtp-probe: checking bus 3, device 22: "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10.3"
Apr 22 15:24:42 sss-trz mtp-probe: bus: 3, device: 22 was not an MTP device


udevルールの作成

/etc/udev/rules.dにルールファイルを作成する。書き方の詳細

$ sudo vim /etc/udev/rules.d/80-nfc.rules

SUBSYSTEM=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="06c1", SYMLINK+="nfc"

早速抜き差ししてデバイスフォルダを見てみる

$ ls -la | grep nfc

lrwxrwxrwx 1 root root 15 4月 22 15:55 nfc -> bus/usb/003/023