前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rm -rf 误删文件?别急,或许有救!

rm -rf 误删文件?别急,或许有救!

作者头像
100000798482
发布2022-01-25 11:27:05
2.8K0
发布2022-01-25 11:27:05
举报
文章被收录于专栏:一个番茄说一个番茄说

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文件系统中被误删的文件的工具。执行安装命令如下:

代码语言:javascript
复制
sudo apt-get install extundelete

安装好了之后,我就执行操作来演示一下如何使用extundelelte恢复误删的文件。我先在/root/undelete目录里先创建了一个文件test.txt,写入文本内容2020-02-15,然后执行命令删除这个目录:

代码语言:javascript
复制
rm -rf /root/undelete

接下来,使用extundelete来找到它,首先查看一下文件系统根目录的情况,命令如下(关于inode后面会做说明):

代码语言:javascript
复制
sudo extundelete /dev/vda1 --inode 2

执行完了之后,在我的系统上会得到如下图的输出:

可以看到root目录的Inode number是917505,再次执行命令查看root目录下的情况:

代码语言:javascript
复制
sudo extundelete /dev/vda1 --inode 917505

结果输出如下图:

这次的输出中就得到了我们想要的信息,我们可以看到被删除的文件夹undelete的Inode Number是1572902,然后执行命令恢复:

代码语言:javascript
复制
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的命令很丰富,比如可以支持恢复指定时间段的文件、通过文件目录名直接恢复文件等,之前的恢复命令就可以替换为:

代码语言:javascript
复制
sudo extundelete /dev/vda1 --restore-directory /root/undelete

最后,与其亡羊补牢还不如做好防范措施,比如定时进行快照备份、权限控制等等。

祝大家永远都不要有机会用到extundelete。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拍篮球的键盘侠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档