initrd-x.x.x.img文件分析-制作安装程序不支持的根文件系统

导读:
  initrd-x.x.x.img文件分析-制作安装程序不支持的根文件系统
  grub007
  1、initrd img文件分析
  Linux不能启动的很多原因都直接或者间接与initrd-x.x.x.img文件有关系,以我的系统为例(具有通用性):initrd-2.4.21-AS.2smp.img,为多CPU内核。
  我不打算详细分析LINUX的具体启动过程,这样的文章网上很多,只是说说initrd-x.x.x.img文件的作用:initrd-x.x.x.img主要是加载文件系统及scsi设备的驱动。
  等我们看完了initrd-x.x.x.img文件包含的具体的内容就知道了:
  initrd-x.x.x.img首先是一个用gzip压缩的文件,因为内核里包含解压缩的代码,这主要是为了制作启动盘,因为启动盘只有1.44M,这个文件的原始大小
  是2.9M左右,压缩后大概3、4百K。这个文件使用mkinitrd命令产生。
  要看到initrd-x.x.x.img里面的内容,首先是解压该文件,由于gunzip解压的文件有扩展名要求,所以:
  mv initrd-x.x.x.img initrd-x.x.x.img.gz
  gunzip initrd-x.x.x.img.gz
  这样得到一个解压过后的img文件:
  [root@localhost root]# file initrd-2.4.21-AS.2smp.img
  initrd-2.4.21-AS.2smp.img: Linux rev 1.0 ext2 filesystem data
  然后可以mount该文件了:
  mount -o loop initrd-2.4.21-AS.2smp.img /mnt/floppy/
  到/mnt/floppy/看看:
  [root@localhost root]# cd /mnt/floppy/
  [root@localhost floppy]# ls
  bin dev etc lib linuxrc loopfs proc sbin sysroot
  这是大家熟悉的LINUX根目录的部分列表,其中主要目录的列表如下:
  bin:
  [root@localhost bin]# ls
  insmod modprobe nash
  这些文件是用来加载模块,nash用来执行脚本linuxrc ;
  dev:
  [root@localhost dev]# ls
  console null ram systty tty1 tty2 tty3 tty4
  是一些主要的设备;
  lib:
  [root@localhost lib]# ls
  ips.o jbd.o scsi_mod.o sd_mod.o xfs.o
  这是系统启动前必需要加载的模块,因机器不同而不同;
  其他目录是空的
  下面看看linuxrc这个脚本的内容:(行号是自己添加的)
  1 #!/bin/nash
  2 echo Loading scsi_mod.o module
  3 insmod /lib/scsi_mod.o
  4 echo Loading sd_mod.o module
  5 insmod /lib/sd_mod.o
  6 echo Loading ips.o module
  7 insmod /lib/ips.o
  8 echo Loading jbd.o module
  9 insmod /lib/jbd.o
  10 echo Loading xfs.o module
  11 insmod /lib/xfs.o
  12 echo Mounting /proc filesystem
  13 mount -t proc /proc /proc
  14 echo Creating block devices
  15 mkdevices /dev
  16 echo Creating root device
  17 mkrootdev /dev/root
  18 echo 0x0100 > /proc/sys/kernel/real-root-dev
  19 echo Mounting root filesystem
  20 mount -o defaults --ro -t xfs /dev/root /sysroot
  21 pivot_root /sysroot /sysroot/initrd
  22 umount /initrd/proc
  其中:
  1-11行是加载模块
  13行安装内核文件系统
  15-18行创建设备
  19行安装根文件系统,这是系统第一次安装根文件系统,这时候还处在内核态,还没有进入用户态,所以为只读模式;进入用户态后需要再次安装根文件系统为读写模式。
  从这个脚本可以看出initrd-x.x.x.img文件的重要性,如果在这里安装根文件系统失败(比如驱动程序不正确,scsi设备没有驱动起来等),内核就无法读取磁盘的内容,便不能继续引导。
  2、制作安装程序不支持的根文件系统
  一般LINUX发行版的安装程序都不支持不常用的文件系统如Minix、xfs等,如果想要把根文件系统做成上述文件系统,可以按照如下步骤:(以xfs为例,原始的更文件系统为ext3):
  第一步:
  解压你的initrd-x.x.x.img文件,最好不要在原来的目录/boot下进行,可以先建立一个临时目录/root/initrd,把initrd-x.x.x.img拷贝过去,然后按照1中的方法解压并mount。(安装到/mnt/floppy)
  第二步:
  拷贝xfs.o模块到lib目录并删除原来的文件系统模块:
  cp /lib/modules/2.4.21-AS.2smp/kernel/fs/xfs/xfs.o /mnt/floppy/lib/ 其中2.4.21-AS.2smp是你的内核版本目录
  rm -rf ext3.o
  第三步:
  修改linuxrc脚本,仅把其中的所有的ext3.o替换成xfs.o
  第四步:
  卸载initrd-x.x.x.img,并压缩initrd-x.x.x.img文件
  umount /mnt/floppy
  gzip -9 initrd-x.x.x.img 得到initrd-x.x.x.img.gz文件,推荐使用-9参数取得较好的压缩效果。
  mv initrd-x.x.x.img.gz initrd-x.x.x.img 重命名initrd-x.x.x.img.gz为initrd-x.x.x.img
  第五步:
  制作xfs分区
  先用fdisk新建一个分区如sda8或者hda8(或者用其他的工具),然后格式化成xfs:
  mkfs.xfs /dev/sda8 -f
  或
  mkfs.xfs /dev/hda8 -f
  第六步:
  mount xfs分区(比如mount到/sda8),并把当前根目录下除/proc下以外的东西拷贝到xfs分区里,
  第七步:
  把制作好的initrd-x.x.x.img文件拷贝到xfs分区上的boot目录下覆盖原有的initrd-x.x.x.img文件
  第八步:
  修改/sda8/etc/fstab文件,把其中的根设备改成sad8(或者hda8),相应的文件系统类型改成xfs
  如果使用lilo,修改/sda8/etc/lilo.conf文件,把其中的根设备换成sad8(或者hda8),然后chroot到/sda8,重写lilo
  使用grub的情况类似;
  重启就好啦!

本文转自
http://hi.baidu.com/lovehm/blog/item/905a03faf851719758ee9047.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值