项目中因为要用到一些新的系统调用,需要升级当前所用的Red Hat5.2,于是就从Linux内核官方网站上下载源码进行编译。
2.安装软件
编译安装新内核,依赖于开发环境和开发库
# yum grouplist // 查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库;
# yum groupinstall "Development Tools" // 一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具
# yum install ncurses-devel // 你必须这样才能让 make *config 这个指令正确地执行
# yum install qt-devel // 如果你没有 X 环境(图形界面),这一条可以不用
# yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel // 创建 CentOS-6 内核时需要它们
1.获取并解压内核源码,配置编译项
本次我选择的升级内核版本是2.6.32.23。
我们在系统原有的内核配置文件的基础上建立新的编译选项,所以复制一份原配置文件到当前目录下,命名为.config。
[root@src ~]# tar -jxvf linux-2.6.32.23.tar.bz2 -C /usr/src/
[root@src ~]# cd /usr/src/linux-2.6.32.23/
[root@src linux-2.6.32.23]# cp /boot/config-2.6.18-92.el5 .config
接下来继续配置:
[root@src linux-2.6.32.23]# sh -c 'yes "" | make oldconfig'
make oldconfig会读取当前目录下的.config文件,在.config文件里没有找到的选项则提示用户填写。make oldconfig会在生成新的.config之前备份为.config.old,并生成新的.config文件。
有的文档里介绍使用make memuconfig(系统中必须安装有ncurses库),它是以菜单的方式,选择编译内核需要的模块,类似界面如下:
2.开始编译
[root@src linux-2.6.32.23]# make bzImage // 生成内核文件
[root@src linux-2.6.32.23]# make modules // 编译模块
[root@src linux-2.6.32.23]# make modules_install // 编译安装模块
3.安装
[root@src linux-2.6.32.23]# make install
4.修改grub引导,重启
安装完成后,需要修改Grub引导顺序,让新安装的内核作为默认内核。
# vim /etc/grub.conf
数一下刚刚新安装的内核在哪个位置,从0开始,然后设置default为那个数字,一般新安装的内核在第一个位置,所以设置default=0。
然后,重启后确认当前内核版本
[root@src ~]# shutdown -r now
[root@src ~]# uname -r
显示内核版本为2.6.32.23,则表示升级内核成功。
1.在升级编译完内核,重启后无法进入系统,提示如下错误信息:
解决方法:编译时修改.config文件中的“CONFIG_SYSFS_DEPRECATED_V2”,默认该选项是被注释掉的,为not set,将其改为y,即修改为“CONFIG_SYSFS_DEPRECATED_V2=y”,修改后,再编译,重启即正常了。
2.如果编译失败(如缺少依赖包),可以先清除,再重新编译
[root@src ~]# cd /usr/src/linux-2.6.32.23
[root@src linux-2.6.32.23]# make mrproper // 完成或者安装过程出错,可以清理上次编译的现场
[root@src linux-2.6.32.23]# make clean
参考资料:
https://segmentfault.com/a/1190000000733628