在 CentOS 8 上进行“升级”需特别注意:CentOS 8 已于 2021年12月31日终止支持(EOL),且官方不提供直接升级到 CentOS Stream 或 RHEL 的原地升级路径。因此,严格来说:
❌ 不存在官方支持的“升级 CentOS 8 到更新版本(如 CentOS 9/10)”的操作
✅ 正确做法是:迁移(Migration)或重建(Rebuild)系统,而非就地升级。
为避免重要文件丢失,以下是安全、可靠、经过验证的实践指南:
✅ 一、明确目标与替代方案(关键前提)
| 目标 | 推荐方案 | 说明 |
|---|---|---|
| 继续使用稳定、受支持的 RHEL 兼容发行版 | ➤ 迁移到 CentOS Stream 8/9(当前主流选择) | CentOS Stream 是 RHEL 的上游开发分支,免费、持续更新;Stream 8 仍受支持至 2024-05-31,Stream 9 支持至 2027。 |
| 追求企业级长期支持与商业保障 | ➤ 迁移到 AlmaLinux 8/9 或 Rocky Linux 8/9 | 100% 二进制兼容 RHEL/CentOS,免费开源,长期支持(至 2029+)。 |
| 彻底现代化基础设施 | ➤ 重装为 Rocky Linux 9 / AlmaLinux 9 / CentOS Stream 9 | 更现代内核、工具链(systemd 250+, GCC 11+, Python 3.9+),推荐新部署。 |
⚠️ 注意:
dnf upgrade --refresh或yum update只能更新到 同一主版本内的最新补丁(如 CentOS 8.5 → 8.6),无法跨大版本升级(8→9)。- 尝试强制升级(如
dnf distro-sync+ 手动更换 repo)极大概率导致系统崩溃、服务不可用、SELinux 故障、内核 panic —— 官方明确禁止。
✅ 二、迁移前必备:零丢失风险的备份与验证
1. 完整系统快照(虚拟机/云环境)
# VMware/VirtualBox:创建快照
# AWS EC2:创建 AMI 镜像
# LVM 系统:创建逻辑卷快照(需预留空间)
sudo lvcreate -L 5G -s -n centos8_snap /dev/vg00/centos8_root
2. 关键数据与配置导出(物理机/容器化环境)
# ✅ 必备清单(建议脚本化执行):
sudo tar -czf /backup/centos8-config-$(date +%F).tar.gz
/etc/{hostname,hosts,ssh,nginx,httpd,mysql,postgresql,firewalld,selinux}
/var/www/html /var/lib/mysql /var/lib/postgresql /var/log/journal
/opt /home /root/.bash_history
# ✅ 用户与权限备份
getent passwd > /backup/passwd-$(date +%F).txt
getent group > /backup/group-$(date +%F).txt
ls -laR /home/ > /backup/home-perms-$(date +%F).txt
# ✅ 服务状态与启用项
systemctl list-unit-files --state=enabled > /backup/enabled-services-$(date +%F).txt
rpm -qa --last | head -100 > /backup/recent-packages-$(date +%F).txt
3. 应用层验证
- ✅ 记录数据库版本、字符集、用户权限(
mysqldump --no-data --all-databases > schema.sql) - ✅ 导出 Web 应用配置(Nginx/Apache 虚拟主机、SSL 证书路径、PHP-FPM 设置)
- ✅ 备份自定义 systemd 服务文件(
/etc/systemd/system/*.service)
✅ 三、安全迁移操作流程(以迁移到 Rocky Linux 9 为例)
🔹 步骤 1:准备新环境(推荐方式)
# 在新服务器/新 VM 上安装 Rocky Linux 9(干净安装)
# 使用 kickstart 或自动化工具(Ansible/Packer)确保配置一致
🔹 步骤 2:迁移数据(非覆盖式)
# 在新系统上:
sudo mkdir -p /mnt/old-centos8
# 挂载旧系统磁盘或通过 rsync 同步(保留原结构):
rsync -avh --delete --exclude='/proc' --exclude='/sys' --exclude='/dev'
--exclude='/tmp' --exclude='/run' --exclude='/boot'
user@old-centos8:/ /mnt/old-centos8/
# 仅恢复业务数据(非系统文件):
sudo cp -r /mnt/old-centos8/var/www/html/* /var/www/html/
sudo cp -r /mnt/old-centos8/var/lib/mysql/* /var/lib/mysql/
sudo chown -R mysql:mysql /var/lib/mysql
🔹 步骤 3:适配性调整(关键!)
| 项目 | CentOS 8 | Rocky Linux 9 / CentOS Stream 9 | 操作 |
|---|---|---|---|
| Python | /usr/bin/python3 → Python 3.6 |
Python 3.9 | 检查脚本 #!/usr/bin/env python3,测试兼容性 |
| Firewalld zone | 默认 public |
同样 public,但规则语法兼容 |
firewall-cmd --reload 后验证端口 |
| SELinux policy | targeted |
同样 targeted,但策略更新 |
restorecon -Rv /var/www/html;检查 ausearch -m avc -ts recent |
| NetworkManager | 默认启用 | 同样启用 | nmcli dev status 验证连接 |
| 内核模块 | 如 kvm-intel |
自动加载 | lsmod | grep kvm |
💡 提示:使用
dnf distro-sync在新系统上同步软件包版本,并用rpm -Va校验关键包完整性。
✅ 四、绝对禁止的操作(高危!)
| ❌ 行为 | 风险 |
|---|---|
dnf --releasever=9 distro-sync |
破坏依赖树,导致 glibc, systemd, kernel 冲突,系统无法启动 |
替换 /etc/yum.repos.d/ 为 9.x repo 后 dnf update |
YUM/DNF 无法解析混合仓库元数据,报错中断 |
直接 rpm -Uvh 升级核心 RPM 包(如 kernel, glibc) |
极可能锁死系统,需救援模式修复 |
✅ 五、终极建议:采用不可变基础设施思维
- ✅ 将配置代码化(Ansible/Terraform + Git)
- ✅ 使用容器化(Podman/Docker)隔离应用,系统仅负责运行时
- ✅ 通过 CI/CD 流水线自动构建新镜像并灰度发布
→ 这样“升级” = 部署新镜像,“回滚” = 切回旧镜像,从根本上规避文件丢失风险
📌 总结:防丢失黄金法则
- 不升级,只迁移 —— 新系统 + 迁移数据是最安全路径
- 备份三要素:完整(系统+数据)、可验证(解压测试)、离线存储(异地/对象存储)
- 先测试,后上线 —— 在预发环境完整走通迁移流程(含性能压测)
- 文档化每一步 —— 记录所有命令、配置变更、验证结果
如需,我可为你提供:
🔹 Rocky Linux 9 迁移检查清单(PDF/Markdown)
🔹 自动化备份脚本(带校验与通知)
🔹 Ansible Playbook 示例(从 CentOS 8 迁移 Web/DB 服务)
欢迎随时告知你的具体场景(如:物理服务器?云平台?是否运行 MySQL/Nginx?),我可定制详细步骤 👇
PHPWP博客