我CentOS系统升级至最新版本全攻略:从版本选择到平滑过渡的实战指南

2026-01-11 07:57:01

引言:理解CentOS升级的背景与挑战

CentOS作为企业级Linux发行版的代表,长期以来以其稳定性和与Red Hat Enterprise Linux (RHEL) 的高度兼容性而闻名。然而,随着CentOS项目的战略调整(特别是CentOS 8的生命周期缩短以及CentOS Stream的推出),许多用户面临着从传统CentOS版本向新平台迁移的迫切需求。

系统升级是一个复杂的过程,涉及版本选择、数据备份、依赖管理、服务迁移等多个环节。一个成功的升级不仅需要技术层面的准备,更需要对整个生态系统有清晰的认知。本文将为您提供一份详尽的CentOS升级指南,涵盖从版本选择到平滑过渡的全过程,并结合实际案例和代码示例,帮助您安全、高效地完成系统升级。

第一部分:版本选择策略——明确您的升级路径

在开始升级之前,首要任务是选择合适的目标版本。这取决于您的业务需求、硬件环境以及对稳定性的要求。

1.1 CentOS版本演进与现状

CentOS 7:基于RHEL 7,支持至2024年6月。这是目前仍在广泛使用的版本,但已接近生命周期终点。

CentOS 8:基于RHEL 8,原定支持至2029年,但Red Hat调整了策略,于2021年底停止维护,仅保留至2021年12月。这导致大量用户被迫迁移。

CentOS Stream:作为RHEL的上游开发分支,提供更前沿的软件包,适合开发者和愿意参与测试的用户。

替代方案:

Rocky Linux:由CentOS创始人发起,旨在延续CentOS的传统,提供与RHEL二进制兼容的免费发行版。

AlmaLinux:由CloudLinux公司发起,同样提供RHEL兼容性,承诺长期支持。

Oracle Linux:提供RHEL兼容性,Oracle提供免费更新和商业支持。

1.2 选择建议

生产环境:推荐选择Rocky Linux或AlmaLinux,它们继承了CentOS的稳定性和社区支持,是当前最主流的替代方案。

开发与测试环境:可以考虑CentOS Stream,以获取最新的软件包和功能。

特定场景:如果您的应用依赖Oracle数据库或云服务,Oracle Linux也是一个可行的选择。

1.3 升级路径分析

直接升级(In-place Upgrade):适用于小版本之间的升级(如CentOS 7.9 -> CentOS 7.10),或使用专门的升级工具(如Leapp)进行大版本升级(如CentOS 7 -> Rocky Linux 8)。优点是无需重装系统,保留现有配置和数据;缺点是可能存在依赖冲突或兼容性问题。

全新安装(Clean Install):推荐用于跨大版本升级(如CentOS 7 -> Rocky Linux 9)。优点是系统干净、稳定;缺点是需要重新配置环境和迁移数据。

第二部分:升级前的准备工作——确保万无一失

无论选择哪种升级路径,充分的准备都是成功的关键。以下步骤是必须执行的:

2.1 系统状态检查

在进行任何操作之前,全面了解当前系统的状态。

# 检查当前操作系统版本

cat /etc/redhat-release

# 或者

cat /etc/os-release

# 检查内核版本

uname -r

# 检查已安装的软件包(特别是关键应用)

rpm -qa | grep -E "(nginx|mysql|httpd|php|docker)"

# 检查系统架构

getconf LONG_BIT

# 检查磁盘空间

df -h

# 检查内存和CPU

free -h

lscpu

2.2 数据备份——最重要的步骤

备份是系统升级的生命线。必须备份所有关键数据,包括系统配置、应用数据、数据库等。

# 1. 备份系统配置文件

tar -czvf /backup/etc_backup_$(date +%Y%m%d).tar.gz /etc

# 2. 备份用户数据(根据实际情况调整)

tar -czvf /backup/home_backup_$(date +%Y%m%d).tar.gz /home

# 3. 备份数据库(以MySQL为例)

