虹とトルネード

趣味のこととか少し技術的なこととかメモします

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  422 15:55 nfc -> bus/usb/003/023