升级CentOS 8时如何避免重要文件丢失?

在 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/9Rocky Linux 8/9 100% 二进制兼容 RHEL/CentOS,免费开源,长期支持(至 2029+)。
彻底现代化基础设施 ➤ 重装为 Rocky Linux 9 / AlmaLinux 9 / CentOS Stream 9 更现代内核、工具链(systemd 250+, GCC 11+, Python 3.9+),推荐新部署。

⚠️ 注意:

  • dnf upgrade --refreshyum 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 流水线自动构建新镜像并灰度发布
    → 这样“升级” = 部署新镜像,“回滚” = 切回旧镜像,从根本上规避文件丢失风险

📌 总结:防丢失黄金法则

  1. 不升级,只迁移 —— 新系统 + 迁移数据是最安全路径
  2. 备份三要素:完整(系统+数据)、可验证(解压测试)、离线存储(异地/对象存储)
  3. 先测试,后上线 —— 在预发环境完整走通迁移流程(含性能压测)
  4. 文档化每一步 —— 记录所有命令、配置变更、验证结果

如需,我可为你提供:
🔹 Rocky Linux 9 迁移检查清单(PDF/Markdown)
🔹 自动化备份脚本(带校验与通知)
🔹 Ansible Playbook 示例(从 CentOS 8 迁移 Web/DB 服务)

欢迎随时告知你的具体场景(如:物理服务器?云平台?是否运行 MySQL/Nginx?),我可定制详细步骤 👇