努力
加油

重装CentOS或Ubuntu时,怎样确保/home和/data目录数据不丢失?

重装系统时保留 /home 和 /data 数据,核心逻辑其实就一条:不要把这两个目录放在根分区(/)所在的物理磁盘或逻辑卷上,或者在重装前明确知道它们的挂载点,并在新系统中重新挂载。

很多新手踩坑的原因,是默认把整个硬盘格式化,或者在安装 CentOS/Ubuntu 时选了“自动分区”且勾选了“擦除磁盘”,导致所有数据灰飞烟灭。

下面分场景、分系统给出具体的实操方案。我会尽量用运维老鸟的口吻,不讲废话,直接上干货。


一、 核心前提:搞清楚你的数据结构

在动手之前,你必须通过 SSH 登录当前服务器,执行以下命令确认现状:

df -h
lsblk

你需要关注两个关键点:

  1. 挂载点:/home 和 /data 分别挂在哪个设备?(例如 /dev/vda2, /dev/sdb1, /dev/mapper/centos-home 等)
  2. 文件系统类型:是 ext4, xfs, 还是 btrfs?这决定了你后续能否直接复用。

最安全的策略(强烈推荐):
如果你的 /home 和 /data 是独立的分区或独立的云盘(如阿里云的 Cloud Disk、AWS EBS),那么重装系统时,只要不格式化这些特定的云盘/分区,数据就是安全的。


二、 场景一:独立云盘/独立分区(最理想情况)

这是云服务器最常见的架构。假设 /data 是一块额外的云盘(比如 /dev/vdb),而 /home 是主盘上的一个独立分区。

操作步骤:

  1. 备份关键配置(可选但建议):
    虽然数据不动,但用户权限、SSH Key、软件配置文件可能依赖 UID/GID。如果应用复杂,建议导出用户列表:

    cat /etc/passwd | grep -v nologin > ~/users_backup.txt
  2. 重装系统时的操作:

    • 阿里云/腾讯云/AWS控制台重装:
      • 通常会有“是否保留数据盘”的选项。务必选择“保留”。
      • 如果没有该选项,检查重装镜像设置,确保只格式化系统盘(通常是 /dev/vda 或 /dev/sda),不要勾选格式化其他数据盘。
    • 手动 ISO 安装:
      • 进入安装程序的分区环节。
      • 千万不要选“清除所有数据”。
      • 手动分区时,识别出原来的 /data 分区(看大小和文件系统),将其标记为“不格式化”或直接跳过,仅格式化根分区 / 和 swap。
  3. 重装后的恢复:
    新系统装好后,原 /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。

解决方案:

  1. 确认 LV 名称和路径:

    lvdisplay
    # 找到类似 /dev/mapper/centos-home 或 /dev/vg_name/lv_home
  2. 重装时:
    同样,确保只格式化系统盘。如果 /home 是在同一块物理盘上的独立 LV,且你没有删除整个 VG,那么 LV 的数据还在。

  3. 重装后恢复:

    • 如果 LVM 元数据还在(即 PV 和 VG 存在,只是 LV 被删了或没激活):
      sudo vgscan
      sudo vgchange -ay
      sudo lvcreate -n home -l 100%FREE vg_name  # 如果需要重建 LV,需谨慎
    • 更简单的做法:直接格式化新的 LV 或分区,然后挂载。但前提是你要确定原来的 LV 空间没有被新系统的分区规划占用。

    强烈建议:对于 LVM 环境,除非你非常清楚自己在做什么,否则不要尝试在重装过程中保留 LVM 结构。最好的方式是:

    1. 将重要数据拷贝到外部存储(另一台机器或对象存储 OSS/S3)。
    2. 重装系统。
    3. 重新创建 LVM 或分区,挂载数据盘。

四、 场景三:数据混在根分区(最危险的情况)

如果你的 /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

五、 避坑指南 & 最佳实践

  1. 永远不要信任“我以为”:
    在执行重装按钮前,再次运行 df -h 截图保存。确认哪些是系统盘,哪些是数据盘。

  2. 云厂商的控制台陷阱:

    • 阿里云 ECS:重装系统时,有“系统盘”和“数据盘”之分。系统盘会被重置,数据盘默认保留。只要你没去控制台单独卸载或格式化数据盘,数据就在。
    • 腾讯云 CVM:类似,注意区分“系统盘”和“数据盘”。
    • 华为云:同样遵循此逻辑。
    • 关键点:如果在控制台看到“更换操作系统”,它通常只影响系统盘。但如果是“初始化磁盘”或“重置密码+重装”组合拳,要小心是否有“格式化数据盘”的复选框被勾选。
  3. Swap 分区:
    如果 /data 里包含了 Swap 文件,重装后需要重新生成 Swap 文件或重新配置 SWAP 分区。

  4. Docker 容器数据:
    如果你用 Docker,且容器数据卷挂载到了 /data 或 /home,那么只要底层文件系统完好,重启 Docker 服务后,容器数据依然存在。无需特殊处理。

  5. 数据库迁移:
    如果 MySQL/PostgreSQL 的数据目录在 /home 或 /data 下,重装后:

    • 确保新系统安装了相同版本的 DB。
    • 启动 DB 服务前,检查 my.cnf 或 postgresql.conf 中的 datadir 指向是否正确。
    • 赋予 DB 用户(如 mysql, postgres)对数据目录的读写权限:
      sudo chown -R mysql:mysql /data/mysql_data

总结

  • 独立云盘/分区:重装时不格式化它们 -> 安全。重装后手动挂载 + 修权限。
  • LVM:谨慎操作,最好备份。
  • 混在根分区:必须提前备份到外部,否则无解。
  • 云控制台:看清“系统盘”与“数据盘”的区别,只动系统盘。

最后提醒一句:任何生产环境操作,事前快照(Snapshot)是最后的救命稻草。 如果支持云盘快照,先在控制台打一个快照,然后再折腾重装,这才是真正的“大神”做法。