Ubuntu Weekly Recipe

第559回 デバイスの認識をモニタリング・コントロールできる「udevadm」

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

udevadmの使い方

udevadmはudevに問い合わせ・操作を行うためのコマンドラインツールです※1⁠。たとえば認識済みのデバイスのudevイベント情報を表示してルールファイルを作る際の参考にしたり,イベントの内容をリアルタイム標準出力に出すことでホットプラグ時のイベントを確認できます。

※1
以前はudevadmとサブコマンドの形式ではなく,udevinfoやudevmonitorなど独立したコマンドが用意されていたようです。古い記事やドキュメントには古いコマンドが記載されていますので,適宜読み替えるようにしてください。

udevのイベントを表示する「monitor」

いちばんわかりやすいのがudevのイベントを表示するmonitorサブコマンドでしょう。起動はudevadm monitorを実行するだけです。終了はCtrl-Cを押してください。

$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[2372.548228] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1 (usb)
KERNEL[2372.557788] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0 (usb)
KERNEL[2372.557830] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1 (bluetooth)
KERNEL[2372.560659] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill3 (rfkill)
KERNEL[2372.560726] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0 (usb)
KERNEL[2372.560765] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.1 (usb)
KERNEL[2372.560800] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.1 (usb)
KERNEL[2372.560842] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-1 (usb)
UDEV  [2372.564150] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1 (usb)
UDEV  [2372.574859] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0 (usb)
UDEV  [2372.582759] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1 (bluetooth)
UDEV  [2372.583224] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.1 (usb)
UDEV  [2372.597518] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.1 (usb)
UDEV  [2372.603887] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill3 (rfkill)
UDEV  [2372.610413] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0 (usb)
UDEV  [2372.613674] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-1 (usb)

上記はBluetoothドングルを接続した時のイベントです。実際はcgroupあたりのイベントも表示されますが,今回は間引いています。

KERNELで始まる行はカーネルから届いたueventです。udevはueventを受け取って,それを元にルールファイルを処理し,UDEVで始まる行を出力します。第555回「ACTIONとGOTO変数」でも紹介しているように,⁠add」「デバイスの追加」「bind」「ドライバーとデバイスが紐付けられた」状態となります。

「/devices/」で始まる文字列はイベントターゲットのデバイスパスです。これはそのまま「/sys」以下のディレクトリパスです。

たとえばこのPCはPCIバスのBus 00,Device 14,Function 0にUSBコントローラーがぶら下がっています。デバイスパスの「/pci0000:00/0000:00:14.0/usb3/」がそれに該当します。

さらに今回つないだUSBポートは,Bus 3,Port 1のUSBハブにつながっているようです。実際にlsusbしてみるとそれらしきデバイスが見えます。

$ lsusb -t
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Wireless, Driver=btusb, 12M
    |__ Port 1: Dev 5, If 1, Class=Wireless, Driver=btusb, 12M

このBluetoothドングルはインターフェースが2つあるようですね。

monitorサブシステムは-pオプションを渡すと,プロパティも表示してくれます。プロパティは第555回で紹介したマッチングルールで利用できる値です。manページには記載がありませんが,過去との互換性のために-pのエイリアスとして--envオプションを使うことも可能です。

$ udevadm monitor -p
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[4456.035750] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1 (usb)
ACTION=add
BUSNUM=003
DEVNAME=/dev/bus/usb/003/011
DEVNUM=011
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1
DEVTYPE=usb_device
MAJOR=189
MINOR=266
PRODUCT=a12/1/8891
SEQNUM=7674
SUBSYSTEM=usb
TYPE=224/1/1

KERNEL[4456.042898] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0 (usb)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0
DEVTYPE=usb_interface
INTERFACE=224/1/1
MODALIAS=usb:v0A12p0001d8891dcE0dsc01dp01icE0isc01ip01in00
PRODUCT=a12/1/8891
SEQNUM=7675
SUBSYSTEM=usb
TYPE=224/1/1

KERNEL[4456.043027] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1 (bluetooth)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1
DEVTYPE=host
SEQNUM=7676
SUBSYSTEM=bluetooth

KERNEL[4456.043083] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill10 (rfkill)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill10
RFKILL_NAME=hci1
RFKILL_STATE=1
RFKILL_TYPE=bluetooth
SEQNUM=7677
SUBSYSTEM=rfkill

(中略)

UDEV  [4456.067158] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0 (usb)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0
DEVTYPE=usb_interface
DRIVER=btusb
ID_MODEL_FROM_DATABASE=Bluetooth Dongle (HCI mode)
ID_USB_CLASS_FROM_DATABASE=Wireless
ID_USB_PROTOCOL_FROM_DATABASE=Bluetooth
ID_USB_SUBCLASS_FROM_DATABASE=Radio Frequency
ID_VENDOR_FROM_DATABASE=Cambridge Silicon Radio, Ltd
INTERFACE=224/1/1
MODALIAS=usb:v0A12p0001d8891dcE0dsc01dp01icE0isc01ip01in00
PRODUCT=a12/1/8891
SEQNUM=7675
SUBSYSTEM=usb
TYPE=224/1/1
USEC_INITIALIZED=4456066552

UDEV  [4456.090457] add      /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill10 (rfkill)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill10
ID_PATH=pci-0000:00:14.0-usb-0:1:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_1_0
RFKILL_NAME=hci1
RFKILL_STATE=1
RFKILL_TYPE=bluetooth
SEQNUM=7677
SUBSYSTEM=rfkill
SYSTEMD_RFKILL=1
USEC_INITIALIZED=4456090248

詳細な解説は省きますが,usbサブシステムの特定のポートにデバイスがaddされてから,udevにイベントが渡っていく様子がわかります。さらにudev自身がルールファイルを元に,さまざまなプロパティを追加していることもわかります。

USBなどのホットプラグなデバイスに対してルールファイルを作成する際は,この出力結果が参考になるでしょう。

著者プロフィール

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

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