mysqldump -u root -p --all-databases > /backup/all_databases_$(date +%Y%m%d).sql

# 4. 备份Web服务器配置

cp -r /etc/nginx /backup/nginx_backup_$(date +%Y%m%d)

cp -r /etc/httpd /backup/httpd_backup_$(date +%Y%m%d)

# 5. 记录已安装的关键软件包列表

rpm -qa --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' > /backup/installed_packages_$(date +%Y%m%d).txt

# 6. 记录系统服务状态

systemctl list-unit-files --type=service > /backup/service_status_$(date +%Y%m%d).txt

# 7. 记录网络配置

ip addr show > /backup/network_config_$(date +%Y%m%d).txt

cat /etc/resolv.conf >> /backup/network_config_$(date +%Y%m%d).txt

重要提示:将备份文件存储在独立的物理介质或远程服务器上,不要仅保留在本地磁盘。

2.3 依赖和兼容性检查

检查关键应用是否支持目标版本。

数据库:MySQL 5.7是否支持Rocky Linux 8?PostgreSQL版本兼容性如何?

中间件:Nginx、Apache、Tomcat等是否有对应版本的RPM包?

自定义应用:检查是否有编译依赖或动态链接库问题。

2.4 创建系统恢复计划

准备应急方案:

制作系统启动盘(Live CD/USB)

准备KVM或IPMI等带外管理工具

记录关键服务的启动顺序和依赖关系

第三部分:实战升级——以CentOS 7升级到Rocky Linux 8为例

我们将使用Leapp工具进行原地升级。Leapp是Red Hat开发的开源工具,已被Rocky Linux和AlmaLinux采用,用于自动化升级过程。

3.1 安装Leapp工具和依赖

# 在CentOS 7系统上执行

# 1. 安装EPEL仓库(提供额外的软件包)

yum install -y epel-release

# 2. 安装Leapp相关包

yum install -y leapp leapp-upgrade

# 3. 安装Leapp数据包(针对目标系统)

# 对于Rocky Linux 8,需要下载对应的data包

# 首先确认架构,通常是x86_64

ARCH=$(arch)

# 下载Rocky Linux的Leapp数据包

# 注意:需要从Rocky官方源获取最新版本

curl -O https://download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os/Packages/l/leapp-data-0.1-1.el8.noarch.rpm

# 安装数据包

yum install -y leapp-data-*.rpm

3.2 配置Leapp升级参数

Leapp需要知道升级的目标和一些特定配置。

# 1. 设置升级目标环境变量

export LEAPP_UNSUPPORTED=1

export LEAPP_NO_RHSM=1

# 2. 创建Leapp配置文件

mkdir -p /etc/leapp/files

cat > /etc/leapp/files/leapp_upgrade.conf << EOF

[general]

# 设置目标发行版

target_os_version = 8.0

# 设置源发行版

source_os_version = 7.9

# 如果使用自定义仓库,可以在这里配置

[repositories]

# 例如,如果使用Rocky Linux的仓库

# baseurl = https://download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os/

# gpgcheck = 1

# gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-8

EOF

3.3 运行预升级检查

Leapp会执行一系列检查,识别潜在问题。

# 执行预升级检查

leapp preupgrade

# 该命令会生成一个详细的报告,通常位于 /var/log/leapp/leapp-report.txt

# 也会在屏幕上显示关键问题

# 查看报告

cat /var/log/leapp/leapp-report.txt

常见问题及解决方案:

问题:检测到第三方内核

解决方案:移除第三方内核,只保留官方内核。

# 查看已安装的内核

rpm -qa | grep kernel

# 移除第三方内核(如kernel-ml, kernel-lt)

yum remove -y kernel-ml-*

问题:检测到不兼容的软件包

解决方案:根据报告卸载或更新这些软件包。例如,某些旧版本的Nginx可能需要手动处理。

# 示例:卸载冲突的包

yum remove -y old-package-name

问题:/etc/fstab中存在不支持的文件系统

