> CentOS > CentOS教程 >

Centos7编译替换内核

编译之前
引入
最近在学习 Linux,看到介绍内核,就想着自己编译一下内核,虽然不会搞硬件开发,不会写底层的东西,但还是想看一下编译的整个过程。想着就开始弄,没想到中间还是有很多坑的,尤其是编译之前,选择配置这一部分,配置项太多了,因为只是想看编译的整个过程,所以就没有深究每一个配置项。整个过程比较长,特此记录,避免以后再次踩坑。
 
环境
开始之前,先介绍一下编译环境。直接在自己常用的 Linux 主机上编译,中间肯定会出现问题,最后可能导致系统崩溃,别不信,我已经吃过几次亏了,所以这次选择在虚拟机软件 VMware Workstation 上安装 Linux 虚拟机进行编译安装。
 
虚拟机软件:VMware Workstation 14           
Liunx 发行版:CentOS 7 内置内核 linux 3.10.0
待编译内核:linux 4.14.14
 
开始编译之前,先把几项准备工作完成。
 
去 Linux 内核官网 www.kernel.org 下载 Linux 内核文件,选择稳定版(stable),文件名为 linux-4.14.14.tar.xz,去 CentOS 官网 www.centos.org 下载最新的 CentOS 7。
 
把 CentOS 在 VMware 里装好,安装过程不在赘述,网上一大堆。这里提醒一句,分给 CentOS 的硬盘空间不要太小,不然内核编译之后,空间可能不够。我第一次编译时,就是因为分的太小了,/ 目录装完系统之后只剩 6G 多,编译一个多小时,提示空间不足,编译失败,最后不得不重装系统,又耽误了时间。
 
此外,做好宿主机和虚拟机之间文件夹的共享,保证虚拟机可以读取宿主机里下载好的 Linux 内核文件,挂载可以实现,这个不会可以搜一下。
 
准备工作完成,下面正式开始编译内核,请做好踩坑的准备。
 
正文
开始之前呢,还要啰嗦几句,我先把安装的大致过程说一下,避免做到某一步时,只是在重复,却不知道在做什么。
 
编译安装大致分为以下几步:
 
解压内核
编译前,选择配置项,生成 config 文件
编译内核
安装模块,安装内核
更新引导文件
解压内核
先把内核文件放在上面提到的宿主机和虚拟机之间的共享文件夹,我的宿主机共享文件夹是 share,挂载到了 CentOS 的 /mnt/hgfs/share/ 目录下。
 
切换到 root 权限,将内核文件解压到指定目录,这个目录是没有限定的,哪个都行,这里放到了 /usr/src/ 目录下,这个也是 CentOS 内核所在的目录,后缀 .tar.xz 的文件可以使用下面的命令解压。
 
tar xvJf linux-4.14.14.tar.xz -C /usr/src/
 



内核解压之后,每个文件夹内包含的是什么代码,可以自行搜索了解一下。
 
配置项
重点来了,解压之后,编译之前要先生成 config 配置文件。这个文件是干什么的呢?它是编译时的必备文件,指明了所有的配置项,编译时就是根据你选择的配置项来定制内核的。在你的 CentOS 内同样有这样一个配置文件,在 /boot/ 目录下有一个 config 开头的文件,就是它,你可以先 cat 一下,会发现都是键值对,所有的配置项都在这。
 
配置项非常多,可以随心所欲的定制内核,把不需要的全部关闭,当然也不是随心所欲,某些配置项是必须要选的,否则可能连系统也启动不了。
 
选择配置项的方式有以下几种,当然它们的目的都是为了生成 config 文件,所以选择哪种都可以。
 
make config (基于文本的配置界面)
make menuconfig (基于文本菜单的配置界面)
make xconfig (基于图形窗口的配置界面)
make oldconfig (基于原来内核配置的基础上修改)
 
以上几种,make xconfig 最为友好,基于窗口操作,但是需要 Xwindow 的支持,CentOS 还好,若是使用其它没有图形界面的发行版就 GG 了。make menuconfig 相对比较友好,又是基于文本菜单,所有的发行版都可以使用,所以这里推荐使用 make menuconfig。
 
使用 make menuconfig 需要 ncurses-devel 的支持,如果之前没装过,需要执行下面的命令安装一下。
 
yum install ncurses-devel
 
执行 make menuconfig,开始选择配置项
 
make menuconfig
 



如果执行没有错误的话,会出现下面这个页面





