・sysfs を使ったモジュールドライバ組み込み
最近のカーネルでは, sysfs という仕組みでカーネルが認識しているデバイスをユーザ領域から見ることができて, それを使えばモジュールドライバの自動認識も可能になるはずだけどなぁ,,と以前から思っていたのだけど, たまたま goole であれこれ検索していたら, 仙石さんのこのページを見かけて, なるほど,こういう手があったか,とさっそく試してみた.
最近のカーネルでは /proc/sys/kernel/modprobe に /sbin/modprobe を指定しておけば, 起動後の活線挿抜(hotplug)にはカーネル自体が必要なモジュールドライバをロードしてくれるようなんだけど, 起動時の周辺機器の認識(coldplug)ではこの機能が使えないからどうしたものかと思っていたのだけど, 上記ページにあるように,
/sys/bus/*/devices/*/modalias
に現われているモジュールドライバのエイリアスを元に modprobe してやれば カーネルが認識している周辺機器用のモジュールドライバは組み込まれる模様.
例えば VMware が使う BusLogic のドライバなどは,
/sys/bus/pci/devices/0000:00:10.0/modalias
に
pci:v0000104Bd00001040sv0000104Bsd00001040bc01sc00i00
として現われるのだけど,BusLogic.ko を modinfo で調べると
bash-3.2# modinfo BusLogic filename: /lib/modules/2.6.24.4-plamoSMP/kernel/drivers/scsi/BusLogic.ko license: GPL alias: pci:v0000104Bd00008130sv*sd*bc*sc*i* alias: pci:v0000104Bd00000140sv*sd*bc*sc*i* alias: pci:v0000104Bd00001040sv*sd*bc*sc*i* depends: vermagic: 2.6.24.4-plamoSMP SMP preempt mod_unload 586 parm: BusLogic:charp
となって,前半のベンダーID(v0000104B...)がマッチすることから, 上記 modalias を modprobe で読み込ませれば BusLogic.ko が組み込まれる, という仕組みになっているらしい.
ただ,sysfs に modalias が現われるのも順番があるようで, 上記 /sys/bus/pci/.. の modalas で PCI バスに接続されているSCSIアダプタ用のモジュールドライバを 読み込むと,そのモジュールドライバを使って SCSI アダプタが見えるようになって, そのアダプタに接続されているデバイス(HDDとかCD-ROMとか)用のドライバが /sys/bus/scsi/devices/1:0:0:0/modalias 等に見えるようになって,
# cat /sys/bus/scsi/devices/1:0:0:0/modalias scsi:t-0x05
このエイリアスはsr_mod.ko(SCSI CD ドライブ用モジュール)を指すことになるので,
bash-3.2# modinfo /mnt/Srcs/L/Linux/Build/modules/lib/modules/2.6.25-plamoSMP/kernel/drivers/scsi/sr_mod.ko filename: /mnt/Srcs/L/Linux/Build/modules/lib/modules/2.6.25-plamoSMP/kernel/drivers/scsi/sr_mod.ko license: GPL alias: scsi:t-0x04* alias: scsi:t-0x05* alias: block-major-11-* license: GPL description: SCSI cdrom (sr) driver depends: cdrom vermagic: 2.6.25-plamoSMP SMP preempt mod_unload 586 parm: xa_test:int
SCSI CD ドライブを使うためには、BusLogic.ko を組み込んでから、再度 modalias を調べて sr_mod.ko を組み込んでやる必要がある模様.
USB 回りは usb-storage が組み込まれない,という報告も来ているのだけど, もしかしたらホストサイドの USB デバイス(uhci とか)を組み込んで, usbcore を組み込んで,usblib を組み込んで, やっと usb-storageに辿り付く,くらいの段階が必要になるのかも知れない.