Linux 挂载新磁盘导致原文件被隐藏解决方案
文章目录
- 事件背景
- 问题原因
- 解决方案一(无效)
- 解决方案二
事件背景
事故源于我的一次无心操作,前几天我使用 fdisk -l
命令偶然发现测试环境一台服务器竟然有 1TB 的磁盘未挂载,而那台测试服务器已经使用两年了,之前就一直磁盘空间紧张,这次就像是意外之喜,于是我开始了磁盘挂载之路,首先使用 fdisk
命令进行分区操作,然后使用 mkfs.ext4
命令进行格式化操作,并在 /etc/fstab
文件中设置好开机自动挂载,最后使用 mount
命令将新磁盘挂载到根目录下
mount /dev/sdb1 /root
然后今天同事反映测试环境很多应用报错了。
问题原因
听到同事反馈,我虎躯一震,马上想到可能是前几天挂载新磁盘导致的问题,当时的情况是根目录没有单独挂载,而我使用新磁盘挂载到根目录,就会导致之前的根目录文件没了,会使用新磁盘里面的文件,但是我当时确认过老磁盘根目录下是没有文件的,我才敢直接挂载的。等等。。。这里面可能有问题,我没有考虑到隐藏文件!!!果然,根目录下有很多程序运行所需要的隐藏文件被我忽略了。
解决方案一(无效)
既然找到问题了,那就要去解决它,我很清楚老磁盘的数据是没有丢失的,只是被隐藏起来了,现在就需要将老磁盘的数据找回来,最先想到的办法就是 umount 新磁盘,那么老磁盘的数据自然就出现了
umount /dev/sdb1
当我运行这个命令时,反馈结果是目标忙,命令执行不成功,使用强制 umount 也无济于事,使用 lsof /dev/sdb1
命令查出所有占用进程并杀死也没用,于是我放弃 umount 新磁盘。
解决方案二
我转向求助 AI,其实不抱有太大希望,AI 给我指了条明路,试了下竟然真的成功了!操作办法如下:
首先创建一个临时目录,然后将根目录绑定到临时目录,注意下面的 --bind
选项
mkdir /tmp/oldroot
mount --bind / /tmp/oldroot
然后进入临时目录里面的根目录,将老 /root
目录下的文件复制到当前 /root
目录下,注意命令中的 .
符号,表示复制全部文件,包括隐藏文件
cd /tmp/oldroot/root
cp -rf . /root
最后卸载临时目录的绑定关系,并删除,搞定!
umount /tmp/oldroot
rmdir /tmp/oldroot