内核升级固然时间很爽的事情,可是当你辛辛苦苦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 机制解析
Linux 下压缩和解压.img文件