Sep
30
五、2.6核心用initrd
1、格式
2.6核心可以支持image格式,但更多的时候使用的是cpio格式。其核心文件不再是/linuxrc,而是/init。
2、解压
以红旗DC 5.0使用的核心版本为例:
引用
[root@printserver test]# ls
initrd-2.6.9-11.19AX.img
[root@printserver test]# file initrd-2.6.9-11.19AX.img
initrd-2.6.9-11.19AX.img: gzip compressed data, from Unix, max compression
initrd-2.6.9-11.19AX.img
[root@printserver test]# file initrd-2.6.9-11.19AX.img
initrd-2.6.9-11.19AX.img: gzip compressed data, from Unix, max compression
可以这样来识别格式:
引用
[root@printserver test]# gzip -dc initrd-2.6.9-11.19AX.img > new.img
[root@printserver test]# file new.img
new.img: ASCII cpio archive (SVR4 with no CRC)
[root@printserver test]# file new.img
new.img: ASCII cpio archive (SVR4 with no CRC)
创建一个新目录,然后解压出来:
引用
[root@printserver test]# mkdir new
[root@printserver test]# cd new/
[root@printserver new]# gzip -dc ../initrd-2.6.9-11.19AX.img | cpio -idvm
[root@printserver test]# cd new/
[root@printserver new]# gzip -dc ../initrd-2.6.9-11.19AX.img | cpio -idvm
也可以这样运行命令:
引用
[root@printserver new1]# zcat ../initrd-2.6.9-11.19AX.img |cpio -idvm
内容:
引用
[root@printserver new]# ll -R
.:
total 36
drwxr-xr-x 2 root root 4096 Sep 30 16:55 bin
drwxr-xr-x 2 root root 4096 Sep 30 16:55 dev
drwxr-xr-x 3 root root 4096 Sep 30 16:55 etc
-rwxr-xr-x 1 root root 725 Jun 29 17:35 init <== 一个nash脚本
drwxr-xr-x 2 root root 4096 Sep 30 16:55 lib
drwxr-xr-x 2 root root 4096 Jun 29 17:35 loopfs
drwxr-xr-x 2 root root 4096 Jun 29 17:35 proc
lrwxrwxrwx 1 root root 3 Sep 30 16:54 sbin -> bin
drwxr-xr-x 2 root root 4096 Jun 29 17:35 sys
drwxr-xr-x 2 root root 4096 Jun 29 17:35 sysroot
./bin:
total 592
lrwxrwxrwx 1 root root 10 Sep 30 16:55 hotplug -> /sbin/nash
-rwxr-xr-x 1 root root 12904 Jun 29 17:35 insmod <== 插入模块
lrwxrwxrwx 1 root root 10 Sep 30 16:55 modprobe -> /sbin/nash
-rwxr-xr-x 1 root root 38184 Jun 29 17:35 nash <== 一个小型解释器
-rwxr-xr-x 1 root root 541716 Jun 29 17:35 udev
lrwxrwxrwx 1 root root 4 Sep 30 16:54 udevstart -> udev
./dev: <== 一些必要的设备文件
total 0
crw-r--r-- 1 root root 5, 1 Jun 29 17:35 console
crw-r--r-- 1 root root 1, 3 Jun 29 17:35 null
brw-r--r-- 1 root root 1, 1 Jun 29 17:35 ram
crw-r--r-- 1 root root 4, 0 Jun 29 17:35 systty
crw-r--r-- 1 root root 4, 1 Jun 29 17:35 tty1
crw-r--r-- 1 root root 4, 2 Jun 29 17:35 tty2
crw-r--r-- 1 root root 4, 3 Jun 29 17:35 tty3
crw-r--r-- 1 root root 4, 4 Jun 29 17:35 tty4
./etc:
total 4
drwxr-xr-x 2 root root 4096 Sep 30 16:55 udev
./etc/udev: <== udev配置文件
total 4
-rw-r--r-- 1 root root 1128 Jun 29 17:35 udev.conf
./lib: <== 启动时加载的模块
total 236
-rwxr--r-- 1 root root 139452 Aug 5 2005 ext3.ko
-rwxr--r-- 1 root root 89648 Aug 5 2005 jbd.ko
./loopfs:
total 0
./proc:
total 0
./sys:
total 0
./sysroot:
total 0
.:
total 36
drwxr-xr-x 2 root root 4096 Sep 30 16:55 bin
drwxr-xr-x 2 root root 4096 Sep 30 16:55 dev
drwxr-xr-x 3 root root 4096 Sep 30 16:55 etc
-rwxr-xr-x 1 root root 725 Jun 29 17:35 init <== 一个nash脚本
drwxr-xr-x 2 root root 4096 Sep 30 16:55 lib
drwxr-xr-x 2 root root 4096 Jun 29 17:35 loopfs
drwxr-xr-x 2 root root 4096 Jun 29 17:35 proc
lrwxrwxrwx 1 root root 3 Sep 30 16:54 sbin -> bin
drwxr-xr-x 2 root root 4096 Jun 29 17:35 sys
drwxr-xr-x 2 root root 4096 Jun 29 17:35 sysroot
./bin:
total 592
lrwxrwxrwx 1 root root 10 Sep 30 16:55 hotplug -> /sbin/nash
-rwxr-xr-x 1 root root 12904 Jun 29 17:35 insmod <== 插入模块
lrwxrwxrwx 1 root root 10 Sep 30 16:55 modprobe -> /sbin/nash
-rwxr-xr-x 1 root root 38184 Jun 29 17:35 nash <== 一个小型解释器
-rwxr-xr-x 1 root root 541716 Jun 29 17:35 udev
lrwxrwxrwx 1 root root 4 Sep 30 16:54 udevstart -> udev
./dev: <== 一些必要的设备文件
total 0
crw-r--r-- 1 root root 5, 1 Jun 29 17:35 console
crw-r--r-- 1 root root 1, 3 Jun 29 17:35 null
brw-r--r-- 1 root root 1, 1 Jun 29 17:35 ram
crw-r--r-- 1 root root 4, 0 Jun 29 17:35 systty
crw-r--r-- 1 root root 4, 1 Jun 29 17:35 tty1
crw-r--r-- 1 root root 4, 2 Jun 29 17:35 tty2
crw-r--r-- 1 root root 4, 3 Jun 29 17:35 tty3
crw-r--r-- 1 root root 4, 4 Jun 29 17:35 tty4
./etc:
total 4
drwxr-xr-x 2 root root 4096 Sep 30 16:55 udev
./etc/udev: <== udev配置文件
total 4
-rw-r--r-- 1 root root 1128 Jun 29 17:35 udev.conf
./lib: <== 启动时加载的模块
total 236
-rwxr--r-- 1 root root 139452 Aug 5 2005 ext3.ko
-rwxr--r-- 1 root root 89648 Aug 5 2005 jbd.ko
./loopfs:
total 0
./proc:
total 0
./sys:
total 0
./sysroot:
total 0
3、执行脚本
引用
[root@printserver new]# cat init
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mkdir /dev/pts
mkdir /dev/shm
echo Starting udev
/sbin/udevstart
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
/sbin/udevstart
echo Creating root device
mkrootdev /dev/root
umount /sys
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
mount -t tmpfs --bind /dev /sysroot/dev
echo Switching to new root
switchroot /sysroot
umount /initrd/dev
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mkdir /dev/pts
mkdir /dev/shm
echo Starting udev
/sbin/udevstart
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
/sbin/udevstart
echo Creating root device
mkrootdev /dev/root
umount /sys
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
mount -t tmpfs --bind /dev /sysroot/dev
echo Switching to new root
switchroot /sysroot
umount /initrd/dev
很明显,与2.4核心最大的差别在于用init代替了linuxrc,并且加入了udev方式。
4、执行流程
由于采用cpio格式后,不需要再创建一个临时的设备用于挂载img文件,所以执行的流程也简单很多:
引用
1)boot loader 把内核以及 initrd 文件加载到内存的特定位置。
2)内核判断initrd的文件格式,如果是cpio格式。
3)将initrd的内容释放到rootfs中。
4)执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。
2)内核判断initrd的文件格式,如果是cpio格式。
3)将initrd的内容释放到rootfs中。
4)执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。
正式由于cpio格式带来的便利,我们要修改和增加自定义的脚本和驱动都变得简单很多,一般只需要对init脚本和/lib添加即可。
5、生成新initrd文件
引用
[root@printserver new]# find ./ | cpio -c -o > ../initrd-2.6.9-11.19AX.new.img
1617 blocks
[root@printserver new]# cd ..
[root@printserver test]# gzip -9 initrd-2.6.9-11.19AX.new.img
[root@printserver test]# mv initrd-2.6.9-11.19AX.new.img.gz initrd-2.6.9-11.19AX.new.img
[root@printserver test]# cp initrd-2.6.9-11.19AX.new.img /boot/
1617 blocks
[root@printserver new]# cd ..
[root@printserver test]# gzip -9 initrd-2.6.9-11.19AX.new.img
[root@printserver test]# mv initrd-2.6.9-11.19AX.new.img.gz initrd-2.6.9-11.19AX.new.img
[root@printserver test]# cp initrd-2.6.9-11.19AX.new.img /boot/
最后,修改grub即可。
若在2.6核心上使用image的initrd文件,处理的流程只是在开始会增加一个判断的步骤,后续是和在2.4上执行的过程是一样的。
六、对比
可以看到,使用cpio格式的处理是非常方便和简洁的,很难对比两种格式处理有什么不同,可以说几乎是一样的。但就是因为制作cpio,以及启动对cpio的处理更直接,目前新发行版的initrd都以cpio格式为多。
内文分页: [1] [2]
我这里是以常见的发行版形式描述的,这样好处理。