说实话,看到“CentOS停服”这几个字的时候,很多运维老哥的第一反应可能不是恐慌,而是长舒一口气——终于不用在那该死的旧系统上修修补补了。但紧接着就是头疼:怎么迁移?会不会炸?数据还在不在?
别慌。AlmaLinux 作为 CentOS 的直接继任者之一(由 CloudLinux 团队支持),它的目标就是提供 1:1 的二进制兼容。这意味着,理论上,你的 CentOS 8 可以直接“变身”为 AlmaLinux 8,而不需要像以前那样重装系统。但这只是“理论上”。在实际操作中,哪怕是一个小配置文件的差异,都可能让你在生产环境里喝一壶。
今天咱们不整那些虚头巴脑的理论,直接上干货。我会带你一步步走过这个升级过程,就像老司机带新手跑山一样,哪里是悬崖,哪里是捷径,我都给你标得清清楚楚。
第一步:心态建设与前期准备
在敲下第一个命令之前,请先做三件事:
- 确认你有快照权限:无论是物理机还是虚拟机,确保你在操作前有一个完整的系统快照。这是你的“后悔药”。
- 确认业务低峰期:选一个深夜,或者周末,确保即使系统重启或出现小问题,也不会影响核心业务。
- 阅读官方文档:是的,我知道你不想看,但
AlmaLinux官方提供的almalinux-deploy脚本文档是你最后的救命稻草。
第二步:系统兼容性深度检查
很多人觉得“CentOS 8 转 AlmaLinux 8 是无缝的”,所以懒得检查。大错特错!你的系统里可能藏着一些“地雷”。
1. 第三方仓库冲突检测
CentOS 8 默认启用了 AppStream 和 BaseOS。但在升级过程中,如果你之前安装了 EPEL、Remi、Docker CE 或其他第三方 YUM/DNF 源,它们可能会与 AlmaLinux 的新包产生版本冲突。
实操检查:
# 列出所有已启用的仓库
dnf repolist all
# 特别关注非官方源
yum list installed | grep -E "(epel|remi|docker|nvidia)"
建议操作:
在升级前,最好暂时禁用这些第三方源,或者确保它们已经提供了对 AlmaLinux 8 的支持。对于 Docker,AlmaLinux 8 推荐使用 podman 作为默认容器引擎,当然你也可以继续装 Docker,但要注意依赖关系。
2. 内核模块兼容性
如果你的服务器运行着自定义编译的内核模块(比如某些特殊的网卡驱动、存储驱动或安全软件模块),这些模块在升级到新内核后可能会失效。
检查方法:
# 查看当前内核版本
uname -r
# 查看已加载的内核模块
lsmod | head -20
# 检查 DKMS 管理的模块
dkms status
避坑指南: 如果有 DKMS 模块,确保它们在升级后能重新编译。通常 AlmaLinux 升级后会更新内核,你需要手动触发 DKMS 重建,或者在升级前卸载这些模块,升级后再安装。
3. 文件系统检查
确保你的根文件系统没有错误。如果文件系统本身有问题,升级过程中的大量 I/O 操作可能会导致数据损坏。
# 检查磁盘健康状态
smartctl -a /dev/sda
# 检查文件系统完整性(建议在单用户模式下进行,如果是在线系统,至少运行 fsck 预检)
xfs_info /
第三步:数据备份——这是底线,没有之一
不要相信“增量升级不会丢数据”。在 Linux 世界里,唯一的安全感来自备份。
1. 全量备份策略
我建议采用“分层备份”策略:
- 系统配置备份:重点备份
/etc/目录。 - 关键数据备份:数据库文件、网站文件、应用日志。
- 软件列表备份:记录当前安装的 RPM 包,以便升级后核对。
实操脚本示例:
创建一个简单的备份脚本 backup_before_upgrade.sh:
#!/bin/bash
BACKUP_DIR="/root/pre_upgrade_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR/etc"
mkdir -p "$BACKUP_DIR/var_lib"
mkdir -p "$BACKUP_DIR/rpm_list"
echo "开始备份 /etc 目录..."
tar -czf "$BACKUP_DIR/etc.tar.gz" /etc --exclude=proc --exclude=sys --exclude=dev
echo "开始备份关键数据目录 (例如 /var/lib/mysql)..."
# 注意:这里需要根据你的实际业务调整路径
if [ -d /var/lib/mysql ]; then
tar -czf "$BACKUP_DIR/var_lib_mysql.tar.gz" /var/lib/mysql
fi
echo "导出已安装的 RPM 包列表..."
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' > "$BACKUP_DIR/rpm_list_installed.txt"
echo "备份完成!文件位于: $BACKUP_DIR"
echo "请将此目录转移到其他存储介质或对象存储中。"
2. 数据库专项备份
如果你的业务依赖 MySQL/MariaDB 或 PostgreSQL,必须在升级前进行逻辑备份。
# MySQL 备份
mysqldump -u root -p --all-databases > /root/all_databases_backup.sql
# PostgreSQL 备份
pg_dumpall -U postgres > /root/pg_all_backup.sql
重要提示: 在升级期间,数据库服务可能会短暂中断。确保你的应用有重连机制,或者在升级前停止应用服务,只升级数据库软件本身。
第四步:执行升级——步步为营
现在,我们进入正题。AlmaLinux 提供了一个名为 almalinux-deploy 的工具,它会自动处理大部分复杂的依赖替换工作。
1. 安装部署工具
首先,确保你的系统是最新的 CentOS 8。
dnf update -y
然后,下载并安装 AlmaLinux 的部署脚本:
# 下载脚本
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
# 赋予执行权限
chmod +x almalinux-deploy.sh
# 运行预检模式(推荐先运行一次预检,不实际执行)
sudo ./almalinux-deploy.sh --check
预检模式的作用: 它会告诉你哪些包会被删除,哪些会被替换,是否存在冲突。仔细检查输出结果!如果有你不认识的包被标记为“删除”,一定要搞清楚原因。
2. 执行实际升级
确认预检无误后,执行正式升级:
sudo ./almalinux-deploy.sh
这个过程可能需要几十分钟到几小时,取决于你的网络速度和系统复杂度。不要中断它! 如果网络断开,脚本通常会支持断点续传,但最好保证网络稳定。
升级过程中你会看到:
- 下载新的 YUM 仓库元数据。
- 替换 CentOS 的 GPG 密钥。
- 替换核心系统包(如 glibc, kernel, systemd 等)。
- 解决依赖关系。
3. 重启系统
升级完成后,脚本通常会提示你重启。
reboot
重启后,使用 cat /etc/os-release 验证是否成功切换到 AlmaLinux:
[root@alma ~]# cat /etc/os-release
NAME="AlmaLinux"
VERSION="8.9 (Purple Manul)"
ID="almalinux"
...
第五步:升级后清理与验证
重启成功只是第一步,真正的挑战在于让系统稳定运行。
1. 清理残留包
CentOS 的一些专属包在 AlmaLinux 中不再存在,可能会被标记为“孤立”或“废弃”。
# 查找孤立包
dnf repoquery --unsatisfied
# 清理未使用的依赖
dnf autoremove
2. 恢复第三方仓库
如果你之前禁用了 EPEL 或其他第三方源,现在可以重新启用并确保它们指向正确的 AlmaLinux 8 版本。
# 安装 EPEL for AlmaLinux 8
dnf install -y epel-release
3. 检查服务状态
逐一检查你的关键服务是否正常运行:
systemctl list-units --type=service --state=failed
如果有服务失败,查看日志:
journalctl -u <service_name> -e
4. 数据库完整性检查
对于数据库,登录进去运行一个简单的查询,确保数据可读可写。
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables;"
psql -U postgres -c "SELECT count(*) FROM pg_tables;"
第六步:常见错误排查及解决方案
即使准备再充分,也可能会遇到意想不到的问题。以下是几个高频“坑”及解法。
问题 1:GPG 密钥冲突
现象:
Public key for xxx.rpm is not installed
或者升级脚本报错说 GPG 密钥不匹配。
原因: CentOS 和 AlmaLinux 使用了不同的 GPG 密钥签名。
解决方案:
almalinux-deploy 脚本通常会自动处理这个问题,但如果手动升级,你需要导入新的密钥:
# 删除旧的 CentOS 密钥
rpm -e gpg-pubkey-*
# 安装 AlmaLinux 密钥
rpm --import https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux
问题 2:Python 依赖破裂
现象:
Error: Transaction test error: file /usr/bin/python3 conflicts between attempted installs of python3-rpm-generators-...
原因:
CentOS 8 的 Python 环境和 AlmaLinux 8 略有不同,特别是 python3-rpm-generators 等包。
解决方案:
在运行 almalinux-deploy.sh 时,确保使用 --force 参数(如果脚本支持),或者在预检阶段仔细查看 Python 相关的包变更。如果手动升级,可能需要先卸载冲突的 Python 包,再重新安装。
# 示例:强制替换冲突包(谨慎使用)
dnf swap centos-linux-release alma-linux-release --allowerasing
问题 3:SELinux 标签丢失
现象:
升级后,某些服务启动失败,日志显示权限拒绝,或者 restorecon 无法修复。
原因: 升级过程中,部分文件可能被重新创建,导致 SELinux 上下文标签丢失或错误。
解决方案: 升级完成后,重新标记整个文件系统:
touch /.autorelabel
reboot
注意: 这会让重启时间变长,因为 SELinux 需要遍历所有文件并重新打标签。请耐心等待。
问题 4:Docker/Podman 镜像拉取失败
现象: 容器启动正常,但拉取新镜像时报错。
原因: 证书或网络配置可能在升级过程中被重置。
解决方案:
检查 /etc/docker/daemon.json 或 Podman 的配置,确认证书路径正确。如果是内网环境,可能需要重新配置镜像加速器。
写给小朋友也能听懂的总结
想象一下,你有一本非常喜欢的故事书(CentOS),但出版社说这本书以后不再印新版了,而且有些章节的内容过时了。现在,有一家新的出版社(AlmaLinux)说:“我们可以给你一本内容几乎一模一样,但更新了最新插图和纠错的新书。”
- 检查书包:看看你的书包里有没有别的出版社的书(第三方软件),确保它们和新书不冲突。
- 抄录重点:把你原来书里做的笔记(配置文件)和数据(数据库)都抄到新笔记本上,以防万一。
- 慢慢换页:不要一下子把整本书撕掉。一页一页地换,每换一页就检查一下故事通不通顺。
- 最后整理:换完后,把书包里的旧书皮扔掉,检查一下新书签是不是贴对了(SELinux),看看笔记有没有漏抄。
这样,你就拥有一本崭新的、安全的、能一直读到未来的故事书了。
结语
从 CentOS 迁移到 AlmaLinux 并不是一场灾难,而是一次必要的进化。只要你做好了备份,仔细检查兼容性,并耐心地跟随官方脚本的步骤,这个过程可以是平滑且安全的。
记住,备份是王道,耐心是金。如果在操作中遇到任何奇怪的错误,不要慌,先查日志,再搜索社区,最后才考虑回滚。祝你升级顺利,系统长治久安!
