从CentOS迁移到AlmaLinux踩坑实录阿里云腾讯云部署全流程及常见问题排查解决指南
前两天接到一个紧急任务,说CentOS 7已经停服了,客户那边的服务器都得迁走。说实话,当时心里是一紧的——这活儿看着简单,真干起来坑多得能让你怀疑人生。折腾了将近两周,从阿里云到腾讯云,迁了十几台机器,踩过的坑能写本书。今天把这些血泪教训整理出来,希望能帮到正在或者即将走这条路的朋友。
为什么非得迁
先说清楚为啥要干这事。CentOS 7在2024年6月30日正式EOL(End of Life),这意味着不再有任何安全更新和bug修复。如果你的服务器还跑着CentOS 7,等于裸奔在互联网上,特别是暴露在公网的业务,风险真的很大。
市面上替代方案不少,Rocky Linux、AlmaLinux、Ubuntu、Debian都有人用。我最终选AlmaLinux,主要是因为它是红帽系血统,跟CentOS的yum/dnf命令、rpm包管理几乎一模一样,迁移成本最低。而且背后有CloudLinux公司撑腰,社区活跃,不是那种今天成立明天就黄的项目。
迁移前的准备工作
数据备份是底线
不管多熟悉这活儿,我每次都先把关键数据备份到本地或者OSS。我见过有人没备份就直接升级,结果grub配置搞坏了,系统起不来,数据全丢,那滋味不好受。
阿里云用户可以趁早用快照功能,腾讯云有云硬盘快照,几分钟就能搞定。另外,配置文件最好也单独存一份,像nginx.conf、mysqld.cnf这些,迁移后经常需要微调。
软件清单梳理
迁之前,把当前系统装的软件列个清单:
# CentOS 7 查看已安装rpm包
rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})\n' | sort > /tmp/centos_packages.txt
# 查看正在运行的服务
systemctl list-units --type=service --state=running > /tmp/running_services.txt
# 查看监听端口
ss -tlnp > /tmp/listening_ports.txt
# 查看crontab
crontab -l > /tmp/crontabs.txt 2>/dev/null || echo "No crontab" > /tmp/crontabs.txt
# 查看挂载的磁盘
mount > /tmp/mounts.txt
这些文件在新系统上能帮你快速还原环境,不用临时抓瞎。
应用兼容性检查
这一步很多人会忽略,但特别重要。有些老旧软件包在AlmaLinux上可能找不到,或者版本差异太大导致兼容性问题。比如某些商业软件只认CentOS,或者源码编译的软件依赖了特定版本的glibc。
# 检查自编译安装的软件
find /usr/local -type f -executable 2>/dev/null | head -50
# 检查第三方yum源
yum repolist all
如果发现依赖的包在新系统上不存在,提前想好替代方案,别等到迁移完了才抓狂。
阿里云迁移实战
方式一:直接升级(不推荐但可行)
官方有个迁移工具,理论上可以直接在现有CentOS 7上升级到AlmaLinux 9:
# 下载迁移脚本
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
# 执行迁移(会重启系统!)
bash almalinux-deploy.sh --skip-fstrim --skip-backup
这个命令会先把grub配置改成AlmaLinux的,然后重启进入新系统。听着挺方便,但我实际用下来问题不少——部分第三方源会报错,一些自定义的开机启动脚本会失效。除非是测试环境,生产环境我更喜欢下面的干净安装方式。
方式二:新机器迁移(推荐)
这才是正道。在阿里云控制台新建一台AlmaLinux 9的ECS实例,然后把数据和服务迁过去。
第一步:购买并配置新实例
选择AlmaLinux 9镜像,配置跟原机器一致或更高。安全组记得开好所需端口。
第二步:迁移数据
如果是数据库,先在主库上锁表导出:
# MySQL全量备份
mysqldump -u root -p --all-databases --single-transaction --routines --triggers > /tmp/full_backup.sql
# 压缩备份文件
gzip /tmp/full_backup.sql
用rsync同步文件数据:
# 从原机器推数据到新机器
rsync -avz --progress \
--exclude='/proc' \
--exclude='/sys' \
--exclude='/dev' \
/var/www/ root@新服务器IP:/var/www/
# 同步配置文件
rsync -avz /etc/nginx/ root@新服务器IP:/etc/nginx/
第三步:在新机器上恢复服务
# 恢复MySQL
gunzip < /tmp/full_backup.sql.gz | mysql -u root -p
# 调整MySQL配置适配新系统
vim /etc/my.cnf.d/server.cnf
# 可能需要调整innodb_buffer_pool_size等参数
# 启动服务
systemctl start mysql
systemctl enable mysql
# 启动nginx
systemctl start nginx
systemctl enable nginx
阿里云常见坑
坑1:防火墙规则丢失
CentOS 7默认用firewalld,但升级到AlmaLinux后,某些firewalld的rich规则可能不兼容。迁完后第一件事:
# 检查防火墙状态
firewall-cmd --state
# 列出所有开放端口
firewall-cmd --list-ports
# 如果没有开放端口,手动添加
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
如果业务需要,建议直接换nftables或者干脆用云安全组管网络,别在系统防火墙上下功夫。
坑2:SELinux策略变化
AlmaLinux 9默认SELinux是enforcing模式,策略比CentOS 7严了很多。如果之前关掉了SELinux,迁过去后最好也保持关闭,或者认真调策略:
# 查看SELinux状态
getenforce
sestatus
# 临时关闭
setenforce 0
# 永久关闭(修改配置文件)
vim /etc/selinux/config
# 把SELINUX=enforcing改成SELINUX=disabled
坑3:云插件版本问题
阿里云的cloud-init和alinux-agent在新系统上可能需要重新安装:
# 检查cloud-init
systemctl status cloud-init
# 如果出现问题,重装
yum install -y cloud-init
systemctl enable cloud-init
腾讯云迁移实战
腾讯云的操作逻辑跟阿里云差不多,但有一些腾讯特有的坑。
CVM实例创建
在腾讯云控制台选AlmaLinux 9镜像,建议选择”公共镜像”里的官方版本,不要选第三方修改版。配置好安全组,把业务端口全部放开。
数据迁移
腾讯云支持挂载数据盘,如果你原来的数据在独立数据盘上,可以直接挂载到新CVM,这样最快:
# 查看磁盘
lsblk
# 挂载数据盘
mount /dev/vdb1 /mnt/data
# 检查数据完整性
md5sum /mnt/data/关键文件
如果不支持挂盘,就用rsync或者scp传。腾讯云内网传输免费,别走公网。
腾讯云的坑
坑1:云监控agent不兼容
腾讯云默认的云监控插件是为CentOS设计的,AlmaLinux上可能装不上:
# 检查现有agent
ps aux | grep monitor
# 卸载旧版
rpm -e qcloud-monitor
# 重新下载安装最新版
curl -s https://mirrors.cloud.tencent.com/monitoring/install.sh | bash
坑2:内网DNS解析异常
迁完后发现内网域名解析不到了,比如metadata服务169.254.169.254访问不了。这是因为AlmaLinux 9的resolv.conf配置方式跟CentOS 7不同:
# 检查DNS配置
cat /etc/resolv.conf
# 如果是netplan管理的,检查netplan配置
ls /etc/netplan/
cat /etc/netplan/*.yaml
# 手动补充DNS
echo "nameserver 183.60.83.19" >> /etc/resolv.conf
echo "nameserver 183.60.82.98" >> /etc/resolv.conf
坑3:GPU驱动问题
如果迁的是GPU实例,NVIDIA驱动必须重新装,不能直接复制。先卸掉旧的:
# 卸载旧驱动
nvidia-uninstall
# 下载新版驱动(匹配AlmaLinux 9的内核)
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.154.05/NVIDIA-Linux-x86_64-535.154.05.run
# 安装(需要先禁用nouveau)
vim /etc/modprobe.d/blacklist-nouveau.conf
# 添加:blacklist nouveau
# 保存后执行:
dracut --force
reboot
# 重启后安装
chmod +x NVIDIA-Linux-x86_64-535.154.05.run
./NVIDIA-Linux-x86_64-535.154.05.run
常见问题排查汇总
问题1:yum/dnf报错”Failed to download metadata”
这是最常见的问题,通常是镜像源的问题。AlmaLinux官方源在国内访问慢,建议换国内镜像:
# 备份原配置
cp /etc/yum.repos.d/AlmaLinux.repo /etc/yum.repos.d/AlmaLinux.repo.bak
# 换阿里云镜像
sed -i 's|mirrors.almalinux.org/mirror|mirrors.aliyun.com|g' /etc/yum.repos.d/AlmaLinux.repo
sed -i 's|mirror.almalinux.org|mirrors.aliyun.com|g' /etc/yum.repos.d/AlmaLinux.repo
# 换腾讯云镜像
sed -i 's|mirrors.almalinux.org/mirror|mirrors.tencent.com|g' /etc/yum.repos.d/AlmaLinux.repo
sed -i 's|mirror.almalinux.org|mirrors.tencent.com|g' /etc/yum.repos.d/AlmaLinux.repo
# 重建缓存
dnf clean all
dnf makecache
问题2:系统启动后网络不通
AlmaLinux 9默认使用NetworkManager管理网络,配置方式和CentOS 7的ifcfg文件不同。如果是云主机,通常用cloud-init自动配置,但偶尔会出问题:
# 检查网络服务状态
systemctl status NetworkManager
nmcli device status
# 查看网卡配置
nmcli connection show
# 如果是云主机,检查cloud-init是否执行成功
cloud-init status --long
# 手动配置网络(以eth0为例)
nmcli connection add type ethernet con-name eth0 ifname eth0
nmcli connection modify eth0 ipv4.addresses 10.0.0.100/24
nmcli connection modify eth0 ipv4.gateway 10.0.0.1
nmcli connection modify eth0 ipv4.dns "223.5.5.5,8.8.8.8"
nmcli connection modify eth0 ipv4.method manual
nmcli connection up eth0
问题3:Docker容器启动失败
如果原来用的是CentOS 7的Docker,迁到AlmaLinux 9后容器可能起不来,尤其是用了旧版镜像的:
# 检查Docker状态
systemctl status docker
docker info
# 查看容器日志找原因
docker logs 容器ID
# 重新拉取并启动(推荐做法)
docker stop 旧容器名
docker rm 旧容器名
docker pull 镜像名:最新标签
docker run -d --name 新容器名 -p 端口:端口 镜像名
问题4:PHP版本差异导致网站报错
CentOS 7默认PHP是5.4,AlmaLinux 9默认是8.0或8.2。如果你的网站代码没适配新PHP,会报一堆警告和错误:
# 查看当前PHP版本
php -v
# 如果网站需要老版本PHP,用Remi源安装
dnf install epel-release
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf install --enablerepo=remi-php74 php php-fpm php-mysqlnd php-gD php-mbstring php-xml php-json php-opcache
# 调整PHP-FPM配置
vim /etc/php-fpm.d/www.conf
# 把user和group改成nginx
user = nginx
group = nginx
systemctl restart php-fpm
systemctl enable php-fpm
问题5:定时任务不执行
CentOS 7的crontab配置迁过去后,路径和权限可能有问题:
# 检查crond服务
systemctl status crond
# 查看crontab
crontab -l
# 检查系统级cron任务
ls -la /etc/cron.d/
cat /etc/crontab
# AlmaLinux 9中某些系统任务可能路径变了,检查日志
grep CRON /var/log/cron
问题6:MySQL/MariaDB字符集问题
有些老旧应用依赖的latin1字符集在新系统上表现不一致:
# 检查当前字符集设置
mysql -e "SHOW VARIABLES LIKE 'character_set%';"
mysql -e "SHOW VARIABLES LIKE 'collation%';"
# 如果发现问题,修改配置
vim /etc/my.cnf.d/server.cnf
# 在[mysqld]段添加
# character-set-server = utf8mb4
# collation-server = utf8mb4_general_ci
# 重启MySQL
systemctl restart mysql
# 注意:字符集变更有风险,先备份数据库!
迁移后的验证清单
别以为服务能起来就完事了,以下这些验证项一项都不能少:
# 1. 系统版本确认
cat /etc/alma-release
# 2. 内核版本
uname -r
# 3. 所有关键服务状态
systemctl status nginx mysql php-fpm redis
# 4. 磁盘空间
df -h
# 5. 内存使用
free -h
# 6. 关键端口监听
ss -tlnp | grep -E '(80|443|3306|6379|8080)'
# 7. 安全更新
dnf check-update
# 8. 日志有无异常
tail -100 /var/log/messages
tail -100 /var/log/nginx/error.log
tail -100 /var/log/mysql/error.log
# 9. 业务功能冒烟测试
curl -I https://你的域名
curl -I http://你的域名
# 10. 备份任务是否正常
ls -la /tmp/ | grep backup
给小朋友也能听懂的总结
好,我知道上面一堆命令看着头疼。我用个例子给你讲清楚整个事儿:
想象你住在一个老旧的房子里(CentOS),房子是房东(红帽公司)建的,但房东说房子老了要拆掉,不给你修了。你不想搬家,但不得不搬。AlmaLinux就是房东给你安排的新房子,装修风格跟你原来的差不多,水电开关位置也类似,所以搬家比较轻松。
但你得知道,新房子有一些不同的地方——比如门锁换了一种(防火墙规则变了),水管接口尺寸不一样了(软件版本变了),你得提前做好准备,把贵重物品(数据)先搬到新房子,再慢慢把家具(服务)一样样搬过去。搬完之后,得挨个检查灯亮不亮、水龙头出不出水,别等住了进去才发现马桶不冲水,那就尴尬了。
阿里云和腾讯云就像两个不同的搬家服务公司,流程差不多,但各自有一些小麻烦需要注意。我上面写的坑,基本上就是他们两家在”装修验收”时容易发现的不合格项。
最后几句心里话
迁移这事吧,说难也不难,说简单也确实会翻车。核心就三条:备份、测试、别慌。备份做好了,天塌下来也能恢复;测试在迁移前就做完,知道什么会出问题;真遇到问题别慌,日志是最好的朋友,journalctl和tail能帮你解决80%的问题。
还有,别怕花时间。迁移完别急着切流量,先跑个一两周,观察观察稳定性,确认真的没问题了再彻底关停旧机器。急匆匆的迁移,最后往往会花更多时间返工。
希望这份指南能帮你少走点弯路。迁移路上遇到问题,多查日志、多搜索,大多数问题别人都遇到过,解决方案就在网上。祝你迁移顺利!
