Ubuntu Weekly Recipe

第555回 いま,あらためてudev

この記事を読むのに必要な時間:およそ 7 分

デバイスに対するシンボリックリンクの追加

もう一つの例が,特定のデバイスファイルに対するシンボリックリンクの追加です。

「/dev」以下のデバイスファイルは,一般的にはカーネルが認識順に付けた名前で作られます。たとえば最初に認識したSATAやUSBマスストレージの名前は「/dev/sda」ですし,次に認識すると「/dev/sdb」と名付けられます。ノートPCにも組み込まれることが増えてきたMMCブロックデバイスは「/dev/mmcblk0」⁠/dev/mmcblk1」と増えていきますし,NMVeならコントローラーごとに「/dev/nvme0」⁠/dev/nmve1」となり,さらにコントローラーのノードは「/dev/nvme0n1」などの数字が付けられます。

ポイントは「認識順」であることです。何がしかの理由で起動ごとに認識順が入れ替わってしまう場合,このデバイスファイル名は起動ごとに変わってしまうことになります。

そこで必要になるのが起動ごとに固有の名前になる「永続的なデバイス名」です。たとえば最近のUbuntuだと,ネットワークインターフェース名が「eth0」のような名前から,次のような固有の名前に変更されました。

  • enp0s25:Ethernet(en)⁠PCIのBus 0,Slot 25(p0s25)
  • enx001de1570857:Ethernet(en)⁠MACアドレス(xMACADDR)
  • wlp3s0:Wireless LAN(wl)⁠PCIのBus 3,Slot 0(p3s0)

他にもACPIテーブル上にデバイスインデックスが付いていたら「eno1」になります。このようにPCIバスのどこに接続されているかやMACアドレスがなんであるかなどの,固有の情報を元に名前が付けれるのです。

実はすでに既存のルールで,デバイス固有の情報に基づいたシンボリックリンクが「/dev/サブシステム/by-タイプ/」以下に作られていいます。たとえば先程のシリアルコンソールデバイスだと次のようなシンボリックリンクが作られているのです。

$ ls -l /dev/serial/by-id/
lrwxrwxrwx 1 root root 13  2月  3 20:11 usb-FTDI_TTL232R-3V3_FTGC0U6E-if00-port0 -> ../../ttyUSB0
$ ls -l /dev/serial/by-path/
lrwxrwxrwx 1 root root 13  2月  3 20:11 pci-0000:00:14.0-usb-0:1:1.0-port0 -> ../../ttyUSB0

ただし若干長いですね。そこで「/dev/ftdi」をシンボリックリンクに追加してみましょう。先程作成した「/etc/udev/rules.d/65-serial.rules」を次のように変更します。

ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"
ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6001", MODE="0666", SYMLINK+="ftdi"
LABEL="serial_end"

SYMLINK変数にパス名を追加すると,⁠/dev/」以下のその名前でシンボリックリンクを作ってくれます。他のルールがSYMLINK変数を設定しているため,⁠+=」で値を追加しています。このようにSYMLINKには複数の値を入れておくと,その数だけシンボリックリンクを作ってくれるのです。

設定をリロードした上で,デバイスを再度つなげてみましょう。次のようにシンボリックリンクが作られていたら成功です。

$ ls -l /dev/ftdi
lrwxrwxrwx 1 root root 7  2月  3 20:21 /dev/ftdi -> ttyUSB0

さらにデバイスを取り外すと,シンボリックリンクが消えていることでしょう。

このようにudevのルールファイルを書けば,デバイス認識時の挙動を細かく設定できます。特にUSBやThunderbolt,Bluetoothなどのホットプラガブルなデバイスを使うときに効力を発揮することでしょう。より詳細に設定するために,まずはudevのmanページを参照してください。udevadmなどの便利ツールもありますが,これについてはまた別の機会にお話することにしましょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。