今回はLinuxでデバイス管理周りの動作を確認してみようと思います。Linuxでの基礎的な内容になるかと思いますが、普段は自動的に認識され処理されているのであまり気にしない箇所かも知れませんね。
参考にしたのは以下の書籍です。udev以外にもブートシーケンスやファイルシステム周りも紹介されていてとてもためになりました。読了したら気になった箇所をまた実験してみようかと思います。
実験内容
1, デバイスを接続した際のueventメッセージを覗く– 対応するモジュールがロードされている様子を確認してみる
2, デバイスのエイリアスを登録するudevルールを記述する
– ueventメッセージを受けた際のudevdの動作を確認してみる
デバイスを接続した際のueventメッセージを覗く
それでは実際にデバイスが接続された際のメッセージを「udevadm」コマンドを使って確認して見ようと思います。今回はUSBシリアルケーブルを接続した際のメッセージとなります。
いろいろ出力されますが、(modules)で「/module/usbserial」と「/module/ftdi_sio」の2つを読み込んでることが分かります。
hiro-gentoo ~ # udevadm monitor --kernel
monitor will print the received events for:
KERNEL - the kernel uevent
KERNEL[60483.087756] add /devices/pci0000:00/0000:00:14.0/usb1/1-5 (usb)
KERNEL[60483.090901] add /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0 (usb)
KERNEL[60483.090960] bind /devices/pci0000:00/0000:00:14.0/usb1/1-5 (usb)
KERNEL[60483.094764] add /module/usbserial (module)
KERNEL[60483.094802] add /bus/usb-serial (bus)
KERNEL[60483.094831] add /bus/usb/drivers/usbserial_generic (drivers)
KERNEL[60483.094838] add /bus/usb-serial/drivers/generic (drivers)
KERNEL[60483.095542] add /module/ftdi_sio (module)
KERNEL[60483.095558] add /bus/usb/drivers/ftdi_sio (drivers)
KERNEL[60483.095570] add /bus/usb-serial/drivers/ftdi_sio (drivers)
KERNEL[60483.095588] add /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0/ttyUSB0 (usb-serial)
KERNEL[60483.096125] add /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0/ttyUSB0/tty/ttyUSB0 (tty)
KERNEL[60483.096137] bind /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0/ttyUSB0 (usb-serial)
KERNEL[60483.096157] bind /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0 (usb)
実際にモジュールがロードされていることを確認。usbserialはftid_sioの依存として一緒にロードされたようです。
### USBシリアルケーブル接続前
hiro-gentoo ~ # lsmod | grep -i usb
usb_storage 57344 0
usbhid 32768 0
usbcore 184320 11 xhci_hcd,ohci_hcd,ehci_pci,sl811_hcd,usbhid,usb_storage,ehci_hcd,xhci_pci,ohci_pci,xhci_plat_hcd,uhci_hcd
usb_common 16384 1 usbcore
### USBシリアルケーブル接続後
### usbserialとftdi_sioが増えてる
hiro-gentoo ~ # lsmod | grep -i usb
usbserial 28672 1 ftdi_sio
usb_storage 57344 0
usbhid 32768 0
usbcore 184320 13 ftdi_sio,usbserial,xhci_hcd,ohci_hcd,ehci_pci,sl811_hcd,usbhid,usb_storage,ehci_hcd,xhci_pci,ohci_pci,xhci_plat_hcd,uhci_hcd
usb_common 16384 1 usbcore
### ftdi_sioの依存関係の確認。usbcoreははじめからロード済みだったのでueventメッセージには出てこなかった
hiro-gentoo ~ # modinfo ftdi_sio | grep depends
depends: usbserial,usbcore
デバイスのエイリアスを登録するudevルールを記述する
次はueventを受け取ったudevdの動作を確認してみようと思います。以下のルールを記述して、デバイスが接続されたら「ftdi-serial-console」というエイリアスを登録するルールを記述します。
hiro-gentoo ~ # cat /etc/udev/rules.d/10-test.rules
KERNEL=="ttyUSB0",SUBSYSTEM=="tty",RUN="/usr/bin/logger hello udev!!", SYMLINK="ftdi-serial-console"
以下のようにシンボリックリンクが作成され、リンク元と同様にアクセスすることができます。(screeコマンドで接続例)
### シンボリックリンクが作成されていることを確認
hiro-gentoo ~ # ll /dev/ftdi-serial-console
lrwxrwxrwx 1 root root 7 6月 7 19:59 /dev/ftdi-serial-console -> ttyUSB0
### シンボリックリンクを指定してNW機器に接続
hiro-gentoo ~ # screen /dev/ftdi-serial-console
Password:
udevdのルールはNICに固定の名前をつける際によく利用されるかと思います。NIC以外のデバイスの場合にNAME属性をつかって名前を指定できないのでちょっと注意が必要です。(そのかわりにSYMLINKを使ってシンボリックリンクを作成できるようになってるっぽい)https://access.redhat.com/solutions/3605851
### NAME属性を使うとこんなエラーが出てくる
hiro-gentoo ~ # journalctl -f
6月 07 20:30:07 hiro-gentoo systemd-udevd[29126]: ttyUSB0: /etc/udev/rules.d/10-test.rules:1 Kernel device nodes cannot be renamed, ignoring NAME="ftdi-serial-console"; please fix it.
以上で実験は終了です。本当は、ftdiのドライバをカーネルに組み込んでビルドした際のueventのメッセージ差異も確認したかったのですがftdiのドライバは、モジュールとしてしかビルドできなかった(「*」)を指定できませんでした。ドライバによってもこの辺は異なってくるのかな?またちょっとした疑問が出てきましたが今回は実際に手を動かしてみてudev周りの理解が少し深まりました。
それではまた!!
参考:
https://qiita.com/hana_shin/items/16c457eed20e8822cab8 https://users.miraclelinux.com/technet/document/linux/training/2_1_1.html https://xtech.nikkei.com/it/article/COLUMN/20071024/285418/