挂载数据盘后系统盘文件不见了
发布时间:2025-10-10 13:41       
更新时间:2025-10-11 01:49
先说结论:文件大概率没有丢,只是被数据盘盖住了。Linux 的挂载机制会把数据盘的内容呈现到挂载点上,原目录里的文件还躺在系统盘原分区,只是暂时看不见。
为什么会出现覆盖
数据盘格式化后用 mount 挂到了一个已有数据的目录,比如 /data 或网站根目录。新盘第一次用要先分区格式化,mkfs.ext4 /dev/vdb1 一条命令,格式化会清空数据,挂错盘和格式错盘都出过事故,动手前用 lsblk 再确认一遍设备名。挂载生效后,访问该目录看到的是新盘的空内容,原文件依然在系统盘里,卸载后立刻原样出现。如果目录里有进程正在写文件,覆盖期间的新写入会落到数据盘上,原文件留在系统盘,两边都有数据,这是发现不及时时最容易乱的地方。
确认方法
执行 df -h 查看当前挂载对应关系,Size 列和购买容量一致的那一行就是数据盘;再执行 lsblk 确认分区结构。想验证原文件还在,先停业务再卸载:
umount /data
ls -l /data
目录内容回来了,就说明文件都在系统盘上。顺便记下数据盘的文件系统类型和容量,后面重新挂载、写 fstab 都要用。
正确的恢复顺序
第一步停掉写这个目录的服务;第二步 umount 卸载数据盘;第三步把原目录数据迁入数据盘;第四步重新挂载,把数据放回挂载点:
umount /data
mount /dev/vdb1 /data
rsync -a /data_bak/ /data/
更稳妥的做法是先挂空目录(mkdir /data1 && mount /dev/vdb1 /data1),用 rsync 把原数据完整迁入后,再切换挂载点,全程业务无感。
换挂载点后别忘了 /etc/fstab
用 blkid 查数据盘 UUID,把 fstab 里的挂载项改成新目录,否则重启后数据盘挂不回来。fstab 写错会导致开机失败,改完执行 mount -a 验证,无报错再重启。
卸载报 target is busy
说明有进程占用目录,用 fuser -mv /data 找到进程号,数据库这类服务先 systemctl stop 再卸载,不要用 -l 强制卸载,容易留下脏数据。平时养成习惯:新数据盘一律先挂空目录、迁移完再切换,也别把数据盘挂到 / 等系统关键目录上。迁移完成后跑一次 df -h 和 du -sh /data 核对容量与文件数,和迁移前对得上再收工。