はじめに
前節では、ドライバからユーザーランド層へのやり取りを行う方法として、ueventについて説明しました。受け取り方として、AOSPのuevent_next_event関数を用いて説明しましたが、ueventはAOSPだけでは無く、Ubuntu等の汎用的なLinuxにおいても使われている仕組みです。代表的な物にudevがあり、udevの構成要素である、ueventの情報を取得できるudevadmと、ueventの情報を元に設定した各種処理を行うudevdについて、本節で触れておきます。
udevadm について
udevadm は udev の管理ツールです。本節ではこの管理ツールを用いて、前節で説明したueventの内容を確認する方法を紹介します。udevadm の 引数に monitor を指定する事でueventの内容を確認できます。pオプションを使う事で、前節で説明したkobject_uevent_envで入れた文字列も確認可能となってます。以下に例として、USBメモリを挿入した時の、実行結果を記載します。
$ udevadm monitor -p
monitor will print the received events for:
KERNEL - the kernel uevent
<省略>
KERNEL[424.907309] add /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb (block)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb
SUBSYSTEM=block
DEVNAME=/dev/sdb
DEVTYPE=disk
DISKSEQ=5
SEQNUM=5216
MAJOR=8
MINOR=16
KERNEL[424.907434] add /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb/sdb1 (block)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb/sdb1
SUBSYSTEM=block
DEVNAME=/dev/sdb1
DEVTYPE=partition
DISKSEQ=5
PARTN=1
SEQNUM=5217
MAJOR=8
MINOR=17
/dev/sdb と /dev/sdb1 に対して KOBJ_ADD が行われていることが読み取れます。
udevd について
udevdは、ueventの情報を監視するデーモン(常駐プロセス)です。udevdは、 “/etc/udev/rules.d/.rules” 及び “/lib/udev/rules.d/.rules” に記載されている設定に基づいて、ueventを受け取った後に処理を行います。
先ほどの、USBメモリを挿入した時の例であれば、 sdb と sdb1 の文字列を含んだ情報がueventで送られていました。対して、以下のファイルでは、そのイベントを受け取った後に、シンボリックリンク(ショートカット)を作成する設定が記載されています。
/lib/udev/rules.d/60-persistent-storage.rules
KERNEL=="sd|sr|cciss", ENV{ID_USB_SERIAL}=="?", SYMLINK+="disk/by-id/usb-$env{ID_USB_SERIAL}$env{.PART_SUFFIX}"
この結果、以下のように、USBメモリを挿入した後に、/dev/disk/by-id/ 配下に、シンボリックリンクが作成される動作となっています。
$ ls -l /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root 9 5月 4 17:48 usb-I-O_DATA_USB_Flash_Disk_b08538b0293732-0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 5月 4 17:48 usb-I-O_DATA_USB_Flash_Disk_b08538b0293732-0:0-part1 -> ../../sdb1
最後に
ueventの理解促進の為に、udevについて触れましたが、本サイトはドライバ入門なのでudevについての詳細は取り扱いません。udevについての、より詳細な内容は、 https://wiki.archlinux.jp/index.php/Udev 等をご参照下さい。uevent発行時に、想定してない動作が発生した場合は、udevの設定を確認してみて下さい。
コメント