从Centos迁移到AlmaLinux后版本更新升级踩坑指南及常见问题解决方案
为什么我们要折腾这件事
2021年底,红帽突然宣布CentOS 8提前停止维护,这个消息直接把国内大量使用CentOS的企业吓出了一身冷汗。想象一下,你服务器上的系统突然变成”弃婴”,安全漏洞没人管,软件包源全失效,那种感觉就像你住了一辈子的房子突然被收回,连门卡都不给你了。
这时候AlmaLinux横空出世,由CentOS创始人Leigh Storti联合CloudLinux团队打造,承诺永久免费、与RHEL 100%二进制兼容。对于咱们这些从CentOS过来的用户来说,简直就是及时雨。
但是!迁移只是第一步,真正让人头疼的是迁移后的版本更新和升级。很多小伙伴照搬CentOS那套命令,结果踩了一堆坑。别急,我来把这些问题一个个给你捋清楚。
迁移后的第一件大事:清理yum源配置
从CentOS迁移过来,最让人头大的是那些遗留的repo配置文件。你想想,CentOS的仓库地址是mirror.centos.org或者vault.centos.org,而AlmaLinux用的是自己的源。如果你不彻底清理,yum会同时尝试访问两套源,直接给你报一堆404错误。
打开你的 /etc/yum.repos.d/ 目录看看,大概率能看到一堆CentOS的repo文件。别慌,咱们逐个处理:
# 先看看当前有哪些repo文件
ls -la /etc/yum.repos.d/
# 备份旧的CentOS repo文件(好习惯,以防万一)
sudo mkdir -p /etc/yum.repos.d/centos-backup
sudo mv /etc/yum.repos.d/CentOS*.repo /etc/yum.repos.d/centos-backup/
# 安装AlmaLinux的repo配置文件
sudo dnf install -y almalinux-release
# 看看新的repo文件
ls -la /etc/yum.repos.d/
这一步完成后,你应该能看到类似almalinux.baseos.repo、almalinux.appstream.repo这样的文件。现在你可以放心地使用dnf了。
dnf vs yum:别再用老习惯了
很多从CentOS过来的朋友,骨子里还记着yum这个命令。说实话,在AlmaLinux里用yum也能跑,但它其实是dnf的软链接。dnf是下一代包管理器,速度快、依赖解析更智能。建议你从现在开始,彻底改口用dnf,不然遇到一些新特性你可能会懵。
# 用dnf替代yum的习惯
sudo dnf update # 更新所有包
sudo dnf install httpd # 安装Apache
sudo dnf remove httpd # 卸载Apache
sudo dnf search nginx # 搜索包
sudo dnf info nginx # 查看包信息
# 清理缓存,养成好习惯
sudo dnf clean all
sudo dnf makecache
有个小技巧:如果你不确定一个命令会不会出问题,可以先加--assumeno参数,它会显示要做哪些操作但不会真的执行。这就像考试前先打草稿一样,心里有底。
内核升级的坑:GRUB配置要记得更新
这个坑特别隐蔽,很多服务器迁移后直接dnf update,然后重启,结果发现内核根本没换。为啥?因为GRUB的默认启动项可能还指向旧内核。
# 查看当前所有已安装的内核
rpm -q kernel
# 或者用更详细的方式
dnf list installed kernel
# 查看GRUB配置,确认默认启动的内核
grep '^default=' /etc/default/grub
# 默认值是0的话,表示启动第一个菜单项
# 更新GRUB配置(注意AlmaLinux是UEFI/BIOS双支持)
# 如果是UEFI启动:
sudo grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg
# 如果是传统BIOS启动:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# 执行升级,指定保留旧内核(推荐保留1-2个旧版本,方便回滚)
sudo dnf update kernel --installonly_limit=3
# 重启后确认内核版本
uname -r
这里有个很多人不知道的技巧:--installonly_limit=3这个参数非常重要。它确保系统里始终保留最近3个内核版本。万一升级后的内核有bug或者不兼容,你还能从GRUB菜单里选旧内核启动。相信我,这个习惯能救你的命。
EPEL源的问题:迁移后经常失效
EPEL(Extra Packages for Enterprise Linux)是CentOS/AlmaLinux用户常用的第三方仓库。但问题来了:CentOS迁移到AlmaLinux后,EPEL的repo文件可能还指向CentOS的版本号。
# 查看EPEL是否配置正确
cat /etc/yum.repos.d/epel.repo
# 你会看到类似这样的内容,版本号写的是centos
baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
# AlmaLinux的$releasever应该是8或者9,但EPEL可能不认识
# 解决方法:重新安装EPEL
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 如果是AlmaLinux 9:
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
# 清理并重建缓存
sudo dnf clean all
sudo dnf makecache
验证EPEL是否正常工作:
# 搜索一个EPEL里的包,比如htop
sudo dnf search htop --disablerepo='*' --enablerepo=epel
# 或者直接安装试试
sudo dnf install -y htop
SELinux的适配问题
SELinux(Security-Enhanced Linux)是红帽系发行版的特色安全模块。CentOS迁移到AlmaLinux后,如果你的系统上之前有自定义的SELinux策略或者标签,可能会出问题。
# 查看SELinux当前状态
sestatus
# 如果显示Disabled,说明之前被关闭了,迁移后继续保持这个状态即可
# 如果显示Enforcing,建议你先用Permissive模式过渡
sudo setenforce 0
# 查看SELinux日志,看看有哪些拒绝记录
sudo ausearch -m avc -ts recent
# 如果某些服务因为SELinux启动不了,比如Nginx
sudo dnf install -y policycoreutils-python-utils
sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_can_network_relay 1
# 最后记得把模式改回Enforcing(生产环境建议开启)
sudo setenforce 1
说实话,SELinux这个东西就像家里的防盗门,配置好了确实更安全,但一开始确实挺烦人的。如果你是新手,建议在测试环境里先熟悉一下,别在生产环境直接瞎折腾。
系统升级到大版本:从8到9的艰难跨越
这是最让人头疼的部分。从CentOS 7升级到CentOS 8本身就很麻烦,从CentOS 8迁移到AlmaLinux 9更是大工程。因为AlmaLinux 9基于RHEL 9,内核从5.x跳到了5.14+,很多软件版本都有变化。
重要提醒:大版本升级务必先在测试环境完整演练一遍!
# 第一步:完整备份系统
sudo dnf install -y rsync
sudo rsync -avh --progress / /path/to/backup/almalinux8/
# 第二步:检查当前系统状态
dnf system-upgrade check
# 这个命令会告诉你有哪些包会有冲突
# 第三步:如果确认可以升级
sudo dnf install -y dnf-plugin-system-upgrade
sudo dnf system-upgrade download --releasever=9
sudo dnf system-upgrade reboot
# 第四步:升级过程中保持网络稳定,不要断电!
# 升级完成后,检查新系统状态
rpm -q almalinux-release
uname -r
升级过程中常见的问题和解决方案:
问题1:某些第三方包导致升级失败
# 升级前排除第三方包
sudo dnf downgrade --setopt=exclude=*3rdparty* kernel
# 或者手动移除有问题的包
sudo dnf remove problematic-package
问题2:Python版本冲突
AlmaLinux 9默认使用Python 3.9,而CentOS 8是Python 3.6。如果你的应用强依赖Python 3.6,会有兼容问题。
# 查看当前Python版本
python3 --version
# 如果需要多个Python版本共存,可以使用模块系统
sudo dnf module list python39
sudo dnf module enable python39
sudo dnf module install python39
问题3:服务启动失败
升级后某些服务可能因为配置变更或依赖变化而无法启动。
# 检查所有服务的状态
systemctl list-units --type=service --failed
# 查看具体服务的日志
journalctl -u nginx --since "1 hour ago"
# 重新生成服务配置(如果是Nginx)
sudo nginx -t
sudo systemctl restart nginx
数据库迁移的坑
如果你用的是MySQL或者MariaDB,从CentOS迁移过来后,数据库文件路径和配置可能会有变化。
# 检查数据库服务状态
sudo systemctl status mariadb
# 查看数据目录
sudo mysql -e "SHOW VARIABLES LIKE 'datadir';"
# 如果发现数据库启动失败,检查日志
sudo journalctl -u mariadb -n 50 --no-pager
# 常见修复:初始化数据库(如果是全新安装)
sudo mariadb-install-db --user=mysql --datadir=/var/lib/mysql
# 如果是升级,可能需要运行升级脚本
sudo mysql_upgrade -u root -p
PostgreSQL用户也要注意,大版本升级需要使用pg_upgrade工具,不能直接替换数据目录。
第三方软件仓库的处理
很多CentOS用户会添加一些第三方仓库,比如Docker官方源、Nginx官方源、NodeSource等。迁移后这些仓库可能还在,但需要确认它们是否支持AlmaLinux。
# 查看所有已启用的仓库
sudo dnf repolist
# 检查Docker仓库是否可用
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 注意:Docker的repo文件写的是centos,需要手动修改为almalinux
sudo sed -i 's|centos|almalinux|g' /etc/yum.repos.d/docker-ce.repo
# 检查NodeSource仓库
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
# NodeSource的脚本会自动适配AlmaLinux,一般不需要手动改
# 检查EPEL-plus等扩展源
sudo dnf install -y epel-release epel-next-release
这里有个小窍门:如果你不确定某个仓库是否支持AlmaLinux,可以先禁用它,测试安装一个包看看能不能成功。
定时任务和crontab的注意事项
CentOS的crontab配置迁移过来后通常没问题,但有些系统级的定时任务可能会因为路径变化而失效。
# 查看当前用户的crontab
crontab -l
# 查看系统crontab
sudo cat /etc/crontab
# 检查anacron(适用于桌面环境)
sudo systemctl status anacron
# 如果有systemd timer,也检查一下
sudo systemctl list-timers --all
我见过一个案例,某公司的备份脚本放在/etc/cron.daily/里,迁移后权限被改变,导致cron无法执行。修复方法很简单:
# 确保脚本可执行
sudo chmod +x /etc/cron.daily/your-script.sh
# 手动测试脚本是否正常
sudo /etc/cron.daily/your-script.sh
网络配置的变化
AlmaLinux 9使用NetworkManager作为默认网络管理工具,和CentOS 8一样。但如果你之前用的是传统的network-scripts,可能会遇到问题。
# 检查网络管理工具
nmcli general status
# 查看网络接口
nmcli device status
# 如果需要使用传统的ifcfg文件(不推荐,但有些老脚本依赖)
sudo dnf install -y network-scripts
# 注意:AlmaLinux 9中network-scripts可能不在默认仓库
# 推荐使用nmcli配置网络
sudo nmcli connection show
sudo nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24
sudo nmcli connection up eth0
软件包兼容性检查清单
迁移完成后,建议运行以下检查,确保你的应用环境正常:
# 1. 检查所有已安装包的完整性
sudo dnf verify
# 2. 检查是否有残留的CentOS包
rpm -qa | grep centos
# 3. 检查系统包与AlmaLinux的兼容性
sudo dnf distro-sync
# 4. 检查依赖关系
sudo dnf check
# 5. 查看需要重启的服务
sudo systemctl list-units --type=service --failed
实战案例:一个典型的迁移翻车现场
我见过一个真实的案例,某电商公司的运维同学从CentOS 7迁移到AlmaLinux,只做了基本的包安装,没有检查SELinux和依赖关系。上线后第三天,网站突然打不开,Nginx和PHP-FPM都启动失败。
日志里满是”Permission denied”的错误。排查后发现,原来PHP-FPM的socket文件权限被SELinux拦截了。解决方案:
# 查看SELinux拒绝日志
sudo ausearch -m avc -ts recent | grep nginx
# 找到问题后,设置正确的SELinux上下文
sudo restorecon -RV /var/run/php-fpm/
sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P php_fpm_connect_db 1
# 重启服务
sudo systemctl restart php-fpm nginx
这个案例告诉我们:迁移不只是装包那么简单,安全策略、文件权限、服务配置都要一一检查。
日常维护的变更建议
迁移到AlmaLinux后,你的日常维护习惯也应该跟着调整:
# 1. 用dnf替代yum
alias yum='dnf' # 可以在~/.bashrc里加这个别名过渡
# 2. 更新包时使用--refresh参数刷新元数据
sudo dnf update --refresh
# 3. 定期清理不需要的包
sudo dnf autoremove
# 4. 查看包变更历史,方便回滚
sudo dnf history list
sudo dnf history info <transaction-id>
sudo dnf history undo <transaction-id>
# 5. 监控系统日志
sudo journalctl -f
最后的一些心里话
从CentOS迁移到AlmaLinux,说难也难,说简单也简单。难的点在于你要改变很多习惯,要接受新的工具和工作方式;简单的点在于,AlmaLinux本来就是为承接CentOS用户而生的,设计理念和使用体验非常相似。
我建议你花一个周末,把生产环境完整地迁移一遍,过程中遇到任何问题都记录下来。这些记录会在未来帮你大忙。毕竟,吃过亏的人,才知道哪里容易踩坑。
记住,备份、备份、还是备份。在折腾系统之前,确保你有完整的备份和可行的回滚方案。服务器不是玩具,但学习的过程总是充满乐趣的,对吧?
