Featured image of post CentOS 6.5 时代:内核升级与 ELRepo 实战

CentOS 6.5 时代:内核升级与 ELRepo 实战

2010 年代初的 CentOS 6.x 服务器:如何用 ELRepo 仓库把 2.6.32 内核升级到 longterm 版本

一、为什么 2010 年还要升级 CentOS 6.5 的内核

CentOS 6.5(2013-12-01 发布,是 CentOS 6 系列的最后一个主要版本)跑的是 2.6.32-431.el6.x86_64——一个 RHEL/CentOS 维护了 10 年的"长青"内核,对应 RHEL 的"zk 内核"分支。这套内核的好处是极其稳定,几乎所有服务器场景都能跑;坏处是新硬件支持差——比如后期出来的 Intel e1000e 网卡的某些固件 bug、SSD 控制器新特性、新 CPU 微码补丁等,都得靠第三方仓库才能拿到。

2010 年代初的运维圈子里,给生产服务器升级内核的标准动作就是:接 ELRepo。ELRepo(elrepo.org)是 RHEL/CentOS 生态最知名的第三方内核仓库,提供两套主线:

包名来源特点
kernel-ltLinux stable长期维护版(Long Term),稳定性优先
kernel-mlLinux mainline主线最新版,新特性优先

当时给生产服务器升级的常见选择是 kernel-lt——本文以 6.x 时代最常见的 kernel-lt-3.10.x 路线为例。

本文写于 2010 年,主要面向 CentOS 6.x 时代服务器。CentOS 6 已经在 2020-11-30 EOL,CentOS 7 已经在 2024-06-30 EOL,新机器建议直接上 Rocky / Alma / Ubuntu LTS。本篇留作"那个时代"的运维档案。

二、查清当前系统与内核版本

升级前先确认两件事:发行版版本、内核版本。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 发行版版本
[root@centos6 ~]# lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:...
Distributor ID: CentOS
Description:    CentOS release 6.5 (Final)
Release:        6.5
Codename:       Final

# 内核版本
[root@centos6 ~]# uname -r
2.6.32-431.el6.x86_64

lsb_release 在最小化安装的机器上默认没装,可以改用 cat /etc/redhat-release 兜底:

1
2
cat /etc/redhat-release
# CentOS release 6.5 (Final)

三、解决 yum 下载 ELRepo 公钥时的 SSL 错误

直接 rpm --import ELRepo 的 GPG 公钥,6.x 时代很容易遇到:

1
2
3
[root@centos6 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
curl: (35) SSL connect error
error: https://www.elrepo.org/RPM-GPG-KEY-elrepo.org: import read failed(2).

这是因为系统自带的 nss(Network Security Services)太老,跟不上 TLS 协议。解决方法就一条:先升级 nss

1
yum update nss

之后再 rpm --import 就正常了。

四、安装 ELRepo 仓库

ELRepo 提供按大版本分发的 release RPM,直接装就能拿到 repo 文件:

1
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm

这一步会生成 /etc/yum.repos.d/elrepo.repo,里面有两个仓库:

  • elrepo(主仓库,ELRepo 自有驱动)
  • elrepo-kernel内核专用
  • elrepo-extras

五、安装 kernel-lt 内核

只启用 elrepo-kernel 仓库,避免其他包被意外升级:

1
yum --enablerepo=elrepo-kernel install kernel-lt -y

安装完成后,新内核会出现在 /boot/ 下,同时 grub 也会自动加入对应的启动项。但grub 默认从序号 0 开始启动,新内核一般被装在最后,所以下一步要改默认启动顺序。

六、修改 grub 引导顺序

CentOS 6 时代的 grub 还是 legacy grub 1,配置文件是 /etc/grub.conf(实际软链接到 /boot/grub/grub.conf):

1
vi /etc/grub.conf

default=N 改成新内核对应的序号(一般是 0)。文件里长这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
default=0          # ← 改这个
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.10.0-1.el6.elrepo.x86_64)
    root (hd0,0)
    kernel /vmlinuz-3.10.0-1.el6.elrepo.x86_64 ro root=/dev/mapper/...
    initrd /initramfs-3.10.0-1.el6.elrepo.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/...
    initrd /initramfs-2.6.32-431.el6.x86_64.img

新内核放在 title 列表的最上面时,default=0 就指向它;放后面就改对应的序号。

坑提醒:改完一定要重启验证,别留在原内核就以为升级成功了。

七、重启验证

1
reboot

重启后再次 uname -r

1
2
uname -r
# 3.10.0-1.el6.elrepo.x86_64

确认已经是新内核,老的内核包先别删——留一两周观察稳定再清理。

八、常见坑速查

现象原因处理
rpm --import 报 SSL errornss 库太老yum update nss
安装后还是老内核启动grub default 没改编辑 /etc/grub.conf
启动到一半 dracut panicinitramfs 没生成或磁盘驱动没编进dracut --force 重生成 initramfs
第三方软件(如 VMware Tools)装不上内核头文件路径变了装对应 kernel-lt-devel

