NOW现在行动!
我们应该尽可能避免在生产环境上做一些危险的操作。但是,难免有所疏忽,那么当事情发生后,我们还能如何拯救?
先说故事的背景:上周因为要打包出售一个应用,因此我需要把线上环境(Ubuntu 16.04)的数据打包整理出来。但是一不小心删除了一个数据文件,这下就有点慌了。好在最后有惊无险,我也才有心思在这里写下文章做一些记录。
extundelete
整个补救措施主要依赖了一个工具,叫做extundelete。它的名字其实就很好地表达了它的作用。ext代表的是Linux extended file system,Linux扩展文件系统。在Linux系统里支持很多种文件系统,可以在/proc/filesystem中进行查看。
ext又分为ext2、ext3、ext4,最早的是ext2,最晚的是ext4。ext3区别于前者主要在于其引入了Journal(日志)机制,从2.4.15的内核开始支持,它是从文件系统过渡到日志式文件系统最为简单的一种选择,ext3提供了数据完整性和可用性保证。
Linux内核从2.6.28开始支持ext4,这也是16.04默认的文件系统版本。ext4在兼容ext3的基础上,提供了更好的性能和可靠性。
回到extundelete,它是一个用于恢复ext3或者ext4文件系统中被误删的文件的工具。执行安装命令如下:
sudo apt-get install extundelete
安装好了之后,我就执行操作来演示一下如何使用extundelelte恢复误删的文件。我先在/root/undelete目录里先创建了一个文件test.txt,写入文本内容2020-02-15,然后执行命令删除这个目录:
rm -rf /root/undelete
接下来,使用extundelete来找到它,首先查看一下文件系统根目录的情况,命令如下(关于inode后面会做说明):
sudo extundelete /dev/vda1 --inode 2
执行完了之后,在我的系统上会得到如下图的输出:
可以看到root目录的Inode number是917505,再次执行命令查看root目录下的情况:
sudo extundelete /dev/vda1 --inode 917505
结果输出如下图:
这次的输出中就得到了我们想要的信息,我们可以看到被删除的文件夹undelete的Inode Number是1572902,然后执行命令恢复:
sudo extundelete --restore-inode 1572902 /dev/vda1
这个时候在当前目录下多了一个名为RECOVERED_FILES的目录,进去之后的文件层次结构和系统保持一致,直接查看内容,发现误删的文件被正确恢复了。
Inode
完成恢复操作后,我们来简单说一下背后的原理。整个过程中出现的一个关键字是Inode,我直接粘贴维基百科关于它的解释:
inode(index node)是指在许多“类Unix文件系统”中的一种数据结构,用于描述文件系统对象(包括文件、目录、设备文件、socket、管道, 等等) 维基百科
简单来说它包含了被存储的文件系统对象的元信息,实际上在使用extundelete /dev/vda1 --inode xxx 命令的时候可以看到相关目录的元信息,如创建时间、修改时间等等。
在文件系统中存储被分为了两大类,一个是保存元信息的inode表,每个inode默认是256(ext4)或者128字节。另一类用来保存文件系统对象的内容数据,512个字节一个扇区,8个扇区组成一个4字节的块(block),块是读写的基本单位。
文件系统中每个文件系统对象对应一个inode数据,相应的标识也就是前图里的Inode Number。在文件系统里,由于inode表的位置、总数固定,因此可以直接通过这个号码去索引查找inode表。
如果用通俗一点的说法来解释,也就是Inode上保存了我们真正存放文件内容的数据块的指针。在我们执行rm操作的时候,实际上是把这个指针删除了,而存储块上的内容还没有立刻被清除(这一点似乎和C语言里的free函数很相似)。extundelete通过扫描系统Journal里面的内容,可以推算出被删除的文件的inode信息,从而帮你把文件找了回来。
结语
extundelete虽然可以帮我们挽回损失,但是并不是百分之百的能成功。在误删了文件之后,你应该立刻停止对其文件设备的写操作,以免数据块里的内容真的被重新写入,那样的话就真的没办法恢复了。extundetele的命令很丰富,比如可以支持恢复指定时间段的文件、通过文件目录名直接恢复文件等,之前的恢复命令就可以替换为:
sudo extundelete /dev/vda1 --restore-directory /root/undelete
最后,与其亡羊补牢还不如做好防范措施,比如定时进行快照备份、权限控制等等。
祝大家永远都不要有机会用到extundelete。