重装系统时保留 /home 和 /data 数据,核心逻辑其实就一条:不要把这两个目录放在根分区(/)所在的物理磁盘或逻辑卷上,或者在重装前明确知道它们的挂载点,并在新系统中重新挂载。
很多新手踩坑的原因,是默认把整个硬盘格式化,或者在安装 CentOS/Ubuntu 时选了“自动分区”且勾选了“擦除磁盘”,导致所有数据灰飞烟灭。
下面分场景、分系统给出具体的实操方案。我会尽量用运维老鸟的口吻,不讲废话,直接上干货。
一、 核心前提:搞清楚你的数据结构
在动手之前,你必须通过 SSH 登录当前服务器,执行以下命令确认现状:
df -h
lsblk
你需要关注两个关键点:
- 挂载点:
/home和/data分别挂在哪个设备?(例如/dev/vda2,/dev/sdb1,/dev/mapper/centos-home等) - 文件系统类型:是
ext4,xfs, 还是btrfs?这决定了你后续能否直接复用。
最安全的策略(强烈推荐):
如果你的 /home 和 /data 是独立的分区或独立的云盘(如阿里云的 Cloud Disk、AWS EBS),那么重装系统时,只要不格式化这些特定的云盘/分区,数据就是安全的。
二、 场景一:独立云盘/独立分区(最理想情况)
这是云服务器最常见的架构。假设 /data 是一块额外的云盘(比如 /dev/vdb),而 /home 是主盘上的一个独立分区。
操作步骤:
-
备份关键配置(可选但建议):
虽然数据不动,但用户权限、SSH Key、软件配置文件可能依赖 UID/GID。如果应用复杂,建议导出用户列表:cat /etc/passwd | grep -v nologin > ~/users_backup.txt -
重装系统时的操作:
- 阿里云/腾讯云/AWS控制台重装:
- 通常会有“是否保留数据盘”的选项。务必选择“保留”。
- 如果没有该选项,检查重装镜像设置,确保只格式化系统盘(通常是
/dev/vda或/dev/sda),不要勾选格式化其他数据盘。
- 手动 ISO 安装:
- 进入安装程序的分区环节。
- 千万不要选“清除所有数据”。
- 手动分区时,识别出原来的
/data分区(看大小和文件系统),将其标记为“不格式化”或直接跳过,仅格式化根分区/和 swap。
- 阿里云/腾讯云/AWS控制台重装:
-
重装后的恢复:
新系统装好后,原/data分区可能没有挂载到/data,或者因为 UUID 变化无法自动挂载。以 Ubuntu/CentOS 为例,手动挂载:
# 1. 查看新系统下的磁盘情况 lsblk # 2. 创建挂载点(如果不存在) sudo mkdir -p /data # 3. 临时挂载测试 sudo mount /dev/vdb1 /data # 假设 vdb1 是你的数据盘 # 4. 验证数据是否在 ls -l /data # 5. 如果正常,写入 fstab 实现开机自动挂载 # 获取 UUID blkid /dev/vdb1 # 编辑 /etc/fstab sudo nano /etc/fstab # 添加一行:UUID=你的-uuid-here /data ext4/xfs defaults 0 2注意权限问题:
如果你重装后新建的用户 UID 变了,可能导致/home下文件权限错乱。修复方法:# 递归修改所有者,假设用户名不变 sudo chown -R username:username /home/username
三、 场景二:LVM 逻辑卷(常见于 CentOS/RHEL)
CentOS 默认使用 LVM。很多时候 /home 是一个 Logical Volume (LV)。
风险点:
LVM 的 PV(物理卷)、VG(卷组)、LV(逻辑卷)结构在重装后可能丢失,尤其是如果你选择了全新安装并重建了 VG。
解决方案:
-
确认 LV 名称和路径:
lvdisplay # 找到类似 /dev/mapper/centos-home 或 /dev/vg_name/lv_home -
重装时:
同样,确保只格式化系统盘。如果/home是在同一块物理盘上的独立 LV,且你没有删除整个 VG,那么 LV 的数据还在。 -
重装后恢复:
- 如果 LVM 元数据还在(即 PV 和 VG 存在,只是 LV 被删了或没激活):
sudo vgscan sudo vgchange -ay sudo lvcreate -n home -l 100%FREE vg_name # 如果需要重建 LV,需谨慎 - 更简单的做法:直接格式化新的 LV 或分区,然后挂载。但前提是你要确定原来的 LV 空间没有被新系统的分区规划占用。
强烈建议:对于 LVM 环境,除非你非常清楚自己在做什么,否则不要尝试在重装过程中保留 LVM 结构。最好的方式是:
- 将重要数据拷贝到外部存储(另一台机器或对象存储 OSS/S3)。
- 重装系统。
- 重新创建 LVM 或分区,挂载数据盘。
- 如果 LVM 元数据还在(即 PV 和 VG 存在,只是 LV 被删了或没激活):
四、 场景三:数据混在根分区(最危险的情况)
如果你的 /home 和 /data 都在 / 分区下(即没有独立分区),重装系统意味着格式化 /,数据必丢。
这种情况下,唯一的办法是先备份,再重装。
备份脚本示例:
# 打包/home和/data
tar -czf /tmp/data_backup.tar.gz /home /data
# 上传到远程或复制到另一块盘
scp /tmp/data_backup.tar.gz user@backup-server:/path/to/save
# 或者
rsync -avz /home/ user@remote-host:/backup/home/
重装后恢复:
# 解压
sudo tar -xzvf data_backup.tar.gz -C /
# 修正权限(非常重要!)
sudo chown -R $(whoami):$(whoami) /home/your_username
五、 避坑指南 & 最佳实践
-
永远不要信任“我以为”:
在执行重装按钮前,再次运行df -h截图保存。确认哪些是系统盘,哪些是数据盘。 -
云厂商的控制台陷阱:
- 阿里云 ECS:重装系统时,有“系统盘”和“数据盘”之分。系统盘会被重置,数据盘默认保留。只要你没去控制台单独卸载或格式化数据盘,数据就在。
- 腾讯云 CVM:类似,注意区分“系统盘”和“数据盘”。
- 华为云:同样遵循此逻辑。
- 关键点:如果在控制台看到“更换操作系统”,它通常只影响系统盘。但如果是“初始化磁盘”或“重置密码+重装”组合拳,要小心是否有“格式化数据盘”的复选框被勾选。
-
Swap 分区:
如果/data里包含了 Swap 文件,重装后需要重新生成 Swap 文件或重新配置 SWAP 分区。 -
Docker 容器数据:
如果你用 Docker,且容器数据卷挂载到了/data或/home,那么只要底层文件系统完好,重启 Docker 服务后,容器数据依然存在。无需特殊处理。 -
数据库迁移:
如果 MySQL/PostgreSQL 的数据目录在/home或/data下,重装后:- 确保新系统安装了相同版本的 DB。
- 启动 DB 服务前,检查
my.cnf或postgresql.conf中的datadir指向是否正确。 - 赋予 DB 用户(如
mysql,postgres)对数据目录的读写权限:sudo chown -R mysql:mysql /data/mysql_data
总结
- 独立云盘/分区:重装时不格式化它们 -> 安全。重装后手动挂载 + 修权限。
- LVM:谨慎操作,最好备份。
- 混在根分区:必须提前备份到外部,否则无解。
- 云控制台:看清“系统盘”与“数据盘”的区别,只动系统盘。
最后提醒一句:任何生产环境操作,事前快照(Snapshot)是最后的救命稻草。 如果支持云盘快照,先在控制台打一个快照,然后再折腾重装,这才是真正的“大神”做法。
云技术博客