分类: LINUX
2010-07-28 14:38:55
initrd***.img是一个镜像文件,类似ramdisk,把一段程序打包到img里,然后在开机的时候在内存里开辟一段区域,一般是2m,释放到那里运行,都是一些初始化的程序,比如sisc_mod、ext3、sd_mod等模块和insmod、nash等命令。不同内核,初始化的img可 以相同,也可以不同,如果没有,可以在grub.conf里加上no initrd,它就跳过initrd的检测和执行了。 它的作用是在没有mount /分区以前,系统要执行一些操作,比如挂载scsi驱动,它就把initrd释放到内存里,作一个虚拟的/,然后执行其根目录下的一个脚 本"linuxrc",运行insmod和nash命令挂装模块。
2.4内核中boot目录下的initrd文件,实际上位一个指向ext2格式的initrd.gz文件的软连接。
下面来看看如何查看initrd***.img里面的内容和如何为你的新内核创建一个新的initrd.img文件。 查看initrd.img: initrd***.img虽然后缀是“img”,但其实它是一个gz格式的文件,我们可以先把它解压,然后载挂装到目录下:
1、cp initrd.img initrd.gz
2、gunzip initrd.gz
3、mount -o loop initrd /mnt/initrd
进入/mnt/initrd目录,我们就可以看到initrd***.img文件的庐山真面目了。
制作initrd文件 当我们编译了一个新的内核,也不要忘了为我们的scsi设备做一个新的initrd镜像:
语法: mkinitrd 文件名 内核的目录名
示例: mkinitrd initrd-2.4.19.img 2.4.19
2.6内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount -o loop 挂载。需要使用gunzip解压缩,然后再使用cpio解包
cp /boot/initrd-***.img initrd.gz
gunzip initrd.gz
cpio -ivmd < initrd
最初通过file查看initrd.img为gzip compressed date,gunzip解压后的initrd,则为ASCii cpio
通过以上命令就将initrd.img解压了,现在就可以对其进行编辑,完成后使用以下命令重新压制
find . | cpio -ov > ../initrd.new.img
gzip ../initrd.new.img
再将其改名拷贝至/boot目录,重启就可以观察修改后的效果。重启后无法成功引导。这是因为生成的initrd.img不对。解决如下:
生成initrd
find . | cpio -o -H newc | gzip > /mnt/sda1/boot/initrd.img-2.6.18-4-686
(注:-H newc 是必须的,否则内核会认为是ramdisk,而不是initramfs)
PS: 内存文件系统是我下一个要搞定的问题~