Chinaunix首页 | 论坛 | 博客
  • 博客访问: 272255
  • 博文数量: 42
  • 博客积分: 2718
  • 博客等级: 少校
  • 技术积分: 467
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-19 10:23
个人简介

青 田 酒 店 服 务 小 姐 价 格 186-6531-7773

文章分类

全部博文(42)

文章存档

2011年(36)

2010年(6)

分类: LINUX

2011-05-27 21:27:04

内核升级固然时间很爽的事情,可是当你辛辛苦苦compile了近乎一个小时,满怀期待的reboot后看到panic字段时,是不是有种想屎的感觉。。。
  以前升级内核,总是拿下代码,make & make modules & make modules_install & make install
然后修改/boot/grub/menu.lst中内容。。。然后reboot.
如果遇到panic,就盲目的去谷歌。。。其实panic的提示就那么几类,但是引起panic的底层原因却是很多的。。因此,盲目去谷歌往往浪费时间,自信心还受到打击。。。
 这两天也是遇到类似问题,2.6.18的内核用2.6.18的源码编译,重启reboot,报告错误:
 
Uncompressing Linux...OK booting the kernel
Red Hat nash version 5.1.19.6 starting
mount: could not find filesystem '/dev/root'
setuproot:moving /dev failed:no such file or directory
setuproot: error mounting /proc: no such file or directory
setuproot: error mounting /sys: no such file or directory
switchroot: mount failedL no such file or directory
Kernel panic - not syncing: Attenpted to kill init !
于是,就在.config文件中一顿瞎改,然后编译,重启时往往还是panic,因为并没找到问题症结在哪。。
今天听同事说肯定是initrd不一样,有问题导致的。。。
于是乎,想花点时间研究下,找了些文章,参考了下,到刚才终于搞定。
可能有人说,为啥不用安装系统时的config文件,个人觉得,对于版本号比较接近的内核升级,可以直接采用原系统的config文件来作为.config文件,但是如果内核版本号相差较大的话,老的config显然是不能替代新的config的,因为有些新特性的CONFIG是老的没有的。。。
因此,我还是建议自己选择config,然后解决panic的方法如下.
/boot/xxx.img往往是内核模块,脚本和诸多目录的压缩文件。通过以下方法能够看到.
 
 
解压缩img文件:

内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount -o loop 挂载。需要使用gunzip解压缩,然后再使用cpio解包

cp /boot/initrd-***.img initrd.img.gz
gunzip initrd.img.gz
mkdir initrd
mv initrd.img initrd
cd initrd
cpio -ivmd < initrd.img

通过以上命令就将initrd.img解压了,现在就可以对其进行编辑,完成后使用以下命令重新压制

find . | cpio -cv -o > ../initrd.new.img
gzip ../initrd.new.img

我们能够知道,启动时panic往往是内核img问题导致的,而与大多数config中的项是无关的,因此对比config文件比对比img内容要复杂,因此我们选择简易的后者。

加压缩img文件后,生成如下文件和目录列表:

bin  dev  etc  init  lib  proc  sbin  sys  sysroot

一般情况下,我们需要做的就是把新编译内核的img中内容同系统原来的img解压的内容对比,

有哪些不一致,就修改自己的config文件,我刚开始编译时,是把自己觉得重要的模块都build-in进内核了,但是依然panic,后来跟着原装系统的比较,把lib目录下的模块一个个找出来,改成M方式,直到跟老系统一样,然后make reboot,果然OK了。

个人觉得,这种方式,对于解决内核panic是比较高效的,当然还有另外一个方法,就是看内核启动代码。。

附上2.6.20的img解压缩后lib目录类容:

ahci.ko  ehci-hcd.ko  ext3.ko  jbd.ko  libata.ko  ohci-hcd.ko  scsi_mod.ko  sd_mod.ko  uhci-hcd.ko

原来编译的lib内容是:

ehci-hcd.ko  ohci-hcd.ko  uhci-hcd.ko

还有相关帮助帖子地址:

 

Linux2.6 内核的 Initrd 机制解析

https://www.ibm.com/developerworks/cn/linux/l-k26initrd/

Linux 下压缩和解压.img文件

http://mazd1002.blog.163.com/blog/static/6657496520104248223768/

阅读(3947) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~