當然,對于最終結果來說,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 .
到這里,必須的文件就準備好了。