CentOS 7编译Linux内核(6.5.7)详细步骤

发布时间 2023-10-18 22:35:49作者: 终末之诗EndPoem_ZH

CentOS 7编译Linux内核(6.5.7)详细步骤

前言

对于一件要完成的任务,如果已有现成的、完善的方法文档可供参考,则博文只需引用链接即可,无需重复写一遍。写博客是结合自身需求,总结之前网络上没有的方法。本文即基于CentOS 7 64位,给出编译当前最新版Linux(6.5.7)的详细步骤。

参考链接:

  1. 下载解压部分参考:Linux 内核动手编译实用指南 - LinuxEden
    比较详细,可用于了解原理,但没有给出针对CentOS 7的方案(实验室用到的openEuler基于CentOS,所以需要CentOS的方案)。
  2. 配置编译安装参考:CentOS 7 下编译安装 Linux 4.14 内核 - 知乎
    内核版本比较旧了,不过影响很小。

准备编译环境

如果运行过sudo yum update,则编译所需工具链大概率已经装好。可通过下列指令检验:
sudo yum install gcc g++ gdb make
提示Nothing to do.则表明已装好,否则会自动安装上述工具链。

下载和解压内核

下载内核

Linux内核官网:https://www.kernel.org。本文以6.5.7为例,下载到了~/Downloads文件夹。

解压内核

将下载的内核解压到CentOS7的内核源码文件夹/usr/src/kernels/

cd /usr/src/kernels/
sudo tar -xvf ~/Downloads/linux-6.5.7.tar.xz
# tar命令,-x表示解压,-v表示显示过程,-f表示后面接压缩包文件名

配置编译参数.config

进入解压好的目录:
cd /usr/src/kernels/linux-6.5.7/
这里将本机的CentOS 7的.config配置文件拷贝过来:
sudo cp /boot/config-3.10.0-1160.99.1.el7.x86_64 ./.config

注意:CentOS 7在进行下一步之前,需要安装较新的GCC版本,否则:

[zh@localhost linux-6.5.7]$ sudo make oldconfig
***
*** C compiler is too old.
***   Your GCC version:    4.8.5
***   Minimum GCC version: 5.1.0
***
scripts/Kconfig.include:44: Sorry, this C compiler is not supported.

弯路:原本想参考文章解决CentOS7中gcc编译器版本过低的问题,采用GCC最新稳定版(12.3.0)的清华源链接进行编译安装,结果发现make编译需要几十分钟到几小时!以后软件优先找直接安装的方法(如下),省时省力!

按照如下方法安装GCC 7.3.1(参考链接):

sudo yum install centos-release-scl
sudo yum install devtoolset-7
scl enable devtoolset-7 bash

安装完成后可查看当前GCC版本:

gcc --version
gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
Copyright (C) 2017 Free Software Foundation, Inc.

注意:如果系统重启,需要重新使用指令scl enable devtoolset-7 bash以开启GCC7.3.1。

接下来即可进行编译参数的配置,主要分为以下4种:

  1. make config (基于文本的配置界面)
  2. make menuconfig (基于文本菜单的配置界面)
  3. make xconfig (基于图形窗口的配置界面)
  4. make oldconfig (基于原来内核配置的基础上修改)

make menuconfig

下面以menuconfig为例,首先安装前置插件:
sudo yum install ncurses-devel

然后运行配置命令:
sudo make menuconfig

如果只是看一下编译过程,不想深究每一项,执行make menuconfig 之后直接保存退出(双击Esc)即可。

make oldconfig(如已做过menuconfig则跳过此项)

sudo make oldconfig
之后将会提示一连串选项(下面是第1条选项),只要全程按住回车即可配置完成。
Compile also drivers which will not load (COMPILE_TEST) [N/y/?] (NEW)

编译源码

配置项选完,.config配置文件生成之后,就可以开始编译了,编译需要 elfutils-libelf-devel的支持,执行下面的命令安装:
sudo yum install elfutils-libelf-devel

为了避免编译过程中提示 致命错误:openssl/opensslv.h:没有那个文件或目录 ,预先执行下列指令安装依赖:
sudo yum install openssl-devel

执行make即可开始编译,不过更建议使用如下命令:
sudo make -j$(nproc) 2>&1 | tee log
参数-j$(nproc)表示“使用与(本机CPU线程数)相同的(并行编译任务数)”,提高效率。可通过cat /proc/cpuinfo查看本机的CPU线程数。
参数2>&1 | tee log表示将make过程输出到log文件,如编译过程遇到错误,可通过grep Error log查看。(注:提示tee指令没有权限,此问题尚未解决,影响很小)

编译时间比较长,需要耐心等待。我的i5-12400F(分配给虚拟机8核)只要15分钟左右就完成了。

安装模块

sudo make modules_install

安装核心

sudo make install

更新引导

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

后记

思路总结:下载解压源码 - 配置参数 - 编译源码 - 安装模块 - 安装核心 - 更新引导。

尽管重启之后看到编译好的新内核了,但运行此系统时提示Failed to insert module 'autofs4'
找了解决方案修改了配置重新编译,启动界面如下:
启动界面
但又出现了新的报错(SMbus host controller not enabled):
新的报错

问题难以解决,因为报错信息一闪而过就自动转为CentOS 7启动了,没有在原系统输入指令的机会!当然肯定有办法解决,但路漫漫其修远兮,只好今后有精力再探索了。