编译安装大致分为以下几步:
- 升级gcc
- 解压内核
- 编译前,选择配置项,生成 config 文件
- 编译内核
- 安装模块,安装内核
- 更新引导文件
升级gcc
解压内核
将内核文件解压到指定目录,这里放到了 /usr/src/ 目录下,这个也是 CentOS 内核所在的目录,后缀 .tar.xz 的文件可以使用下面的命令解压。
tar xvJf linux-5.15.52.tar.xz -C /usr/src/
配置项
重点来了,解压之后,编译之前要先生成 config 配置文件。这个文件是干什么的呢?它是编译时的必备文件,指明了所有的配置项,编译时就是根据你选择的配置项来定制内核的。在你的 CentOS 内同样有这样一个配置文件,在 /boot/ 目录下有一个 config 开头的文件,就是它,你可以先 cat 一下,会发现都是键值对,所有的配置项都在这。
配置项非常多,可以随心所欲的定制内核,把不需要的全部关闭,当然也不是随心所欲,某些配置项是必须要选的,否则可能连系统也启动不了。
选择配置项的方式有以下几种,当然它们的目的都是为了生成 config 文件,所以选择哪种都可以。
make config (基于文本的配置界面)
make menuconfig (基于文本菜单的配置界面)
make xconfig (基于图形窗口的配置界面)
make oldconfig (基于原来内核配置的基础上修改)
这里推荐使用 make menuconfig。
使用 make menuconfig 需要 ncurses-devel 的支持,如果之前没装过,需要执行下面的命令安装一下。
yum install -y ncurses-devel
还有一些其依赖需要安装
yum install -y flex
yum install -y bison
执行 make menuconfig,开始选择配置项
make menuconfig
如果执行没有错误的话,会出现下面这个页面
内核的编译分为两个部分,核心和模块,对于核心的部分,要编译进核心,可能以后会用到的部分,尽量编译成模块。
文本菜单选择界面,使用左(←)、右(→)箭头切换底部菜单,上(↑)、下(↓)箭头切换中间的配置项,空格键 选择配置项,部分配置项右边有 —> 标识,代表有下级子项,可以使用 Enter 进去选择。
同时每一项的前面都有以下标识,可以根据需要选择。
<*>[*] 表示编译进核心
<M> 表示编译成模块
空格 表示不选中此项
当然,如果你只是看一下整个编译过程,不想深究每一项,执行上一步 make menuconfig 之后,直接保存退出就可以了,它会使用 CentOS 内部的配置文件作为这次编译的配置文件,不知道 CentOS 内部配置文件在哪的,自己往前翻。
选择“Exit”后会提示是否保存,这里选"Yes"。
编译
配置项选完,config 配置文件生成之后,就可以开始编译了,编译需要 elfutils-libelf-devel 的支持,先执行下面的命令安装一下。
yum install -y elfutils-libelf-devel
安装编译需要的依赖项
yum install -y perl
yum install -y openssl-devel
内核的编译,执行 make 即可开始编译。
make
编译时间比较长,如果上面你是自定义配置项,把不需要的配置都关闭,编译会快的多。我这使用的 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 文件来实现。
重启系统,如果看到两个内核,说明已经成功了,你可以自由的选择哪个内核。