Linux系统内核升级

Linux 内核版本管理

Linux kernel官网:https://kernel.org/
Active kernel releases(查看EOL信息):https://kernel.org/category/releases.html

Linux kernel版本状态说明

mainline

mainline指由Linus Torvalds亲自制作的内核发布版,是官方当前最新版本的kernel source。在Torvalds对所有其他程序员所做出的重大变化进行整合,并且对先前版本的bug进行几轮修复之后,大约每十周正式发布一个新版本。mainline事实上代表着一个linux kernel分支,这个分支有另一个名称,叫做vanilla。

longterm

longterm,是Long Term Support的缩写,长期维护的意思。

stable

stable顾名思义,稳定版。
说明:稳定版本不一定都提供长期支持,而提供长期支持的一定是稳定版本。

linux-next

linux-next,是代码提交周期结束之前生成的快照,用于给Linux代码贡献者们做测试。

Prepatch

Prepatch 或 “RC” 内核是主要的内核预发行版本,主要针对内核开发人员和 Linux 爱好者。必须从源代码进行编译,并且通常包含必须在可以放入稳定版本之前进行测试的新功能。Prepatch 内核由 Linus Torvalds 维护和发布。

升级前准备

1
2
# 依赖环境安装
[root@boy ~]# yum -y install gcc gcc-c++ kernel-devel kernel-headers bison flex ncurses-devel qt-devel hmaccalc zlib-devel binutils-devel elfutils-libelf-devel ncurses ncurses-devel openssl-devel

升级GCC版本,由于5.15.26源码对gcc版本有要求了,自动的gcc无法满足编译。安装升级gcc 8

1
2
3
# [root@boy ~]# yum -y install centos-release-scl
# [root@boy ~]# yum -y install devtoolset-8-gcc*
# [root@boy ~]# scl enable devtoolset-8 bash

GCC源码升级(时间长)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /server/tools
tar xf gcc-5.5.0.tar.xz
cd gcc-5.5.0/
./contrib/download_prerequisites
cd ../
mkdir gcc-build-5.5.0
cd gcc-build-5.5.0/
../gcc-5.5.0/configure --prefix=/usr/local/gcc --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j32 #-j后边的数字表示并发编译,一般等于CPU core 数量
make install
mv /usr/bin/gcc{,.bak}
mv /usr/bin/g++{,.bak}
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++

升级内核

下载并解压

1
2
3
4
5
6
7
8
# 下载5.15.26 源码包
[root@boy ~]# wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.26.tar.xz -O /root/linux-5.15.26.tar.xz

# 解压源码包
[root@boy ~]# unxz -v linux-5.15.26.tar.xz
linux-5.15.26.tar.xz (1/1)
100 % 121.7 MiB / 1,098.9 MiB = 0.111 46 MiB/s 0:23
[root@boy ~]# tar -xf linux-5.15.26.tar

配置内核功能

1
2
3
4
# 拷贝原有的内核配置文件,后续可在原有基础之上进行内核功能删减
[root@boy ~]# cd linux-5.15.26/
[root@boy linux-5.15.26]# cp /boot/config-$(uname -r) .config
[root@boy linux-5.15.26]# make menuconfig

运行 make menuconfig,开启文本界面的编译选项菜单窗口,可以对内核加载的模块编译选项进行调整,如修改编译后的内核名称、新添加之前系统缺少的模块等。

  • 修改内核名称:

    General setup —>local version -append to kernel release

    此处修改内核名称为-vuln-docker.x86_64,编译完成后内核名称为5.15.26-vuln-docker.x86_64

  • 新添加NTFS文件系统支持模块:

    File systems —>DOS/FAT/NT Filesystems —>NTFS file system support

    建议选择以模块方式(M选项)编译。(*号则是以静态方式编译打包进内核文件中,如果新添加的模块较多,会导致内核文件体积增大)

  • 新添加cgroup模块中RDMA

    General setup —-> Control Group support

  • 去掉Kernel debbugging选项,这样可以减少编译完成后内核存储大小

    Kernel Hacking —> Kernel debbugging

编译内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 开始编译并创建一个压缩的内核镜像,-j后边的数字表示并发编译,一般等于CPU core 数量
[root@boy linux-5.15.26]# make -j$(nproc)

# 安装内核modules,实际上就是把编译好的module拷贝到/lib/modules/5.15.26
[root@boy linux-5.15.26]# make modules_install

# 安装内核,安装完成后会在/boot目录生成三个文件,initramfs-5.15.26.img、System.map-5.15.26、vmlinuz-5.15.26
[root@boy linux-5.15.26]# make install

# 更新grub配置
[root@boy linux-5.15.26]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@boy linux-5.15.26]# grub2-set-default 0 #0表示 /boot/grub2/grub.cfg 文件中排在第一位的 menuentry 段

# 重启系统
[root@boy ~]# reboot

# 查看重启后的内核版本
[root@boy ~]# uname -mrs
Linux 5.15.26-vuln-docker.x86_64 x86_64

报错

1
2
3
4
You are building kernel with non-retpoline compiler.
Please update your compiler.
make[1]: *** [checkbin] Error 1
make: *** [__sub-make] Error 2

vim .config

CONFIG_RETPOLINE=n

内存不足

1
2
3
4
5
6
objcopy:arch/x86/boot/compressed/vmlinux.bin[.text]: No space left on device
make[3]: *** [arch/x86/boot/compressed/vmlinux.bin] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [arch/x86/boot/compressed/vmlinux] Error 2
make[1]: *** [bzImage] Error 2
make: *** [__sub-make] Error 2