本文主要是记录,这几天升级linux内核,这个痛苦的过程。废话少说吧,进入正题吧!!
升级必备
1.本人使用的linux系统是:Red Hat Enterprise 5 (linux kernel -2.6.18) ,vmware7.0 虚拟机。
2.linux kernel 3.9.3 (下载地址是点击打开链接)
具备上面所以需要的就可以进行升级了
由于本人第一次升级linux内核,因此在google中搜索相关文档,找到下面的文章,就按照此步骤
(UR1) http://xugang.blog.51cto.com/400032/95621
如果有人不想打开网址,我总结了一下,大体步骤,(6 make)
make mrproper
make menuconfig
make dep
make clean
make bzImage
make modules
make modules_install
make install
reboot
因此我一直按照UR1中介绍,一步的进行操作,但是在make bzImage的时候,问题就来了。
编译阶段 samples/hidraw/hid-example.c编译失败,报的错诸如/usr/include/sys/select.h和linux/types.h中的fd_set类型冲突,重复定义等。
没有其他办法,google (这个时候尽量不要用百度),搜到了相关网址(UR2) http://blog.csdn.net/yihuazhu/article/details/7702026
原来直接make menuconfig 就出现这问题啊,因此参考UR2中的说明,我改成make defconfig 果然此种方法,屡试不爽。知道最后一部分都没有,再出现过问题。
然后reboot,重启系统。头疼的问题又出现了,
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 / 错误信息大概是找不分区
setuproot: mount failed: No such file or directory” /
继续参考网址UR2,里面果然有介绍啊!! 原来是config文件中没有开启这个CONFIG_SYSFS_DEPRECATED_V2开关,那就在config文件里面找一下吧,在本人的config中居然没有这个选项,那好自己手动添加一下。然后在进行6个make步骤,注意:make menuconfig 要使用make defconfig否则会出错啊!!
一直到最后,也是非常的顺利,然后reboot重启,最后仍报上面的那个错误(找不到分区)。为什么啊?我明明在config文件里加入那个开关了,难道自己加入的开关,内核不识别吗? 带这个疑问,我又进行了google ,但是最终无果 ,稀里糊涂的,我在config中查找这个开关,居然没有找到,但是我很确定我加入了。为什么明明加入的开关怎么没有了呢?干脆,我不用本地config文件了,我在 http://www.ha97.com/code/config下载一个配置文件,
网上有很多去http://vbets.googlecode.com/files/config 但是这个页面无法打开。下载后搜一下是否有这个开关,确认后开关存在于这个配置文件中,
然后在进行6 make 最终还是报错,还是无法找到分区。没办法,我又看了一下config 搜索这个开关,居然又不存在了!!痛苦啊。。。。。
后来我思考了一下,修改config文件只有在make defconfig这一步,难道说。。。 好吧,我又重新测试了一下,果然是make defconfig 将原有的配置,给修改了。
到这里,我根据UR2中的说明(UR2里面说的很详细),我进行了总结:
1.如果使用make menuconfig会编译出错 这因为3.X内核很多宏和头文件都发生了变化,不兼容2.6部分头文件
2.使用make defconfig 虽然能够编译成功,但是找不到分区。
后来我在UR2 找到编译无法通过,是因为samples 文件夹中部分文件在2.6.18中不存在,直到2.6.32版本才加。
好吧,那我就尝试一下,升级为2.6.32之后的版本。本人下载的是2.6.38
然后进行6 make (第二步是make menuconfig )其中config文件是我从网站下载的。
顺利编译成功,reboot 重启,顺利进入系统。至此,升级2.6.38非常顺利。
如果有人只想,升级成2.6.38,就没有必要继续往下看了。
---------------------------------------------------------------------升级3.9.3-------------------------------------------------------------------------
上面只是升级成2.6.38,与本文章的标题,不一致。下面就需要进行升级3.9.9了。
在升级3.9.9需要解决的问题是, samples/hidraw/hid-example.c编译问题 这个问题是
参考UR2,更换本地linux头文件。(现在我终于发现UR2就是一个神奇的博客)那就开始动手更新linux头文件。如何更新linux头文件呢??
google吧。思路:
1.先将本地内核头文件(2.6.18更换成2.6.38)
2.进入2.6.38目录,执行make headers_install
3.替换/usr/include/中的头文件
以上如果不清楚,参考地址UR3(http://ju.outofmemory.cn/entry/6447)
ok,头文件升级完毕后,然后进行6 make应该就不会有samples这个问题了,第二步使用这个make menuconfig。
但是棘手的问题出现了,附上图片:
这个错误出现在make bzImage或者make modules当中 记不清楚了。这怎么办?继续google,但是google这为大神,也无能为了,我搜索未果啊!!
后来我想到了解决办法了,我可以在配置文件中,将gfs2这个模块不要编译到内核中,这样应该可以解决问题。具体内容附上另外一图:
将M变成空,即可。这个解决办法本人,并没有去尝试,感觉可以解决这个断错!!但是这个始终不是解决的根本,我后来在想,既然linux3.9.3
是发布版本,不应该出现这中低级错误啊!!所以我抱着尝试的想法,找了rgrp.c 这个文件,打开后发现报错的那行居然是下面这个段定义:
很是奇怪,linux内核中有很多这样初始化,结构体变量,为什么这里会报错吗??我这里没有深究为什么会报错,反正就是这里报错了,ok,那么我就
手动来改一下这段代码吧!!(红色是错误,蓝色是改正),然后编译,仍会有段错误,但是值得庆幸的是,居然不是这个函数了,也就是说,我们修改
源码是有效的。然后我继续查看段错误,发现错误是同一个问题,都是结构体初始化问题。好吧,那我就将整个文件中和这个结构有关的,都改一遍吧。
当我改完后,继续make 发现所有居然可以编译通过了。可见,我们修改源码是可以。至此,总结一下,这个问题吧
产生上述问题的原因可能是本人使用的gcc版本过低导致的。可能换个版本就没有问题啦。
经过上面阐述,最终生成linux内核,然后reboot重启电脑,最终顺利进入新版本内核3.9.3 。
----------------------------------------------------------------------------总结------------------------------------------------------------------------------------
第一次,写这么长的文章,层次结构可能不太清楚,我也尽力了。至此,升级linux内核成功,这个过程虽然有点痛苦,但是最后我还是很有收获的,
如果哪位同学,正在升级linux内核遇到了问题,请参考本文章!!谢谢
下面是本人在升级linux内核查看的资料,仅供参考:
xugang.blog.51cto.com/400032/95621
http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0801/4085.html
http://linuxme.blog.51cto.com/1850814/390778
http://blog.csdn.net/yihuazhu/article/details/7702026
http://www.ha97.com/code/config