第555回ではデバイスの自動認識やデバイス名の設定など、
udevのデバッグ方法
udevはまずinitシステムからudevdが起動され、
- カーネルパラメーターから指定する
- /etc/
udev/ udev. confから設定する - udevadmコマンドから設定する
- 環境変数
SYSTEMD_
で設定するLOG_ LEVEL
このうち起動直後からdebugレベルにしたり、
カーネルパラメーターから指定する
比較的設定しやすいのがカーネルパラメーターに設定する方法です。次のようなパラメーターを設定します。
udev.log_priority=debug rd.udev.log_priority=debug
「rd.
」
カーネルパラメーターは/etc/
」GRUB_
」
GRUB_CMDLINE_LINUX="udev.log_priority=debug"
エディタを使用しないなら次のコマンドを実行します。
$ sudo sed -i 's/^\(GRUB_CMDLINE_LINUX=".*\)"/\1 udev.log_priority=debug"/' /etc/default/grub $ sudo update-grub
エディタを使用するしないに関わらず、update-grub
」
カーネルパラメーターに指定したパラメーターが表示されていることを確認しましょう。
$ cat /proc/cmdline (略) ro udev.log_priority=debug quiet splash vt.handoff=1
ログを見るとudev関連のログが大量に出ています。たとえば次の内容から、
$ journalctl -b 0 | grep Reading (略) systemd-udevd[304]: Reading rules file: /lib/udev/rules.d/39-usbmuxd.rules (略) systemd-udevd[304]: Reading rules file: /lib/udev/rules.d/40-usb-media-players.rules (後略)
デバッグログはかなりの量が出力されますし、
/etc/udev/udev.confから設定する
もうひとつよく紹介されるのがudev.
設定ファイルは/etc/
」#
」
udev_log="debug"
さらにこの設定ファイルはudevが起動するinitramfsの中に含まれている必要があります。Ubuntuの場合、
$ sudo update-initramfs -u
ちなみに/usr/
」
udevadmの使い方
「udevadm
」
udevのイベントを表示する「monitor」
いちばんわかりやすいのがudevのイベントを表示するmonitorサブコマンドでしょう。起動は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[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を受け取って、
「/devices/」
たとえばこのPCはPCIバスのBus 00、
さらに今回つないだUSBポートは、
$ 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
」-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などのホットプラグなデバイスに対してルールファイルを作成する際は、
デバイスのイベント情報を表示する「info」
認識済みのデバイスの情報-n
」
$ udevadm info -n /dev/bus/usb/003/005 P: /devices/pci0000:00/0000:00:14.0/usb3/3-1 N: bus/usb/003/005 E: BUSNUM=003 E: DEVNAME=/dev/bus/usb/003/005 E: DEVNUM=005 E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1 E: DEVTYPE=usb_device E: DRIVER=usb E: ID_BUS=usb E: ID_MODEL=CSR8510_A10 E: ID_MODEL_ENC=CSR8510\x20A10 E: ID_MODEL_FROM_DATABASE=Bluetooth Dongle (HCI mode) E: ID_MODEL_ID=0001 E: ID_REVISION=8891 E: ID_SERIAL=0a12_CSR8510_A10 E: ID_USB_INTERFACES=:e00101: E: ID_VENDOR=0a12 E: ID_VENDOR_ENC=0a12 E: ID_VENDOR_FROM_DATABASE=Cambridge Silicon Radio, Ltd E: ID_VENDOR_ID=0a12 E: MAJOR=189 E: MINOR=260 E: PRODUCT=a12/1/8891 E: SUBSYSTEM=usb E: TYPE=224/1/1 E: USEC_INITIALIZED=481849865
USBデバイスは/dev/
」/dev/
」
さてinfoサブコマンドで表示されるデータには次のようなヘッダーが付けられています。
- P:デバイスパス
- N:デバイス名
- L:リンクプライオリティ
[2] - S:シンボリックリンク
- E:プロパティ
デバイスファイルが作られない場合、-p
」
$ udevadm info -p /devices/pci0000:00/0000:00:14.0/usb3/3-1
得られる結果はデバイス名を指定したときと、
特定の情報だけを取得したい場合は-q
」
$ udevadm info -n /dev/bus/usb/003/005 -q path /devices/pci0000:00/0000:00:14.0/usb3/3-1
他にもデバイス名
「-a
」
$ udevadm info -n /dev/bus/usb/003/005 -a (中略) looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-1': KERNEL=="3-1" SUBSYSTEM=="usb" DRIVER=="usb" (中略) ATTR{urbnum}=="130" ATTR{version}==" 2.00" looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3': KERNELS=="usb3" SUBSYSTEMS=="usb" DRIVERS=="usb" (中略) ATTRS{urbnum}=="79" ATTRS{version}==" 2.00" looking at parent device '/devices/pci0000:00/0000:00:14.0': KERNELS=="0000:00:14.0" SUBSYSTEMS=="pci" DRIVERS=="xhci_hcd" ATTRS{subsystem_device}=="0x8338" ATTRS{subsystem_vendor}=="0x10f7" ATTRS{vendor}=="0x8086" (中略) looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS==""
イベントを発生させる「trigger」
triggerサブコマンドは、
$ sudo udevadm trigger
実際には事前に別のウィンドウで
$ 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
他にも属性やプロパティ、
単に特定のデバイス向けのルールファイルをテストしたいだけなら、
$ 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回の
blkid
:UUIDなどを取得するbtrfs
:btrfs関連の情報取得hwdb
:hwdbからデータを取得input_
:入力デバイス関連の情報を取得id keyboard
:キーマッピングなどをスキャンkmod
:カーネルモジュールのロードnet_
:ネットワークデバイスの情報取得id net_
:ネットワークのリンク設定setup_ link path_
:デバイスパスの元になる情報の取得id usb_
:USB関連の情報を取得id uaccess
:アクセスコントロール関連の情報取得
ホットプラグ関連だと、usb_
による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.
ルールファイルの中でどのようなプロパティがセットされるか確認したいときに便利です。