事情是这样的
我们团队有一台比赛用车,团队已经搞了一个多月了,最近空间不足挺麻烦。
这个车有两个盘,一个 /dev/mmcblk0 放在车载芯片里,还有一个 /dev/mmcblk1 是 SD 卡扩展。
根目录的空间不足给使用带来了很多麻烦,尤其是在空间为 0B 的时候,只能用 TTY 删掉一些空间,再减少一点预留空间,才能进入 GUI 界面,否则连 GUI 软件都打不开。
而且这个轻描淡写过程的背后,是大量的试错
- 逐渐熟练使用 du, df, sudo du -sh /* | sort -h, duf 等命令,不时查看空间是否充足(C盘焦虑症)
- 查了半天发现根目录 / 和用户目录 /home 是两个盘,还错怪主办方分区给的太少(不过根目录确实太小)
- 空间为 0 的时候刚开始没注意到 TTY,专门找来旧路由器让车自动连接,以使用 SSH 对 Liunx 进行操作
- SIZE (总大小)和 USED (已使用)之间不只有 AVAIL(可用空间),还有一般设为 5% 的预留空间,我说怎么删了几百 M 下去,AVAIL 还是 0
- 找了半天能删的文件,甚至把 Chromium 都删了,才够 Linux 勉强能用
最后,虽然空间调整了勉强够用,但仍然容易不足。
巨大的错误
根目录有一个路径是 /tmp ,用于存储临时文件。
这个路径会偶尔占用到数 G ,但很快又自动清理了。但考虑当前存储不足,我就在想如何把 /tmp 挂载到 /home 盘下。
我找到地表最强模型 GPT4,问他怎么办。
他说改一下 /etc/fstab 就行了
我说,好
于是一通 sudo vim /etc/fstab
vim 说,你的 fstab 是这样的
/dev/root / ext4 defaults 0 1
/dev/mmcblklp1 /home ext4 defaults 0 0
我就加了个 /tmp 进去,变成了这样
/dev/root / ext4 defaults 0 1
/dev/mmcblklp1 /home ext4 defaults 0 0
/dev/mmcblklp1 /tmp ext4 defaults 0 0
然后 duf ,发现确实增加了
挺好,就应该这样
但运行后,仍然发现 /tmp 没有挂载上去
那就重启一下吧,我想。
天崩地裂
重启后,我打开了一个常用的程序,发现 not found
奇怪,又是没有 source ~/.bashrc 吧
我熟练地敲上去了 source ~/.bashrc
代码的历史记录,还记录着我输入了 ???
我当时还很疑惑,怎么回事?
然后我看了一下文件列表,忽然发现不对劲
卧槽,整个用户目录的文件去哪里了?
顿时,我身体一阵寒意袭来
卧槽卧槽卧槽
我立即 duf,结果是
我惊讶地发现,/home 目录怎么只有 4.1G 了??????
不会被格式化了吧?????这个盘可是有一个多月来的心血,而且没怎么备份过!
我脑子直接懵了,凭着回忆开始想,一定是因为 /etc/fstab,一定是,一定是
我立即去删掉了 /tmp 的挂载,然后 reboot
但重启后,一切仍是如此。
我将车关机,取出 SD 卡,用 DiskGenuis 查看了一下,发现真的只有寥寥几 G 的文件,其他啥都没有了。
寻找数据恢复人员,他们用读盘工具检查了,发现盘的内容清理的非常彻底,完全无法恢复
我问 GPT4
Linux 的覆盖真的是不留一点余地!
第一:Linux 挂载的逻辑不一样,与其说是把路径挂载到盘里时,不如说是把盘挂载到路径下,不是盘会覆盖路径,而是路径覆盖盘
第二:/etc/fstab 文件的错误不会报错,只会执行下去,而且没想到 GPT4 的回答没有想明白,这个文件的操作太危险了
第三:重复挂载的结果,居然是完完整整地覆盖掉硬盘,而不是删除文件只删除索引那么简单,一点数据恢复的机会都没有
接受现实与补救
在尝试各种数据恢复无果后,只能从头开始。
在刚刚发生的这几个小时里,我整个人的情绪都处在完全失落和压力中。
不幸中的万幸啊。好在,我在 10 天前备份了一个目录,当时想着可能会对文件进行修改,方便以后恢复吧。
谁知道,居然这个无意的备份,会在 10 天后极其愚蠢的操作中成为救命稻草。
10 天时间,确实损失了很多,这件事情给整个团队带来了毁灭性的打击,但还好在队员、老师的鼓励下,我们一直在补救。非常非常感谢他们对我愚蠢行为的包容。
除此之外,一定要做好备份。因为问题永远无法避免,你不知道什么时候会出现误操作,各种技术细节太多太多了。而备份是你唯一能做的而且一定是对的事情。
从今天开始,我每天都会对这个车进行备份,隔一段时间最好能备份整个镜像。
这已经不是我第一次遇到数据丢失的问题了,但确实是最严重的一次。
除此之外,平时生活中也要做好数据备份。
- 代码先本地 Git,然后也多 Github 或 Gitee 同步,太大就多写一些 .gitignore
- 个人文档始终 OneDrive 同步
- 项目数据比较大的话,也要把文档单独备份出来
- 手机的数据多用百度网盘之类的备份
前段时间还在写一个软件,用于一键压缩某路径下所有子路径的常见文档,自动识别大文件和占用大的目录用于加快压缩速度。(具体的功能就等写完之后再说吧)
最后,希望大家引以为戒,一定要做好备份,在涉及和硬盘、数据等重大操作的命令下一定要小心谨慎。数据丢失后,一定要冷静思考,把可能恢复的各种路径都想清楚。