在阿里云ECS上从CentOS迁移到Ubuntu有哪些注意事项?

将阿里云 ECS 从 CentOS 迁移到 Ubuntu,强烈不建议直接“重装系统”或手动复制文件(除非是全新实例),因为两者在包管理器、目录结构、服务管理方式、网络配置逻辑等方面存在显著差异。以下是关键注意事项和推荐方案:


✅ 推荐方案:创建新 Ubuntu 实例 + 数据/应用迁移

这是最安全、可控的方式,避免兼容性问题导致生产中断。

1. 规划与准备阶段

  • 备份源系统

    • 使用阿里云快照功能对原 CentOS ECS 创建完整快照(含系统盘+数据盘)。
    • 额外备份关键配置文件(如 /etc/nginx/, /etc/mysql/, crontab)、数据库导出(mysqldump / pg_dump)。
  • 评估依赖差异 项目 CentOS (RPM) Ubuntu (DEB) 注意
    包管理器 yum / dnf apt / snap 命令、仓库名称、软件包名可能不同(如 httpdapache2
    服务管理 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 LTS24.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:mysqldumpmysql 导入
      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 同理
  • 配置文件迁移
    • 手动比对修改:nginx.confphp-fpm.confmy.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

🔄 备选方案(谨慎使用)

  • 系统重装 + 数据回迁:仅适用于非核心业务

    1. 停止服务 → 创建快照
    2. 阿里云控制台“更换操作系统” → 选 Ubuntu
    3. 挂载原数据盘 → 恢复文件
      ❗风险:部分内核级驱动、定制内核模块可能不兼容;/etc/fstab 需调整 UUID
  • Packer + Terraform 自动化迁移
    适合大规模集群,通过镜像构建标准化 Ubuntu 环境,再用 Ansible 批量配置。


✅ 最终建议

  • 小规模/单实例:采用「新实例 + 手动迁移」,可控性强
  • 生产环境:务必在测试环境完整演练一次,预留 24h 回滚窗口
  • 文档化:记录所有变更点(如 nginx 配置路径变化、PHP 扩展启用方式)

需要我提供一份具体的迁移检查清单(Checklist)或某类应用(如 WordPress / Django / Spring Boot)的迁移指南吗?

云服务器