阿里云实例从CentOS更换为Ubuntu有哪些注意事项?

将阿里云 ECS 实例的操作系统从 CentOS 迁移至 Ubuntu,本质上是一次底层环境重构。由于两者在包管理、默认安全策略、文件系统结构以及服务配置逻辑上存在显著差异,直接“换装”极易导致业务中断或配置丢失。

以下是基于生产环境实战经验的详细注意事项和操作指南:

一、 核心前提与风险评估

  1. 数据备份是第一原则

    • 快照备份:在执行任何操作前,务必对当前系统盘创建全量快照。这是最后的回退底牌。
    • 应用数据备份:如果业务数据(如数据库文件、网站代码、配置文件)存储在数据盘中,确保数据盘已挂载且数据完整;若数据在系统盘,需单独打包备份关键目录(如 /var/www, /home, /etc/nginx 等)。
  2. 确认停机时间窗口

    • 更换操作系统通常需要通过“自定义镜像”或“重装系统”实现,这要求实例处于已停止(Stopped)状态。
    • 提前规划维护窗口,通知相关方业务将短暂不可用。
  3. 版本兼容性检查

    • CentOS 8/9 已停止维护(EOL),Ubuntu 也有 LTS(长期支持版)和普通版之分。
    • 建议:选择最新的 Ubuntu 22.04 LTS 或 24.04 LTS,以获得长期的安全更新和社区支持。避免使用非 LTS 版本用于生产环境。

二、 技术差异对比与适配重点

维度 CentOS (RHEL系) Ubuntu (Debian系) 迁移注意点
包管理器 yum / dnf apt / apt-get 所有软件安装命令需替换,依赖关系不同
初始化系统 systemd + chkconfig systemd + sysvinit (兼容) 服务自启设置方式略有不同
防火墙 firewalld / iptables ufw (默认) 或 iptables-nft Ubuntu 默认启用 ufw,可能阻断 SSH
Web 服务器 Apache/Nginx 配置路径类似 路径基本一致,但模块加载机制不同 需重新加载 PHP-FPM 等模块配置
Python 环境 通常自带 Python 2/3 自带 Python 3.x 虚拟环境(venv/pipenv)需重建
Docker 官方源配置略有不同 官方源配置不同 需重新添加 Docker GPG key 和 repo

三、 标准操作流程(推荐方案)

⚠️ 重要提示:不要尝试在运行的 CentOS 系统中直接“覆盖”安装 Ubuntu。Linux 不支持跨发行版的原地升级。正确做法是:创建新实例 -> 迁移数据 -> 切换流量。

步骤 1:准备 Ubuntu 基础镜像

  1. 登录阿里云控制台。
  2. 进入“镜像”页面,选择一个标准的 Ubuntu 22.04 LTS 公共镜像作为基础。
  3. (可选)创建一个自定义镜像,预装常用工具(如 vim, net-tools, curl 等),以节省后续配置时间。

步骤 2:启动新实例并配置基础环境

  1. 使用上述镜像创建一台新的 ECS 实例(建议先在同一 VPC 内,方便内网通信测试)。

  2. 关键第一步:配置防火墙

    # 更新 apt
    sudo apt update && sudo apt upgrade -y
    
    # 查看 ufw 状态
    sudo ufw status
    
    # 如果 ufw 未启用,建议启用并开放必要端口(如 SSH 22, HTTP 80, HTTPS 443)
    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw enable

    🚨 警告:如果在没有开放 SSH 端口的情况下启用 ufw,你将立即失去远程连接能力!务必先在阿里云控制台的“安全组”中确保 22 端口已放行。

  3. 安装必要的基础依赖:

    sudo apt install build-essential git curl wget htop net-tools

步骤 3:迁移应用与环境

  1. 部署 Web 服务器:
    sudo apt install nginx apache2  # 根据原 CentOS 使用的服务器选择
  2. 安装运行时环境:
    • PHP: sudo apt install php php-fpm php-mysql php-curl php-gd
    • Node.js: 建议使用 nvm 或官方源安装,而非 CentOS 的 epel 源。
    • Python: sudo apt install python3 python3-pip python3-venv
  3. 迁移数据:
    • 通过 rsync 或 scp 将旧 CentOS 实例中的数据同步到新 Ubuntu 实例。
      rsync -avz /path/to/data root@new_ubuntu_ip:/path/to/destination
  4. 迁移配置文件:
    • Nginx/Apache 配置文件可能需要微调(特别是路径权限、MIME 类型等)。
    • PHP 配置文件 (php.ini) 需根据新环境调整。
    • MySQL/MariaDB 数据文件可直接复制,但需注意用户权限和 socket 路径。

步骤 4:验证与调试

  1. 检查服务状态:
    systemctl status nginx
    systemctl status mysql
    systemctl status php8.1-fpm  # 版本号依实际而定
  2. 检查日志排查错误:
    • Nginx: /var/log/nginx/error.log
    • Apache: /var/log/apache2/error.log
    • Systemd: journalctl -xe
  3. 测试 API 接口、前端页面、数据库连接是否正常。

步骤 5:切换 DNS 或 IP

  1. 确认新 Ubuntu 实例运行稳定后,修改域名解析指向新实例的公网 IP。
  2. 或者,如果使用的是固定公网 IP,可以在阿里云控制台进行 弹性公网 IP(EIP)绑定/解绑,将 EIP 从旧实例转移到新实例,实现无缝切换。

四、 常见坑点与解决方案

  1. SSH 登录后权限问题

    • Ubuntu 默认禁止 root 直接 SSH 登录(PermitRootLogin no)。
    • 解决:使用普通用户登录,然后通过 sudo su - 提权,或在 /etc/ssh/sshd_config 中修改 PermitRootLogin yes(不推荐生产环境)。
  2. MySQL 密码认证插件变更

    • MySQL 8.0+ 默认使用 caching_sha2_password,而某些老版本客户端或框架(如旧版 Laravel、ThinkPHP)可能仅支持 mysql_native_password。
    • 解决:修改 MySQL 用户认证方式:
      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
      FLUSH PRIVILEGES;
  3. 时区问题

    • CentOS 和 Ubuntu 的时区配置方法不同。
    • 解决:
      timedatectl set-timezone Asia/Shanghai
  4. SELinux vs AppArmor

    • CentOS 默认开启 SELinux,Ubuntu 默认使用 AppArmor。
    • 注意:如果你之前有针对 SELinux 的上下文标签(context)配置,这些在新系统中无效。一般建议在生产环境中关闭 SELinux/AppArmor 以减少排障复杂度(除非有特殊安全合规要求)。
  5. Docker 网络桥接

    • Ubuntu 的网络命名空间处理可能与 CentOS 略有差异,尤其是涉及自定义 bridge 网络时。
    • 解决:重启 Docker 服务,检查 docker network ls 是否正常。

五、 总结建议

  • 不要原地升级:务必采用“新实例 + 数据迁移”的模式。
  • 自动化脚本:编写 Ansible Playbook 或 Shell 脚本,将 Ubuntu 环境的初始化过程自动化,确保未来可重复部署。
  • 监控先行:在新实例上线初期,加强 CPU、内存、磁盘 I/O 和网络流量的监控,及时发现异常。
  • 文档记录:记录所有安装的软件版本、配置参数和修改过的配置文件,便于后续维护和故障排查。

通过以上步骤,你可以平稳、安全地完成从 CentOS 到 Ubuntu 的迁移,充分利用 Ubuntu 在容器化、云原生支持和社区活跃度方面的优势。

未经允许不得转载:CLOUD云枢 » 阿里云实例从CentOS更换为Ubuntu有哪些注意事项?