扫一扫
关注微信公众号

从USB移动硬盘上引导Portable Linux详解2
2007-07-28   网络

中间提到一个有用的工具:BusyBox,如果有整个定制过程中出现麻烦,反复地修正和重启是个麻烦事,而把Bash整到启动过程中,依赖的各种库文件很是占用空间,先在虚拟系统内下载一个BusyBox编译安装绝对有益于后面定制过程中的手工调试。

  当然,对于最终结果来说,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 .

  到这里,必须的文件就准备好了。

热词搜索:

上一篇:从USB移动硬盘上引导Portable Linux详解1
下一篇:从USB移动硬盘上引导Portable Linux详解3

分享到: 收藏