九、下一步

  • 想再激进一点(拿 Btrfs/OverlayFS 等新特性)→ 改用 kernel-ml,但绝不要在生产环境直接上——6.x 时代的 ml 包出过几次 initramfs 兼容事故
  • 想再稳一点(保留老内核回退)→ 升级前用 df/mount 拍个快照,VPS 用户用服务商控制台做 system snapshot
  • 配套的 kernel-lt-develkernel-lt-headers 也要一并装,否则后面编译 DKMS 模块(如 VirtualBox Guest Additions)会失败
  • 真要彻底升级大版本(6.x → 7.x)→ 走 redhat-upgrade-tool(已废弃)或重新装机,跨大版本升级从来都只适合有完整快照的测试机

参考资料


2024 视角:CentOS 6 时代已彻底过去,迁移方案汇总

本文写于 2010-06-15(实际是后人补档的"老运维回忆"),距今已 14 年。2024 视角下

一、CentOS 6 已经是"老古董"

  • 2020-11-30:CentOS 6 EOL(End of Life)。
  • 2020-12 至 2024-06:CentOS Linux 6 走"extended EOL"(付费支持)。
  • 2024-06-30CentOS Linux 6 全面停止维护
  • 2024 视角仍然跑 CentOS 6 的服务器已经无安全更新——强烈建议迁出

二、CentOS 6 迁到哪里

目标兼容性迁移成本适用
CentOS 790%不推荐(7 已 2024-06 EOL)
CentOS 895%不推荐(8 已 2021-12 EOL)
CentOS Stream 8/9100%滚动版,生产慎用
Rocky Linux 9100%首选(社区驱动,CIQ 维护)
AlmaLinux 9100%首选(CloudLinux 维护)
Oracle Linux 9100%大企业 / 商业支持
Ubuntu 22.04 LTS80%桌面 / 开发机
Debian 1280%服务器 / 容器

三、migrate2rocky 脚本一键迁移

1
2
3
4
5
6
# CentOS 6/7/8 → Rocky Linux 9
curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
chmod +x migrate2rocky.sh
sudo bash migrate2rocky.sh -r
# 重启
sudo reboot
  • 注意:必须先做完整备份(快照 / tar 全量),迁移过程会替换核心包。
  • 不兼容情况自定义编译的内核模块(如 NVIDIA 驱动、VirtualBox)需要重新编译。

四、CentOS 6 时代的"运维遗物"清单

2010 年代 CentOS 6 跑的常见服务,2024 都有现代替代:

老服务2024 替代
MySQL 5.1MySQL 8.0 / MariaDB 10.11
Apache 2.2Apache 2.4 / Nginx 1.27
PHP 5.3PHP 8.3
iptablesnftables(CentOS 7 后)
OpenSSH 5.3OpenSSH 9.x(强制 ed25519 / rsa-sha2-256)
ntpdchronyd(CentOS 7+)
ifconfigip(iproute2)
netstatss(iproute2)
servicesystemctl
chkconfigsystemctl enable/disable
ifupdownNetworkManager / nmcli
routeip route
arpip neigh
traceroutemtr(更现代)
wgetcurl(更通用)

五、CentOS 6 → 9 的"陷阱"清单

  • systemd 全面接管init.d 脚本不再被自动识别——必须写 *.service
  • firewalld 取代 iptables:老 iptables -A INPUT ... 命令仍兼容(底层是 nftables),但推荐用 firewall-cmd
  • SELinux 强制开启:从 CentOS 7 起默认开启,老脚本不写 SELinux context 会失败
  • Python 2.7 EOL(2020-01-01):所有 #!/usr/bin/python 必须改成 python3
  • OpenSSL 1.1+ / TLS 1.3 强制:老证书可能不再受信任。
  • GLIBC 2.28+(CentOS 9):老二进制(如 tcpcopy 1.2.0 预编译版)会报"GLIBC_2.34 not found"。

六、CentOS 6 的"真实价值":归档

2024 视角下,CentOS 6 的真正价值是"运维历史档案"——很多老脚本、老软件、老硬件驱动都跑在上面。

  • vmware-tools:CentOS 6 用老版 VMware Tools(kernel 2.6.32 兼容),CentOS 9 改用 open-vm-tools
  • Realtek 网卡驱动:CentOS 6 时代手动编译 r8168,CentOS 9 内核已自带。
  • NFS v3:CentOS 6 默认 NFSv3,CentOS 9 默认 NFSv4.2。
  • 32 位库:CentOS 6 装 glibc.i686 跑 32 位应用,CentOS 9 已经不默认装 i686 仓库。

七、2024 仍在跑 CentOS 6 的"现实方案"

  • 方案 A(推荐):迁移到 Rocky / Alma 9
  • 方案 B:用 Vault 仓库 + --enablerepo 让 yum 继续用(但无安全更新
  • 方案 C:用 docker 容器包老 OS:
1
2
3
4
5
# 用 Docker 跑 CentOS 6 容器(保留老应用)
docker run -it --rm centos:6 bash
# 内部操作
yum update
# 应用跑在容器里
  • 方案 D:上 K8s + 老 OS Pod(生产慎用
使用 Hugo 构建
主题 StackJimmy 设计