当然,对于最终结果来说,BusyBox不是必须的。
到这里,虚拟机里己经安装了一个新的内核,如果你愿意,不妨用它在虚拟机里引导一下,看看它是否工作良好。
第七才开始进入正题,动手对付这个新内核的initrd镜像,让它能正确地联接在主机上从USB盘上启动起来,而不是在虚拟机里启动。先把/boot/initrd-2.6.21.img 复制到你的工作目录下来,并把它更名成.gz文件,解开到一个定制的目录中,这里我是这么做的:
#cd
3cp /boot/initrd-2.6.21.1.img hd.gz
#mkdir newinitrd
#gunzip hd.gz
#cd newinitrd
#cpio -i ——make-directories < ……/hd
这个时候,newinitrd目录下就是整个initrd文件内被打包压缩了的文件。
这里扯一下:发行版内的mkinitrd工具,来自于mkinitrd软件包,你可以用mkinitrd ——version查一下,编译核心的最后一步make install这个过程的最后一步就是mkinitrd,这是一个shell脚本,有耐心和兴趣的可以仔细读一下,在我用的5.0.32版本的mkinitrd工具中,linux的开发者也己经试图加入了生成从usb盘引导linux的功能,只可惜,似乎生成的initrd并不能正常从USB移动硬盘上引导,最后还是得我们自己定制。
第八:把需要用的内核模块从/lib/modules/当前版本/kernel/drivers……等目录中复制到当前initrd解开后的目录的lib目录下。在这之前,先看看里面有什么,不同的情况下,还是有一些差别的。
接着上面的shell环境:
#cd lib
#ls -l
-rw-r——r—— 1 root root 69348 07-24 05:13 BusLogic.ko
-rw-r——r—— 1 root root 144796 07-24 05:13 ext3.ko
-rw-r——r—— 1 root root 75736 07-24 05:13 jbd.ko
-rw-r——r—— 1 root root 24564 07-24 05:13 ub.ko
-rw-r——r—— 1 root root 148040 07-24 05:13 usbcore.ko
-rw-r——r—— 1 root root 102960 07-24 05:13 usb-storage.ko
哦?己经帮我把usb等模块都复制上去了,还带了一个BusLogic的SCSI驱动。仔细比较这些ko文件,有不少还是被strip过的,比/lib/modules下的缩水小了很多。但是……
少了总线驱动,它以为我把usb总线控制器编译到内核中了?没办法,这里只好老老实实地先把总线驱动文件先复制过来。
接着上面的shell环境:
#cp /lib/modules/2.6.21.1/kernel/drivers/usb/host/ehci-hcd.ko .
#cp /lib/modules/2.6.21.1/kernel/drivers/usb/host/uhci-hcd.ko .
它们可以去掉内部的一些符号以缩小体积:
#strip ehci-hcd.ko
#strip uhci-hcd.ko
还少了必须的scsi disk 支持模块:
#cp /lib/modules/2.6.21.1/kernel/drivers/scsi/sd_mod.ko .
这个不就必strip了,似乎strip它的话,会加载不上。
除此之外,我们还得准备一个sleep,取代linux引导时用的nash中的sleep内部命令,那个不能有效地进行延时,于是到再到bin目录下:
这里还是得保留在我们的newinitrd目录下:
#cd ……/bin
#cp /bin/sleep .
除此之外,还得也准备好sleep所依赖的库文件:
#ldd ./sleep
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0x00c44000)
/lib/ld-linux.so.2 (0x003b7000)
它需要lib目录下要有libc.so.6和ld-linux.so.2,找到它们,复制到lib目录下
#cd ……/lib
#cp /lib/ld-linux.so.2 .
#cp /lib/libc.so.6 .
到这里,必须的文件就准备好了。