|
楼主 |
发表于 2005-3-14 20:35:32
|
显示全部楼层
让内核从usb-hdd启动最重要的一点就是要让内核能够在启动的一开始就找到我的root分区并且mount到/下面 usbcore,ehci-hcd,ohci-hcd(注:如果你的usb host芯片是intel和via的话就要用uhci-hcd,这是两大派系的驱动,二者取一就可以了),usb-storage,scsi_mod,sd_mod,sg 这些模块要在内核mount root文件系统前就要进入内核 有两种方式可以完成这个
1.重新编译内核 把usbcore ehci-hcd ohci-hcd(uhci-hcd) usb-storage scsi_mod sd_mod sg统统编译进内核 我不知道2.6.x里面把usb编译进内核还需不需要修改一些源码 让内核在启动的时候等待足够的时间把我们的usb-hdd找到 也许编译进去就可以直接启动了 我打算找个时间试一下 改善我的启动时间 这种方式不需要加载initrd选项 是单内核启动的方式
2.用initrd方式加载模块 initrd做得事情就是在内核启动的过程中先mount到一个很小的linux文件系统里面 就是grub中的initrd.gz 现在initrd.gz制作有多种方式的文件系统可以选择ext2,ext3,cramfs的等 如果选其一 那么必须保证这种文件系统是编译进内核的 在initrd.gz里面我们要干的唯一事情就是提前把内核模块里的一些模块加载进内核 以便做进一步的工作 此时我们要加载的内核模块已经在initrd.gz里面了(这个是在mkinitrd里做得) 而不是从我们的/文件系统中加载 ok initrd.gz完成了usbcore ehci-hcd ohci-hcd(uhci-hcd) usb-storage scsi_mod sd_mod sg以后 等待片刻(10s对我来说已经算不上片刻了,sigh) 我们的usb硬盘已经变成/dev/sdaX了 或者/dev/discs/disc1/partX了 然后initrd.gz根据 grub中的 root=/dev/sdaX chroot到我们真实的root分区里面 后面的事情就是和ide硬盘启动没什么区别了
在archlinux里面 我先把ftp://ftp.archlinux.org/incoming/mkinitrd-1.0.1-1.tar.gz搞定 然后我用的是kernel26-scsi的内核 所以关于scsi的就不需要加载了 剩下的就是把usb相关的用initrd.gz搞定 执行下面的指令
mkinitrd -k 2.6.11.1-ARCH -m usbcore:usb-storage:ehci-hcdhci-hcd -f reiserfs
其中-f reiserfs是说你的root分区用的是什么文件系统 这些选项大家man一下mkinitrd就明白了
然后就会在/boot下出现一个initrd.gz 把它加到grub或lilo的选项里去就可以了
在google上看到mkinitrd-1.0.1-1.tar.gz的作者也有一个usb启动等待的问题 这个问题我记不得从2.6.x哪个开始就存在了(在2.4的时代好像不存在) 问题就是initrd.gz做完一系列modprobe (usb modules)之后 还没有等usb设备和分区准备好就开始要chroot了 这在/boot/initrd-tree/linuxrc里面看得比较清楚(/boot/initrd-tree这个目录是在执行mkinitrd之后出现的) 所以我们要加一点等待时间 vi /boot/initrd-tree/linuxrc一下
在# Initialize LVM:前一行加上一个sleep 10(10表示秒 根据你的usb-hdd识别快慢自己决定)
如:
sleep 10
# Initialize LVM:
if [ -x /sbin/vgscan ]; then
/sbin/vgscan --mknodes
sleep 10
/sbin/vgchange -ay
fi
然后再执行一遍mkinitrd -k 2.6.11.1-ARCH -m usbcore:usb-storage:ehci-hcdhci-hcd -f reiserfs 注意这个时候mkinitrd不要加-c这个选项 否则她会先把你的/boot/initrd-tree先干掉再重新来一遍 |
|