写在前面的废话
自2024年官方彻底抛弃CentOS 7后,CentOS 7的默认Linux内核版本便永远定格在了3.10。
即使本人是一个“能用就行”主义者,但3.x的内核再怎么说也太老了。就比如BBR拥塞控制算法(2016年发布),支持的最低内核版本都是4.9。
许久之前,升级内核还可以用过yum install这种简单粗暴的方式,然而原先用来安装内核的仓库已经删库跑路。所以本文带你直接下载Linux内核的源码,并用编译源码的方式将内核版本升级至6.6.52。
为什么是6.6?
CentOS 7的glibc 2.17和内核工具链已经十分老旧,能稳定编译的最高内核版本大约是6.6 LTS。
据说6.7~6.9也能编译,但某些功能会自动禁用。而从6.10开始大量功能依赖新工具链,CentOS 7几乎无法完整编译。
同时6.6似乎也是最后一个不依赖Rust的LTS内核。老旧的工具链对Rust并不友好。
事前准备
如果你还没有安装编译所需的工具,且没有更新CentOS官方仓库地址,请先阅读这篇文章 完成仓库更新。
然后通过YUM安装编译工具:
yum groupinstall -y "Development Tools"
yum install -y ncurses-devel openssl-devel elfutils-libelf-devel bc flex bison
还有就是最重要的:为避免悲剧,更换内核前请注意备份系统!
接下来看我操作
- 下载并解压源码并进入源码目录
KVER=${KVER:-6.6.52}
cd /usr/src
curl -LO https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$KVER.tar.xz
tar -xf linux-$KVER.tar.xz
cd linux-$KVER
- 生成配置
- 首先,基于现行旧内核支持的模块制作新内核的编译配置:
cp -v /boot/config-$(uname -r) .config || true
yes "" | make oldconfig
# oldconfig不会自动开启新功能,只会补齐新内核新增的选项
- 然后,执行
make menuconfig,在菜单中选择想要编译进新内核的新模块。
这一步虽然是可选步骤,但如果想使用像BBR这种在3.10之后版本中引入的特性,需要额外添加。
开启BBR选项所在位置:
Networking support --->
Networking options --->
TCP: advanced congestion control --->
<*> BBR congestion control algorithm
- 开始编译内核和各个模块
make -j$(nproc)
make -j$(nproc) modules
注:编译过程中如果出现跟tar有关的报错,请参考这篇文章解决。
- 安装内核
make modules_install
make install
grub2-mkconfig -o /boot/grub2/grub.cfg
# ^^ 执行结果中出现新版本内核则说明新内核已被安装
- 设置内核启动顺序并重启
egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
# ^^ 如果新内核显示在列表第一位,那么这里的数字就是0。以此类推:
grub2-set-default 0
reboot
重启完成后,用uname -a命令确认内核升级完成。
一键安装脚本
上述步骤1~4可用以下脚本一键执行。注意在“[2/4] 生成配置”时会弹出模块选择菜单,需要手工交互。不需要的话可以注释掉make menuconfig那一行。
#!/bin/bash
set -e
KVER=${KVER:-6.6.52}
echo "[1/4] 下载内核源码..."
cd /usr/src
curl -LO https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$KVER.tar.xz
tar -xf linux-$KVER.tar.xz
cd linux-$KVER
echo "[2/4] 生成配置..."
cp -v /boot/config-$(uname -r) .config || true
yes "" | make oldconfig
make menuconfig
echo "[3/4] 编译内核 + 模块..."
make -j$(nproc)
make -j$(nproc) modules
echo "[4/4] 安装内核..."
make modules_install
make install
grub2-mkconfig -o /boot/grub2/grub.cfg
写在最后的废话
有人说,换成更加现代操作系统不行吗?
还真不一定行。一个典型的例子就是阿里云那个最便宜的t6突发实例。
CentOS 7在上面稳定运行了将近一坤年。前几天本人将其OS更换为RockyLinux 10。
谁曾想以前从未感觉到,这服务器性能低到令人发指。dnf update级别的命令可以让它直接宕机(就是连后台VNC进去都无法操作的那种),突发实例的CPU积分更是瞬间清零。
最后还是老老实实换回了CentOS 7,依旧能平稳运行。看来这古董系统还要再战半个世纪。
