smallwl 于 2006-08-29 00:08:53发表:
一. 制作initrd文件
1. 选择操作系统,这里就用FC2.0吧.
2. 安装busybox.
在这里, 需要一些命令去做一些事情, 比如fdisk, ls ,mv……如果把所有这些文件都做到initrd中,这个文件会太庞大了, busybox就是为了解决这个问题的.
从www.busybox.net上下载最新的版本, 解开后里面有一个INSTALL,按照INSTALL安装就可以了.
#cd /tmp/busybox
#tar xjvf busybox-1.1.0.tar.tar
#cd busybox-1.1.0
#make O=/tmp/busybox1 allyesconfig
#cd /tmp/busybox1
#make
3. 定制initrd
因为定制的initrd可能要包含一些文件,所以字节数需要大一点
#mkdir /tmp/initrd && cd /tmp/initrd
#mkinitrd initrd-new x.x.x-xx(后面的是kernel版本号)
在当前目录下会生成一个initrd-new文件.
#zcat initrd-new > 1(也可以使用gunzip)
#mkdir m1
#mount -oloop 1 m1
#cd m1
#mv bin bin.bak
#rm -rf sbin
在m1目录中就是initrd包含的文件了,目标机器读到initrd文件后,会去执行sbin/init文件,这个文件目前指到linuxrc,我们需要busybox
#cd /tmp/busybox1
#make PREFIX=/tmp/initrd/m1
再看看/tmp/initrd/m1/下的bin和shin目录
查一下busybox依赖的lib文件:
#ldd /tmp/busybox1/busybox
然后把对应的lib文件以及link放到/tmp/initrd/m1/lib目录中,
Busybox默认首先执行etc/init.d/rcS文件,所以我们要先建一个rcS文件:
#!/bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/sbin
# Mount filesystems in /etc/fstab.
if [ -x /bin/mount ]; then
/bin/mount -a -v
fi
echo "Loading modules..."
insmod /lib/e1000.ko
insmod /lib/sunrpc.ko
insmod /lib/lockd.ko
insmod /lib/jbd.ko
insmod /lib/ext3.ko
insmod /lib/nfs.ko
insmod /lib/scsi_mod.ko
insmod /lib/sd_mod.ko
insmod /lib/libata.ko
insmod /lib/ata_piix.ko
insmod /lib/sata_sis.ko
echo "Loading modules done"
#sleep 15
ifconfig eth0 192.168.100.100 netmask 255.255.255.0
portmap
sleep 15
echo "Connect nfs server and get image files..."
mount -o rsize=8192,wsize=8192,intr,nolock 192.168.100.1:/images /images
echo "Connecting nfs server done"
/images/runme.sh
根据这个shell,我们知道
a. 还需要bash文件,将bash复制到/tmp/initrd/m1/bin目录中,同时检查lib文件.
b. [root@backup etc]# cat fstab
none /proc proc defaults 0 0
c. 硬件驱动文件,文件系统驱动文件
insmod /lib/e1000.ko ------网卡
insmod /lib/sunrpc.ko
insmod /lib/lockd.ko
insmod /lib/jbd.ko
insmod /lib/ext3.ko
insmod /lib/nfs.ko ------以上为文件系统
insmod /lib/scsi_mod.ko
insmod /lib/sd_mod.ko
insmod /lib/libata.ko
insmod /lib/ata_piix.ko
insmod /lib/sata_sis.ko ------以上为硬盘控制器驱动
对于硬盘控制器,如果是IDE,就不需要,我这里是sata硬盘,比较恶心,如果是scsi硬盘,还需要一个aic
这些文件是从同类型机器上安装了FC2后获得的.
d. 需要一个portmap文件,在/sbin目录下.
e. Runme.sh需要自己手动建
接下来,还要处理dev目录中内容,我对dev目录不太了解,直接从/dev复制是不可以,只好使用现成的..
所有的文件都搞定后:
#cd /tmp/initrd/
#umount m1
#gzip -9 1
#cp 1.gz initrd-new