1. 前言
Linux 内核升级到最新的版本,需要先升级gcc
的版本,本文主要以 RHEL8.0 为 OS,讲解 Linux 内核5.6.3
版本和 GCC 编译器7.5
为例,讲解整个更新过程。
2. 升级必须的安装包
OS 安装选择的是 Desktop 下包全选,如果是其他安装,需要检查 OS 是否安装 gcc,libstdc++,make 以及 kernel-headers,kernel-devel,ncurses-devel 等等,如果没有安装,可以通过 yum 安装"development tools" group.
yum groupinstall "Development Tools
yum install ncurses-devel
3. 更新gcc
编译器版本到 7.5
1.解压 gcc 压缩包到指定目录
tar -xvf gcc-7.5.0.tar.gz -C /usr/local/src/
一般我们将第三方的软件源代码放置在/usr/local/src
目录
2.下载必要的编译库
cd /usr/local/src/gcc-7.5.0
可以通过目录contrib/download_prerequisites
查看到必要的库有以下几个:
如果机器已经连接互联网,则可以通过执行以下命令,直接从互联网自动下载
./contrib/download_prerequisites
当然如果没有联网,可以通过自己手动下载,下载地址是ftp://gcc.gnu.org/pub/gcc/infrastructure/,然后将这四个压缩包放置到gcc
源码根目录/usr/local/src/gcc-7.5.0
,然后再执行即可。
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/gmp-6.1.0.tar.bz2 .
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/mpfr-3.1.4.tar.bz2 .
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/mpc-1.0.3.tar.gz .
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/isl-0.16.1.tar.bz2 .
[root@localhost gcc-7.5.0]# ./contrib/download_prerequisites
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.
3.编译安装
./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j24
make install
shutdown -r now
--disable-multilib
意味着只编译 64bit 编译器,如果想编译 32bit 编译器,可以用--enbale-multilib
,OS 必须安装 i686 的包,这些包默认是没有安装的。 --enbale-languages
指定编译的语言,如果不指定,可能需要好几天的时间。 make -j24
并行多线程编译,可以减少编译时间。24
指定 jobs number.可以指定为 CPU 支持的最大线程数。
48 个 jobs,我这可是一个 48 cores 的机器,编译用时 13 分钟,如果是个人 PC,那估计没个几个小时,是不可能完事,开始编译,该干嘛就可以干嘛去了。
安装完成后必须重启系统,不然下一步升级内核会报错
重启后,gcc -v
查看当前gcc
版本是否是最新的版本。
[root@localhost ~]# gcc -v
Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.5.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib Thread model: posix gcc version 7.5.0 (GCC)
4. 更新内核到5.6.3
开始编译前,需要先安装 libelf-dev, libelf-devel 或者 elfutils-libelf-devel。 RHEL8.0 OS, 我们选择安装 elfutils-libelf-devel.
yum install elfutils-libelf-devel
还需要安装openssl-devel
加解密开发包
yum install openssl-devel
1.解压内核源文件到指定目录
tar -xvf linux-5.6.3.tar.xz -C /usr/src/kernels/
一般我们将内核源代码放置在目录/usr/src/kernels
,该目录同样是系统默认内核的 kernel source 所在位置。
2.编译安装
cd /usr/src/kernels/linux-5.6.3/ sh -c 'yes "" | make oldconfig' make -j48 make modules_install make install
第二个命令用于将当前系统的内核选项生成到当前目录,会在内核目录生成.config
文件,该文件内记录了哪些编译为模块,哪些是 buildin。
另外,
可以通过make clean
清理编译环境,这个命令会清理掉已经编译的,但不包含配置文件,如.config
可以通过make mrproper
清理编译环境,包含所有的编译内容。
编译过程中显示的CC
是check compile
的缩写。
[M]
表示编译为module
,否则为 buildin。
如果有特殊编译需求,可以通过make menuconfig
逐一配置编译项。
3.切换启动内核为新的内核
grub2-set-default 0
切换默认引导项为第一项,可以查看 grub.cfg 文件。
4.重启后查看内核版本
[root@localhost ~]# uname -r 5.6.3
5. Debug
-
如果报以下错误
make[1]: *** No rule to make target 'certs/rhel.pem', needed by 'certs/x509_certificate_list'.
可以查看.config 文件中,CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"
改为CONFIG_SYSTEM_TRUSTED_KEYS=""
即可。