udevinfoとudevmonitor

11月 15, 2009

Linux LPIC編。(第3章 デバイスとファイルシステム)
udevは、LinuxでUSBなど動的なデバイスを効率よく管理する仕組み。
が、本題のudevに入る前に、Linuxデバイスファイルの概念を少し。

[ブロックデバイスとキャラクタデバイス]
デバイスファイルにはブロックデバイスとキャラクタデバイスがある。
(ls -l /dev を実行したときに、先頭がbならブロック、cならキャラクタデバイス)

ブロックデバイスはブロック単位でデバイスにアクセスし、ハードディスク、RAMディスク、
RAIDボリュームなどが相当する。
キャラクタデバイスはキャラクタ(文学)単位でのアクセスとなり、キーボード、マウス、
端末、プリンタなどが相当する。
上記のデバイスファイル群は通常のファイルと違い、カーネルがデバイスを識別するため
に定められている、メジャー番号・マイナー番号が付与されている。

[udev]
udevの仕組みについて。・・・が、これは以前の投稿Linuxにおけるudev、hald、lsusbなど
で書いているので、ここでは簡単に。
新しいデバイスをカーネルが認識すると、udevdはsysfsの情報を元に必要なデバイス
ファイルを作成する。その際にudevが参照するルールファイルのパスは以下。

udevのルールファイル
/etc/udev/rules.d ディレクトリ以下の各ファイル


sysfsがどのようにデバイスを扱っているかという情報は、udevinfoコマンドで確認できる。

オプション
-a 指定したデバイスの上位のデバイスについても表示
-p sysfs上のデバイスを指定
-n /dev以下のデバイスファイルを指定
-q 種類  表示する情報の種類を指定(name,symlink,path,env,all)


以下、コマンド結果例を。

# udevinfo -q path -n /dev/sda1
/block/sda/sda1 ←sysfs上のパスが表示される


以下の出力内容は、すべての情報を出力している。
指定するパスを-pオプションをつけてsysfs上の /block/sda/sda1 としても同じ。

# udevinfo -q all -p /block/sda/sda1
P: /block/sda/sda1
N: sda1
S: disk/by-id/scsi-SATA_IC25N020ATDA04-_63A63LY7869-part1
S: disk/by-id/ata-IC25N020ATDA04-0_63A63LY7869-part1
S: disk/by-path/pci-0000:00:04.0-scsi-0:0:0:0-part1
S: disk/by-uuid/4a540a29-2e17-4990-a2ec-8c2ef5837766
S: disk/by-label/¥x2fboot
E: DEVTYPE=partition
E: ID_VENDOR=ATA
E: ID_MODEL=IC25N020ATDA04-0
E: ID_REVISION=DA3O
E: ID_SERIAL=SATA_IC25N020ATDA04-_63A63LY7869
E: ID_SERIAL_SHORT=63A63LY7869
E: ID_TYPE=disk
E: ID_BUS=scsi
E: ID_ATA_COMPAT=IC25N020ATDA04-0_63A63LY7869
E: ID_PATH=pci-0000:00:04.0-scsi-0:0:
  :
  :
 (略)


udevmonitorコマンドで、udevの動作をリアルタイム監視できる。
以下は、USBメモリを挿したときの出力例。

# udevmonitor – -kernel
udevmonitor will print the received events for:
UEVENT the kernel uevent

UEVENT[1257755480.198388] add /devices/pci0000:00/0000:00:02.0/usb1/1-2 (usb)
UEVENT[1257755480.198645] add /class/usb_endpoint/usbdev1.3_ep00 (usb_endpoint)
UEVENT[1257755480.203141] add /devices/pci0000:00/0000:00:02.0/usb1/1-2/1-2:1.0 (usb)
UEVENT[1257755480.203303] add /class/usb_endpoint/usbdev1.3_ep81 (usb_endpoint)
UEVENT[1257755480.203341] add /class/usb_endpoint/usbdev1.3_ep02 (usb_endpoint)
UEVENT[1257755481.753567] add /module/usb_storage (module)
UEVENT[1257755481.811212] add /bus/usb/drivers/usb-storage (drivers)
UEVENT[1257755481.822714] add /class/scsi_host/host2 (scsi_host)
UEVENT[1257755486.843679] add /devices/pci0000:00/0000:00:02.0/usb1/1-2

/1-2:1.0/host2/target2:0:0/2:0:0:0 (scsi)
UEVENT[1257755486.847219] add /class/scsi_disk/2:0:0:0 (scsi_disk)
UEVENT[1257755490.046411] add /block/sdb (block)
:
:
(略)


“UEVENT”はカーネルが受け取ったイベントを表す。上の出力例にはないが、
“UDEV”はudevがルールを処理して送信したイベントを意味するらしい。

使うことがあるかどうかは「?」ではあるが、ちょっとだけ物知りになれたかな。

メモ
/proc/devicesでカーネルが認識しているデバイスを確認できる。
sysfsはカーネル内部情報をファイルシステムの形で投影する仕組み。/sysディレクトリ
以下から、システムに接続されているデバイスの情報を得ることができる。

次回から「第4章 高度なストレージ管理」に。

出典
Linux教科書LPICレベル2(翔泳社)


Linux記事一覧はこちらをどうぞ
↓ ↓ ↓
Linux-index


Categories: LPIC