解决方案:检查并注释掉不支持的条目,或转换为支持的文件系统。

问题:SELinux处于禁用状态

解决方案:Leapp要求SELinux处于Enforcing或Permissive模式。临时设置为Permissive。

setenforce 0

# 确保配置文件不是disabled

sed -i 's/SELINUX=disabled/SELINUX=permissive/g' /etc/selinux/config

问题:检测到旧的GPG密钥

解决方案:移除旧的CentOS GPG密钥,安装新的Rocky Linux密钥。

rpm -e gpg-pubkey-f4a80eb5-53a7ff4b

# 下载并安装Rocky GPG密钥

rpm --import https://download.rockylinux.org/pub/rocky/RPM-GPG-KEY-Rocky-8

3.4 执行升级

当所有预检查问题都解决后,可以开始正式升级。

# 执行升级命令

leapp upgrade

# 这个过程会:

# 1. 下载所需的RPM包

# 2. 替换系统核心组件

# 3. 重新配置系统

# 4. 生成新的内核镜像

# 升级过程可能需要较长时间,取决于网络速度和系统性能

升级过程中的关键步骤:

下载阶段:Leapp会从配置的仓库下载所有需要的RPM包。

事务检查:确保所有包的依赖关系正确。

执行升级:使用dnf或yum执行实际的包替换。

生成Initramfs:为新的内核创建初始RAM磁盘。

更新引导配置:更新GRUB配置,指向新内核。

3.5 重启与验证

升级完成后,系统需要重启以进入新系统。

# 重启系统

reboot

# 系统重启后,会自动进入新内核和系统

# 登录后立即验证

重启后的验证步骤:

# 1. 检查系统版本

cat /etc/redhat-release

# 应该显示 Rocky Linux release 8.x (Green Obsidian)

# 2. 检查内核版本

uname -r

# 应该显示 4.18.0-xxx.el8.x86_64

# 3. 检查SELinux状态

sestatus

# 应该显示 enforcing 或 permissive

# 4. 检查已安装的包管理器(现在应该是DNF)

which dnf

# 应该返回 /usr/bin/dnf

# 5. 更新系统到最新状态

dnf update -y

# 6. 检查关键服务状态

systemctl list-unit-files --type=service | grep -E "(nginx|httpd|mysqld|docker)"

# 7. 重新启动关键服务

systemctl restart nginx

systemctl restart mysqld

# 8. 检查服务日志

journalctl -u nginx -f

journalctl -u mysqld -f

第四部分:全新安装的替代方案——更安全的选择

如果原地升级遇到无法解决的问题,或者您希望获得一个更干净的系统,全新安装是最佳选择。

4.1 制作启动盘

# 在另一台Linux机器上执行

# 下载Rocky Linux ISO

wget https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.5-x86_64-minimal.iso

# 写入U盘(假设U盘设备为/dev/sdb,请务必确认)

dd if=Rocky-8.5-x86_64-minimal.iso of=/dev/sdb bs=4M status=progress oflag=sync

4.2 安装过程关键配置

分区策略:

/boot:至少1GB

/:至少50GB(建议100GB+)

/var:根据日志和应用数据大小分配

/home:根据用户数据分配

swap:通常为内存的1-2倍,但不超过8GB

软件包选择:

最小化安装(Minimal Install)是生产环境的最佳实践

根据需要手动安装特定软件包

网络配置:

静态IP地址

正确的DNS配置

主机名设置

4.3 数据迁移与服务重建

# 1. 挂载旧系统磁盘或从备份恢复数据

mount /dev/old_disk /mnt/old_system

# 2. 恢复配置文件

tar -xzvf /backup/etc_backup_20230101.tar.gz -C / --strip-components=1

# 3. 恢复用户数据

tar -xzvf /backup/home_backup_20230101.tar.gz -C /home

# 4. 恢复数据库

mysql -u root -p < /backup/all_databases_20230101.sql

# 5. 重新安装软件包

