|
|
首先建立2M的ext2文件系统镜像,我们将要把所需要的一些文件拷贝到这个镜像中去,然后这个镜像在压缩后就成为了我们今天的工作任务initrd。
dd if=/dev/zero of=~/myinitrd bs=1k count=2000
创建一个2000k的整块文件,一定不能有碎片
mke2fs ~/myinitrd
创建一个ext2文件系统
mount -t ext2 ~/myinitrd /mnt/initrd -o loop
mkdir /mnt/initrd/lib
cp /lib/ld-linux.so.2 /mnt/initrd/lib/
cp /lib/libc.so.6 /mnt/initrd/lib
wajig instll ash
mkdir /mnt/initrd/bin
cp /bin/ash /mnt/initrd/bin
mkdir /mnt/initrd/sbin
cp /sbin/insmod /mnt/initrd/sbin
拷贝这些文件过去,其实是实现了initrd中需要使用的/sbin/insmod以及/bin/ash两个命令,只所以没有采用/bin/bash是因为bash太大,而且还要依赖别的库。
下面进入比较重要的部分,如何找到所需要的用来加载根文件系统的内核模块。
我就以我的VMWare系统为例加以说明。
我用的ext3文件系统,根据/lib/modules/2.6.8-2-386/modules.dep文件找到所依赖的其它模块jbd。
scsi的host控制器的模块是mptscsih根据上述文件找到所依赖的mptbase和scsi_mod,并且根据经验知道所有scsi硬盘的支持还需要sd_mod。
因为默认的内核都没有把这些模块编译进去,所以咱们把它们收集起来并且放到initrd中去。将这些模块文件都拷贝到/mnt/initrd/lib。
下面就是写linuxrc文件,目的就是加载所需要的模块使得内核可以加载到真正的根文件系统。
#!/bin/ash
/sbin/insmod /lib/scsi_mod.ko
/sbin/insmod /lib/sd_mod.ko
/sbin/insmod /lib/mptbase.ko
/sbin/insmod /lib/mptscsih.ko
/sbin/insmod /lib/jbd.ko
/sbin/insmod /lib/ext3.ko
将这个文件拷贝到/mnt/initrd下
这样initrd就制作完毕了。
卸载此文件系统:umount /mnt/initrd
gzip -9 ~/myinitrd
cp -f ~/myinitrd.gz /boot/myinitrd.img
现在就可以在grub启动之时进行测试
如果是有devfs支持的内核,那么在kernel 那行将root=/dev/sdaX 换成root=/dev/discs/disc0/partX。(devfs的命名规则就是这样写的,所以就根据它的规则我们改过来。)
如果没有devfs的支持,那么需要在initrd中自己创建/dev目录并且用mknode创建设备文件,或者直接将本机上的hd*,sd*拷贝过去。
initrd那一行改为:initrd=/boot/myinitrd.img
按b键启动。
这时候应该可以正常引导系统了。如果我们可以成功,那么就可以把刚才的改动保存在/boot/grub/menu.lst,这样就不需要每次启动系统时手动改grub的启动参数了。
我们可以在initrd中增加对vesafb的支持,这个就留给以后再去尝试了。 |
|