将阿里云 ECS 从 CentOS 迁移到 Ubuntu,强烈不建议直接“重装系统”或手动复制文件(除非是全新实例),因为两者在包管理器、目录结构、服务管理方式、网络配置逻辑等方面存在显著差异。以下是关键注意事项和推荐方案:
✅ 推荐方案:创建新 Ubuntu 实例 + 数据/应用迁移
这是最安全、可控的方式,避免兼容性问题导致生产中断。
1. 规划与准备阶段
-
备份源系统
- 使用阿里云快照功能对原 CentOS ECS 创建完整快照(含系统盘+数据盘)。
- 额外备份关键配置文件(如
/etc/nginx/,/etc/mysql/,crontab)、数据库导出(mysqldump/pg_dump)。
-
评估依赖差异 项目 CentOS (RPM) Ubuntu (DEB) 注意 包管理器 yum/dnfapt/snap命令、仓库名称、软件包名可能不同(如 httpd→apache2)服务管理 systemctl(兼容但默认用 SysV)systemctl(统一 systemd)检查 .service文件路径和依赖网络配置 /etc/sysconfig/network-scripts/ifcfg-*/etc/netplan/*.yaml或/etc/network/interfaces阿里云云助手通常自动处理,但自定义脚本需重写 用户权限 sudo配置类似,但组名可能不同同左 确认 sudoers和用户归属默认 Shell /bin/bash同上 无大碍 Python 版本 通常较旧(如 3.6) 新版(如 3.10+) 虚拟环境需重新创建 -
选择 Ubuntu LTS 版本
推荐Ubuntu 22.04 LTS或24.04 LTS(长期支持,安全性高),避免短期版本。
🔧 迁移执行步骤
2. 创建新 Ubuntu ECS 实例
- 在阿里云控制台创建新实例:
- 镜像:选择官方 Ubuntu 22.04/24.04 LTS
- 实例规格:建议 ≥ 原 CentOS 实例(考虑性能波动)
- 安全组:先开放 SSH(22),再按需开放业务端口(80/443/3306 等)
- 挂载数据盘:若原实例有独立数据盘,可在新实例上挂载并恢复数据
3. 数据与应用迁移
- 静态文件 & 代码
# 示例:rsync 同步(跳过临时文件、日志) rsync -avz --exclude='tmp' --exclude='logs' root@centos-ip:/var/www/html/ ubuntu-user@ubuntu-ip:/var/www/html/ - 数据库迁移
- MySQL/MariaDB:
mysqldump→mysql导入mysqldump -u root -p db_name > backup.sql scp backup.sql ubuntu@new-ubuntu-ip:/tmp/ mysql -u root -p new_db < /tmp/backup.sql - PostgreSQL:
pg_dumpall/pg_dump同理
- MySQL/MariaDB:
- 配置文件迁移
- 手动比对修改:
nginx.conf、php-fpm.conf、my.cnf等
⚠️ 注意:CentOS 的/etc/httpd/conf.d/→ Ubuntu 的/etc/apache2/sites-enabled/;Nginx 配置基本一致但路径可能微调。
- 手动比对修改:
4. 环境重建
- 安装基础工具:
sudo apt update && sudo apt upgrade -y sudo apt install curl wget git vim htop net-tools -y - 安装运行时环境(以 Python + Nginx + PHP-FPM 为例):
sudo apt install nginx php-fpm php-mysql python3-pip python3-venv -y - 部署应用:
- 重新创建虚拟环境:
python3 -m venv venv - 安装依赖:
pip install -r requirements.txt - 启动服务:
systemctl enable nginx php8.x-fpm
- 重新创建虚拟环境:
5. 验证与切换
- 内部测试:通过内网 IP 访问新实例,确认所有功能正常
- DNS 切换:
- 修改域名解析记录(TTL 提前调低至 60s)
- 或使用阿里云 SLB/CLB 做流量切换(更平滑)
- 监控观察:密切跟踪错误日志(
/var/log/nginx/error.log,journalctl -u app)
⚠️ 常见陷阱与规避
| 问题 | 原因 | 解决方案 |
|---|---|---|
| SSH 登录失败 | Ubuntu 默认禁用 root 登录,且防火墙策略不同 | 确保 PermitRootLogin no(推荐);检查 ufw 状态:sudo ufw allow 22/tcp |
| Web 服务无法启动 | 权限/SELinux 差异(Ubuntu 无 SELinux,但 AppArmor 可能干扰) | 检查 systemctl status nginx;查看 /var/log/auth.log |
| Python 模块缺失 | pip 未正确关联系统 Python 或依赖编译库缺失 |
安装 build-essential libssl-dev;优先用 venv |
| 定时任务失效 | crontab -e 编辑后未生效,或环境变量丢失 |
检查 cron 服务状态;在 crontab 中显式设置 PATH |
| 阿里云云助手/监控异常 | Agent 版本不兼容或初始化未完成 | 在阿里云控制台重启“云助手客户端”,或重装 alibabacloud-assist-agent |
🔄 备选方案(谨慎使用)
-
系统重装 + 数据回迁:仅适用于非核心业务
- 停止服务 → 创建快照
- 阿里云控制台“更换操作系统” → 选 Ubuntu
- 挂载原数据盘 → 恢复文件
❗风险:部分内核级驱动、定制内核模块可能不兼容;/etc/fstab需调整 UUID
-
Packer + Terraform 自动化迁移
适合大规模集群,通过镜像构建标准化 Ubuntu 环境,再用 Ansible 批量配置。
✅ 最终建议
- 小规模/单实例:采用「新实例 + 手动迁移」,可控性强
- 生产环境:务必在测试环境完整演练一次,预留 24h 回滚窗口
- 文档化:记录所有变更点(如
nginx配置路径变化、PHP 扩展启用方式)
需要我提供一份具体的迁移检查清单(Checklist)或某类应用(如 WordPress / Django / Spring Boot)的迁移指南吗?
CLOUD技术笔记