记一次惊心动魄的数据恢复:rm -rf /usr

2017-10-29

  昨天晚上下班了,一些加班的同事也下去吃晚饭了,我闲着, 便想找点事儿做,鬼使神差的想要换一台VPS,因为原来的那台yum不好用了,某次我更换了python版本导致不可用了,无论如何也修复不了了(顺便劝告读者们,没事儿别想着动yum相关的程序)。这是令人心碎的程序。我在VPS各个文件夹转转,找那些一看就没有用的文件,一个个慢慢删除,最后把重要文件打包。问题又出在了这个yum,我曾在一个临时文件夹tmpdir 内编译yum,生成了etc、usr文件夹,记得当时就吓了我一跳,现在果然掉进这个坑了。我一看这个usr文件夹里面就只有两个文件,就想直接删除。在tmpdir内运行了rm -rf filea fileb filec dir1 dir2 /usr dir3。一会儿之后,突然意识不妙,放下茶杯,果然悲剧了。苍天啊,大地啊,我瞬间想要砸掉地板啊,想抽自己嘴巴子啊。完了完了,这回GG了。
  虽然我写了文件备份的脚本,但没有加到crontab里去,一两个月备份一次,我之前认为也可以了。幸好这次愚蠢的操作之前也备份了一次。但是,我还帮着托管了同学和同事的小站点,不可避免的有数据丢失啊。vulkan.org.cn BBS也托管在上面啊,数据完全没有被纷纷。
  冷静,冷静。我马上告诉自己。先看看系统会不会马上crash,进行了几个命令操作,大多找不到,系统没有crash。还好,还好,没有crash,天不亡我。我首先想尝试是否能够通过scp或者rsync把文件转移出来。结果是令人心碎的。和网络传输相关的命令大多在/usr/bin, /usr/sbin, /usr/local/bin 内,都被我删除了。我尝试了二十分钟,最终确定,是没有任何办法通过命令把文件转移出来了,我甚至连下载工具wget,curl都没有,完全没有办法和外界机器通信。绝望了吧。通信都做不到了啊。连gcc都没有了,我重头写一个程序都办不到啊,办不到啊。你能想象到我的内心是多么绝望。
  我脑子在急速运转,既然不能使用带网络功能的程序,总还有正在运行的网络程序吧,比如nginx,php等。sshd服务不还是在运行着的嘛,这些程序进程也可能正常工作。我netstat,ps了一下,nginx进程果然还在。那还等什么,赶紧放到目录下载下来吧。然而,天公不作美,每当我在本地机器wget 压缩包时,总是被重定向,此路不通。nginx进程已然不行了,僵尸了。排查了一下其他开放的端口及对应程序,没有能借道传输的。我的心,一下在又沉到了谷底。这时,距离愚蠢操作已经过去了一个多小时了。我一筹莫展。我总不能打电话给VPS的工作人员,让他们到机房给这个机器插上U盘吧。唉,手贱啊。终日打鸟竟然被鸟啄了眼。算了,放弃吧。至少还有半年前的备份。搞了一会儿,便带着疲惫的心灵回家了。
  洗澡后,便想着就随便找了几个重要的配置文本文件,cat出来,想在xshell的界面上直接复制出来,也不管乱码问题了,反正是按照一定的编码规则来的,应该可以转回去。cat 出来一个sql文件时,耗费了好久,都不知道是否超过了xshell的记录缓冲区里没有。突然想到,xshell有log功能。赶紧打开,继续cat文件。打开log文件,果然有效,删除部分多余的输出,就是完整的文本文件了。有戏,有戏,我又见到了一丝曙光。既然文本可以,想来二进制的压缩包也能通过这种方式弄下来。log保存的文件,是文本和二进制数据的混合,应该有办法分离的,嗯,应该是有办法的。至少有希望不是嘛。我赶紧重新打开一个xshell tab,以便清空log文件,好接收cat出来的内容。我选择了一个稍大的tar包,微笑着等待,一分钟后我的心又凉了。xshell crash了,如无意外,它下次还会崩的。我的心啊。
  想了一会儿,既然有这个方式,应该也可用在终端中有操作命令的方式来达成这个目的。便google“cat 远程文件, 本地保存输出”,“cat remote server file, save output to local”,竟然真的在stackoverflow中找到了想要的结果:ssh user@ssh-server.com '( cat data.tar.gz )' > latest_data.tar.gz  2>&1。得到的文件大小与源文件基本一致。God! God!God!只要得到了文件,我一定可以以此方式取出所有文件。尝试解压缩一下,失败。没关系,在我预期之内,估计应该是把SSH登录后的输出也写入了,导致了文本与二进制数据混合。下一步就是需要切割文件了。
  尝试了head data.tar.gz,阿勒?竟然全是乱码。尝试二进制输出一下吧。没有规律可循,依然没有头绪。突然想到,每一个文件都由魔法数字起始,hexdump 一个正常的tar.gz文件试试,发现两个正常文件均以 8b1f 0008开头,便在data.tar.gz的hexdump中寻找这个字符串。got it!可行!尝试搜索了一下如何切割二进制文件。得到 dd if=latest_data.tar.gz bs=1  skip=198 of=real_data.tar.gz。尝试了几次才正确计算出来真正文件的其实位置(skip),解压缩成功。此时半夜一点了。为避免夜长梦多,赶紧加紧操作,把所有文件打包,传输出来了并在本地机器验证了。

  第二天总结:1,以后再也不要随便使用root用户,即使再麻烦,也要使用sudo,至少有一个提醒。2,没事儿少在生产环境折腾。少折腾,多读书,做简单的实验。

  

  

如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)