編譯加載linux驅動和內核模塊
到目前為止,我們在構建initramfs時還沒有涉及內核模塊的支持,所用到的硬件驅動程序都是直接編譯到內核中。現在我們就看看如何使initramfs支持內核模塊。
編譯內核模塊
首 先,內核配置要支持模塊,並支持內核模塊的自動加載功能:在內核配置菜單中的激活下面的配置項,編譯進內核
Load module support / Enable loadable module support / Automatic kernel loading ;
然後把需要的硬件驅動程序配置模塊形式,比如把我的機器上的硬盤控制器的驅動編譯成模塊,則選擇
Device Driver
|---->SCSI device support
|---->SCSI disk support
|----->verbose SCSI error reporting (不是必須的,但可方便問題定位)
|----->SCSI low-level drivers
|---->Serial ATA (SATA) support
|---->intel PIIX/ICH SATA support
把它們配置成模塊。
最後,編譯內核,並把編譯好的內核模塊安裝到image的目錄下:
make
make INSTALL_MOD_PATH=~/initramfs-test/image modules_install
命 令執行完畢後,在image/lib/modules/2.6.17.13/kernel/drivers/scsi目錄下安裝了4個內核模文 件:scsi_mod.ko、sd_mod.ko、ata_piix.ko、libata.ko,它們就是所需的硬盤控制器的驅動程序。
加載內核模塊
busybox的modprobe命令執行不正常,不能加載內核 模塊。懷疑是busybox的modprobe命令配置或編譯有問題。否則可以自動加載驅動。先用insmod命令依次加載。查看/lib/modules /2.6.17.13/modules.dep,弄清楚了4個模塊的依賴關系,執行下面的命令加載:
insmod scsi_mod
insmod libata
insmod ata_piix
insmod sd_mod
然後再用
mdev -s
命令生成硬盤的設備文件。 好了,可以安裝硬盤分區,了並把根文件系統切換到硬盤分區:
mount /dev/sda8 /mnt
exec switch_root /mnt /sbin/init
系統正常啟動到了CLFS,我們可以做到用initramfs中的硬盤控制器的驅動模塊安裝硬盤分區了。
最終init文件
分區要換成自己的分區。
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod scsi_mod
insmod libata
insmod ata_piix
insmod sd_mod
mdev -s
mount /dev/sda8 /mnt
exec switch_root /mnt /sbin/init