先说结论:云主机(ECS/CVM)本身不支持直接“无损切换”操作系统镜像并保留原有数据盘上的所有文件,尤其是系统盘。
如果你是指重装系统时保留数据盘,或者在两台机器间迁移数据,这是可行的。但如果是想在一台机器上把 CentOS 的根目录(/)换成 Ubuntu,同时保留 /home、/var/www 等数据,原生不支持,必须通过备份-重建-恢复的流程来实现。
下面分场景给你讲清楚怎么做最稳妥、风险最低。
一、核心原则:区分系统盘和数据盘
国内主流云厂商(阿里云 ECS、腾讯云 CVM、华为云 ECS 等)的云主机通常由两块盘组成:
- 系统盘:安装 OS 的地方,重装系统时会格式化或覆盖。
- 数据盘:独立挂载的磁盘,用于存放业务数据、数据库、网站文件等。
✅ 能保留的:数据盘里的文件(只要你不手动删它)。
❌ 不能直接保留的:系统盘里的文件(/etc, /usr, /bin, /sbin, /home 如果放在系统盘的话)。
⚠️ 注意:很多用户默认把 /home 放在系统盘。如果你的个人文件、项目代码在 /home 下,重装系统后这些数据会丢失!
二、正确操作流程(推荐方案)
步骤 1:确认数据位置
登录当前 CentOS 实例,执行:
df -h
lsblk
查看哪些目录不在 /dev/vda1(通常是系统盘),而是在 /dev/vdb 或其他数据盘上。
- 如果数据在独立数据盘 → 安全,后续操作只需确保不卸载/格式化该盘即可。
- 如果数据在系统盘(如 /home, /var/www/html 在 vda1)→ 必须提前备份到对象存储(OSS/COS)或另一台临时机器。
步骤 2:备份关键数据(无论在哪都建议做)
即使数据在数据盘,也建议:
- 打包重要配置文件(如 Nginx/Apache 配置、MySQL 配置文件)
- 导出数据库(mysqldump / pg_dump)
- 上传至云厂商的对象存储(阿里云 OSS、腾讯云 COS),作为最终保险
# 示例:打包网站文件
tar czf /tmp/site_backup.tar.gz /var/www/html
# 示例:导出 MySQL 数据库
mysqldump -u root -p --all-databases > /tmp/db_backup.sql
然后上传到 OSS/COS:
ossutil cp /tmp/site_backup.tar.gz oss://your-bucket/backup/
步骤 3:创建自定义镜像(可选但推荐)
在控制台对当前 CentOS 实例创建自定义镜像。这样即使出错,也能回滚到原状态。
步骤 4:停止实例 → 更换操作系统镜像
- 在云控制台停止该实例(必须停机才能换镜像)。
- 进入“更换操作系统”或“重装系统”选项。
- 选择 Ubuntu 版本(如 Ubuntu 22.04 LTS)。
- 关键设置:
- ✅ 勾选“保留数据盘”或类似选项(不同厂商叫法不同,阿里云叫“保留系统盘数据”,但实际是保留未格式化的数据盘;腾讯云叫“保留数据盘”)。
- ❌ 不要勾选“格式化数据盘”。
- 提交请求,等待重启。
📌 注意:部分云厂商允许“仅更换系统盘”,即只替换系统盘,数据盘不动。请仔细阅读厂商文档中的“是否影响数据盘”说明。
步骤 5:新系统启动后恢复数据
Ubuntu 启动后:
- 检查数据盘是否自动挂载:
lsblk mount | grep vdb # 假设数据盘是 vdb如果没有自动挂载,需手动挂载:
mkdir /data mount /dev/vdb1 /data # 根据实际分区调整 - 从对象存储下载备份文件:
ossutil cp oss://your-bucket/backup/site_backup.tar.gz /tmp/ tar xzf /tmp/site_backup.tar.gz -C /var/www/html - 重新安装必要软件(Nginx, PHP, MySQL 等):
apt update && apt install nginx php mysql-server - 导入数据库:
mysql -u root -p < /tmp/db_backup.sql - 修改权限、重启服务、测试访问。
三、常见误区与避坑指南
| 误区 | 正确做法 |
|---|---|
| “重装系统能保留所有文件” | 只能保留数据盘,系统盘必丢 |
| “直接 dd 克隆系统盘” | 跨发行版内核差异大,极易 boot failure,不推荐 |
| “用 rsync 同步整个系统” | 无法处理 bootloader、initramfs、内核模块等底层差异 |
| “忽略文件系统类型” | CentOS 默认 ext4/xfs,Ubuntu 也支持,但需注意 UUID 和 fstab 配置 |
四、进阶方案:使用 Packer + Ansible 实现标准化迁移(适合运维团队)
如果你是企业用户,频繁需要切换 OS,建议:
- 用 Packer 构建 Ubuntu 基础镜像,预装常用环境。
- 用 Ansible Playbook 定义部署流程(安装依赖、复制配置、导入数据)。
- 在新 Ubuntu 实例上运行 Ansible 脚本一键恢复。
这种方式比手动操作更可靠、可审计、可重复。
五、总结
- 没有“一键切换 OS 保留所有文件”的功能,这是技术限制,不是厂商缺陷。
- 唯一安全路径:备份 → 停机 → 换镜像(保留数据盘)→ 恢复数据。
- 务必提前验证备份可用性,别等到新系统跑起来才发现备份打不开。
- 强烈建议使用对象存储做异地备份,避免单点故障。
如果你能提供具体云厂商(阿里云/腾讯云/华为云等)和当前系统盘/数据盘布局,我可以给出更精确的操作命令和注意事项。
云技术博客