将阿里云 ECS 实例的操作系统从 CentOS 迁移至 Ubuntu,本质上是一次底层环境重构。由于两者在包管理、默认安全策略、文件系统结构以及服务配置逻辑上存在显著差异,直接“换装”极易导致业务中断或配置丢失。
以下是基于生产环境实战经验的详细注意事项和操作指南:
一、 核心前提与风险评估
-
数据备份是第一原则
- 快照备份:在执行任何操作前,务必对当前系统盘创建全量快照。这是最后的回退底牌。
- 应用数据备份:如果业务数据(如数据库文件、网站代码、配置文件)存储在数据盘中,确保数据盘已挂载且数据完整;若数据在系统盘,需单独打包备份关键目录(如
/var/www,/home,/etc/nginx等)。
-
确认停机时间窗口
- 更换操作系统通常需要通过“自定义镜像”或“重装系统”实现,这要求实例处于已停止(Stopped)状态。
- 提前规划维护窗口,通知相关方业务将短暂不可用。
-
版本兼容性检查
- 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 基础镜像
- 登录阿里云控制台。
- 进入“镜像”页面,选择一个标准的 Ubuntu 22.04 LTS 公共镜像作为基础。
- (可选)创建一个自定义镜像,预装常用工具(如
vim,net-tools,curl等),以节省后续配置时间。
步骤 2:启动新实例并配置基础环境
-
使用上述镜像创建一台新的 ECS 实例(建议先在同一 VPC 内,方便内网通信测试)。
-
关键第一步:配置防火墙
# 更新 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 端口已放行。 -
安装必要的基础依赖:
sudo apt install build-essential git curl wget htop net-tools
步骤 3:迁移应用与环境
- 部署 Web 服务器:
sudo apt install nginx apache2 # 根据原 CentOS 使用的服务器选择 - 安装运行时环境:
- 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
- PHP:
- 迁移数据:
- 通过
rsync或scp将旧 CentOS 实例中的数据同步到新 Ubuntu 实例。rsync -avz /path/to/data root@new_ubuntu_ip:/path/to/destination
- 通过
- 迁移配置文件:
- Nginx/Apache 配置文件可能需要微调(特别是路径权限、MIME 类型等)。
- PHP 配置文件 (
php.ini) 需根据新环境调整。 - MySQL/MariaDB 数据文件可直接复制,但需注意用户权限和 socket 路径。
步骤 4:验证与调试
- 检查服务状态:
systemctl status nginx systemctl status mysql systemctl status php8.1-fpm # 版本号依实际而定 - 检查日志排查错误:
- Nginx:
/var/log/nginx/error.log - Apache:
/var/log/apache2/error.log - Systemd:
journalctl -xe
- Nginx:
- 测试 API 接口、前端页面、数据库连接是否正常。
步骤 5:切换 DNS 或 IP
- 确认新 Ubuntu 实例运行稳定后,修改域名解析指向新实例的公网 IP。
- 或者,如果使用的是固定公网 IP,可以在阿里云控制台进行 弹性公网 IP(EIP)绑定/解绑,将 EIP 从旧实例转移到新实例,实现无缝切换。
四、 常见坑点与解决方案
-
SSH 登录后权限问题
- Ubuntu 默认禁止 root 直接 SSH 登录(
PermitRootLogin no)。 - 解决:使用普通用户登录,然后通过
sudo su -提权,或在/etc/ssh/sshd_config中修改PermitRootLogin yes(不推荐生产环境)。
- Ubuntu 默认禁止 root 直接 SSH 登录(
-
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;
- MySQL 8.0+ 默认使用
-
时区问题
- CentOS 和 Ubuntu 的时区配置方法不同。
- 解决:
timedatectl set-timezone Asia/Shanghai
-
SELinux vs AppArmor
- CentOS 默认开启 SELinux,Ubuntu 默认使用 AppArmor。
- 注意:如果你之前有针对 SELinux 的上下文标签(context)配置,这些在新系统中无效。一般建议在生产环境中关闭 SELinux/AppArmor 以减少排障复杂度(除非有特殊安全合规要求)。
-
Docker 网络桥接
- Ubuntu 的网络命名空间处理可能与 CentOS 略有差异,尤其是涉及自定义 bridge 网络时。
- 解决:重启 Docker 服务,检查
docker network ls是否正常。
五、 总结建议
- 不要原地升级:务必采用“新实例 + 数据迁移”的模式。
- 自动化脚本:编写 Ansible Playbook 或 Shell 脚本,将 Ubuntu 环境的初始化过程自动化,确保未来可重复部署。
- 监控先行:在新实例上线初期,加强 CPU、内存、磁盘 I/O 和网络流量的监控,及时发现异常。
- 文档记录:记录所有安装的软件版本、配置参数和修改过的配置文件,便于后续维护和故障排查。
通过以上步骤,你可以平稳、安全地完成从 CentOS 到 Ubuntu 的迁移,充分利用 Ubuntu 在容器化、云原生支持和社区活跃度方面的优势。
CLOUD云枢