# 查看旧系统的包列表

cat /backup/installed_packages_20230101.txt

# 根据需要重新安装

dnf install -y nginx mysql-server php-fpm

# 6. 恢复特定服务配置

cp -r /backup/nginx_backup_20230101/* /etc/nginx/

cp -r /backup/httpd_backup_20230101/* /etc/httpd/

# 7. 修复文件权限

chown -R nginx:nginx /var/www/html

chmod -R 755 /var/www/html

# 8. 启动并测试服务

systemctl enable nginx

systemctl start nginx

systemctl status nginx

第五部分:升级后常见问题与解决方案

5.1 服务无法启动

问题:Nginx或Apache无法启动,提示端口被占用或权限错误。

解决方案:

# 检查端口占用

ss -tulnp | grep :80

# 检查SELinux上下文

ls -Z /etc/nginx/nginx.conf

# 如果需要,修复上下文

restorecon -Rv /etc/nginx

# 检查防火墙

firewall-cmd --list-all

firewall-cmd --add-service=http --permanent

firewall-cmd --reload

5.2 数据库连接失败

问题:应用无法连接到MySQL/MariaDB。

解决方案:

# 检查数据库服务状态

systemctl status mysqld

# 检查日志

journalctl -u mysqld -n 50

# 检查用户权限

mysql -u root -p -e "SELECT user, host FROM mysql.user;"

# 检查密码插件(MySQL 8.0默认使用caching_sha2_password)

# 如果旧应用不支持,可能需要改回mysql_native_password

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';

5.3 网络配置问题

问题:升级后网络不通,IP地址丢失。

解决方案:

# 检查网络接口

nmcli device status

# 检查连接配置

nmcli connection show

# 重新加载网络配置

nmcli connection reload

# 启用连接

nmcli connection up ens192

# 如果使用传统network服务(CentOS 7遗留)

systemctl enable --now NetworkManager

5.4 磁盘空间不足

问题:升级过程中磁盘空间不足。

解决方案:

# 清理旧内核和缓存

dnf clean all

package-cleanup --oldkernels --count=2 # 保留2个最新内核

# 查找大文件

find / -type f -size +500M -exec ls -lh {} \; 2>/dev/null

# 清理日志

journalctl --vacuum-size=500M

第六部分:最佳实践与长期维护

6.1 建立升级测试流程

沙盒测试:在虚拟机中完整模拟升级过程

分阶段部署:先升级非关键系统

回滚计划:准备快速回滚方案

6.2 监控与日志管理

# 配置日志轮转

cat > /etc/logrotate.d/myapp << EOF

/var/log/myapp/*.log {

daily

rotate 7

compress

delaycompress

missingok

notifempty

create 0640 myapp myapp

}

EOF

# 设置系统监控

# 安装Prometheus Node Exporter

dnf install -y node_exporter

systemctl enable --now node_exporter

6.3 安全加固

# 1. 更新所有包

dnf update -y

# 2. 配置防火墙

firewall-cmd --set-default-zone=drop

firewall-cmd --permanent --add-service=ssh

firewall-cmd --permanent --add-service=http

firewall-cmd --permanent --add-service=https

firewall-card --reload

# 3. 禁用root SSH登录

sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# 4. 配置Fail2Ban

dnf install -y fail2ban

systemctl enable --now fail2ban

# 5. 定期安全扫描

dnf install -y lynis

lynis audit system

结论

CentOS系统的升级是一个需要谨慎规划和执行的过程。无论是选择原地升级还是全新安装,关键在于充分的准备、详细的测试和完善的备份策略。Rocky Linux和AlmaLinux作为CentOS的优秀继任者,为企业提供了稳定、可靠的长期支持。

记住,没有完美的升级过程,只有充分的准备才能应对意外。建议在生产环境升级前,至少进行3次完整的测试演练,并确保在升级窗口期有完整的回滚方案。通过遵循本文的指南,您将能够最大限度地降低风险,实现系统的平滑过渡。