udevでデバイス名を固定する
カーネルで認識するデバイスファイル名は、デバイスの抜き差しを行った時に変わってしまう場合がある。 そういった場合、デバイスファイルに直接読み書きを行うプログラムを作るとデバイスファイル名が定まらないために面倒なことになる。
こっちとしては特定の機器が接続された時、特定のデバイスファイルとしてアクセスしたいのである。
udev
の恩恵にすがると動的にデバイスファイルを作成してくれる。その作成されたデバイスファイルはカーネルが認識したデバイスファイルのリンクである。
今回は手元にあったソニーのNFCカードリーダを使ってデバイス名を固定にしてみたのをメモ。
- 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 hoge kernel: [455013.359205] usb 3-10.3: new full-speed USB device number 22 using xhci_hcd Apr 22 15:24:42 hoge kernel: [455013.377018] usb 3-10.3: New USB device found, idVendor=054c, idProduct=06c1 Apr 22 15:24:42 hoge kernel: [455013.377022] usb 3-10.3: New USB device strings: Mfr=1, Product=2, SerialNumber=4 Apr 22 15:24:42 hoge kernel: [455013.377024] usb 3-10.3: Product: RC-S380/S Apr 22 15:24:42 hoge kernel: [455013.377026] usb 3-10.3: Manufacturer: SONY Apr 22 15:24:42 hoge kernel: [455013.377028] usb 3-10.3: SerialNumber: 0011179 Apr 22 15:24:42 hoge kernel: [455013.378153] port100 3-10.3:1.0: NFC: Sony NFC Port-100 Series attached (firmware v1.11) Apr 22 15:24:42 hoge 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 hoge 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