Linux 内核所有的配置项都在这里,我第一次看到时,我去,这也太多了吧,这什么时候能看完。
 
为了选择配置项,又开始搜配置项的意思,看了几个比较大的之后,比如基本配置、网络、文件系统等等,就没再看了。我开始是为了看整个编译过程,研究每一配置项,没有太大的意义,并且不同的 CPU 架构,所能配置的配置项也是不一样的。网上有人解释了每个配置项的意义,可能不是最新的内核,感兴趣的可以研究一下 Linux 内核配置选项简介-金步国
 
内核的编译分为两个部分,核心和模块,对于核心的部分,要编译进核心,可能以后会用到的部分,尽量编译成模块。
 
文本菜单选择界面,使用左(←)、右(→)箭头切换底部菜单,上(↑)、下(↓)箭头切换中间的配置项,空格键 选择配置项,部分配置项右边有 —> 标识,代表有下级子项,可以使用 Enter 进去选择。
 
同时每一项的前面都有以下标识,可以根据需要选择。
 
<*>[*]  表示编译进核心
<M>     表示编译成模块
空格    表示不选中此项
 
当然,如果你只是看一下整个编译过程,不想深究每一项,执行上一步 make menuconfig 之后,直接保存退出就可以了,它会使用 CentOS 内部的配置文件作为这次编译的配置文件,不知道 CentOS 内部配置文件在哪的,自己往前翻。
 
保存退出之后的效果如下图
 



编译
配置项选完,config 配置文件生成之后,就可以开始编译了,编译需要 elfutils-libelf-devel 的支持,先执行下面的命令安装一下。
 
yum install elfutils-libelf-devel
 
内核的编译,执行 make 即可开始编译。
 
make
 
若编译过程中提示 致命错误:openssl/opensslv.h:没有那个文件或目录 ,请执行下面的命令安装一下依赖。
 
yum install openssl-devel
 
编译时间比较长,如果上面你是自定义配置项,把不需要的配置都关闭,编译会快的多。我这使用的 CentOS 内部的配置文件,CentOS 为了大多数人的使用,开的配置项比较多,所以编译的时间比较长,当然,也和你的电脑配置有关。我记了一下时间,这一部分的编译用了两个半小时,所以请耐心等待,可以去喝个咖啡。
 
安装
经过了漫长的等待,终于编译完成,现在可以开始安装了。上面配置项有的编译进核心,有的编译成模块,所以安装也分为两个部分,模块安装和核心安装。
 
执行 make modules_install 开始安装模块
 
make modules_install
 
等待完成,执行 make install 开始安装核心
 
make install
 
执行完成之后,就可以在 /boot/ 目录下看到新编译的内核了。
 


更新引导
到现在为止,离成功就差一步更新引导了。可以直接去修改 /boot/grub2/grub.cfg 文件来更新引导,但是非常不建议这样去做。
 
推荐使用 grub2-mkconfig 来更新引导文件,下面的命令会根据 /boot/ 目录下的内核文件自动更新 grub 文件。
 
grub2-mkconfig -o /boot/grub2/grub.cfg
 



 

执行完之后,下次启动系统的时候就可以选择我们编译的内核了。如果想修改默认的启动内核,可以通过修改 /etc/default/grub 文件来实现。

重启系统,如果看到两个内核,说明已经成功了,你可以自由的选择哪个内核。





至此,内核的编译安装就全部结束了,整个过程中,如果出现什么问题,根据报错信息就可以解决了。最后再啰嗦几句,说说这次编译。
 
总结
用 Linux 系统也很久了,没去研究过内核,只是知道而已,就是突然心血来潮想要编译一下 Linux 内核,就去搞了,一个简单的编译,还是遇到了不少坑。首先,第一次编译时,CentOS 分区给的太小,导致内核编译了一个多小时后停了下来,一看,好嘛,空间已经用完了。马上删了虚拟机,又重装,这次分了 50G,应该不会出现这个问题了。选择配置项的时候,又研究了一上午,一直在看每个配置项什么意思,总是想把每一项弄明白,看了一部分后,感觉工作量太大了,而且背离了初衷,然后就不看了,直接跳过去了。后面的过程就比较快,一气呵成。比较不足的还是没有定义自己的配置项,把自己编译最大的好处隔过去了,以后需要了再去搞吧,编译应该能节省不少时间。来来回回整了两天,虽然东西不太多,我感觉还是有点意义的。
 
(责任编辑:IT)