Ubuntu Weekly Recipe

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

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

イベントを発生させる「trigger」

triggerサブコマンドは,任意のイベントをカーネルから発生させられます。もし引数なしに実行した場合は,すべての認識済デバイスにchangeアクションのイベントを送ります。アクションの種類は第555回「ACTIONとGOTO変数」を参照してください。

$ sudo udevadm trigger

実際には事前に別のウィンドウで「udevadm monitor」を実行しておくと,状況がわかりやすいでしょう。

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

KERNEL[960.580785] change   /devices/LNXSYSTM:00 (acpi)
KERNEL[960.580831] change   /devices/LNXSYSTM:00/LNXCPU:00 (acpi)
KERNEL[960.580855] change   /devices/LNXSYSTM:00/LNXCPU:01 (acpi)
KERNEL[960.580883] change   /devices/LNXSYSTM:00/LNXCPU:02 (acpi)
KERNEL[960.580905] change   /devices/LNXSYSTM:00/LNXCPU:03 (acpi)
(中略)
UDEV  [961.259537] change   /devices/virtual/workqueue/writeback (workqueue)
UDEV  [961.259567] change   /devices/virtual/vc/vcsa6 (vc)
UDEV  [961.260298] change   /devices/virtual/vc/vcs4 (vc)
UDEV  [961.261334] change   /devices/pci0000:00/0000:00:1b.0/sound/card0 (sound)
UDEV  [961.268727] change   /devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda (block)

ひたすらchangeイベントが届いていますね。

-cオプションで任意のアクションを指定できますし,末尾にデバイス名やデバイスパスを指定すれば,イベントを送る対象を制限できます。さらに-vオプションを付けておくと,イベントを送る対象のデバイスが表示されます。

$ sudo udevadm trigger -v -c change /dev/bus/usb/003/005
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/bluetooth/hci1/rfkill4
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.1

他にも属性やプロパティ,サブシステムなどでマッチングしてイベントを送る対象を制限できます。詳細はudevのmanページを参照してください。

単に特定のデバイス向けのルールファイルをテストしたいだけなら,testサブコマンドも使えます。

$ sudo udevadm test $(udevadm info -n /dev/bus/usb/003/005 -q path)
calling: test
version 239
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Load module index
Parsed configuration file /lib/systemd/network/99-default.link
Created link configuration context.
Reading rules file: /lib/udev/rules.d/39-usbmuxd.rules
Reading rules file: /lib/udev/rules.d/40-usb-media-players.rules
Reading rules file: /lib/udev/rules.d/40-usb_modeswitch.rules
(中略)
Reading rules file: /lib/udev/rules.d/99-systemd.rules
rules contain 393216 bytes tokens (32768 * 12 bytes), 37665 bytes strings
31410 strings (260972 bytes), 27952 de-duplicated (226766 bytes), 3459 trie nodes used
IMPORT builtin 'usb_id' /lib/udev/rules.d/50-udev-default.rules:13
IMPORT builtin 'hwdb' /lib/udev/rules.d/50-udev-default.rules:13
MODE 0664 /lib/udev/rules.d/50-udev-default.rules:42
handling device node '/dev/bus/usb/003/005', devnum=c189:260, mode=0664, uid=0, gid=0
preserve permissions /dev/bus/usb/003/005, 020664, uid=0, gid=0
preserve already existing symlink '/dev/char/189:260' to '../bus/usb/003/005'
ACTION=add
BUSNUM=003
DEVNAME=/dev/bus/usb/003/005
(後略)

testサブコマンドはデバイスパスしか渡せないので,上記のようにデバイス名からの変換が必要です。

udevデーモンを操作する「control」

controlサブコマンドはudevデーモンそのものを操作するサブコマンドです。あまり使うことはありませんが,ログレベルを一時的に変更できる-lやルールをリロードできる-R」⁠イベントの処理を一時的に停止・再開する-s-Sあたりは,覚えておくとデバッグ時に便利かもしれません。

udevのビルトインコマンドを実行する「test-builtin」

第555回「ENVとRUN変数」でも紹介したように,ルールファイルの中でudevのビルトインコマンドを実行することがあります。このビルトインコマンドをシェルから実行できるのがtest-builtinサブコマンドです。次のようなビルトインコマンドをサポートしています。

  • blkid:UUIDなどを取得する
  • btrfs:btrfs関連の情報取得
  • hwdb:hwdbからデータを取得
  • input_id:入力デバイス関連の情報を取得
  • keyboard:キーマッピングなどをスキャン
  • kmod:カーネルモジュールのロード
  • net_id:ネットワークデバイスの情報取得
  • net_setup_link:ネットワークのリンク設定
  • path_id:デバイスパスの元になる情報の取得
  • usb_id:USB関連の情報を取得
  • uaccess:アクセスコントロール関連の情報取得

ホットプラグ関連だと,usb_idによるUSBデバイス情報がルールファイル作成時の参考になるでしょう。

$ sudo udevadm test-builtin usb_id $(udevadm info -n /dev/bus/usb/003/005 -q path)
calling: test-builtin
Load module index
Parsed configuration file /lib/systemd/network/99-default.link
Created link configuration context.
ID_VENDOR=0a12
ID_VENDOR_ENC=0a12
ID_VENDOR_ID=0a12
ID_MODEL=CSR8510_A10
ID_MODEL_ENC=CSR8510\x20A10
ID_MODEL_ID=0001
ID_REVISION=8891
ID_SERIAL=0a12_CSR8510_A10
ID_BUS=usb
ID_USB_INTERFACES=:e00101:
Unload module index
Unloaded link configuration context.

ルールファイルの中でどのようなプロパティがセットされるか確認したいときに便利です。

著者プロフィール

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

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