linux系统下文件误删除该如何恢复?

一、linux误删除数据的场景

在实际的工作中,朋友们可能会将linux服务器上的文件不小心误删除掉了。而且越是资历老的工程师越容易犯这样的错误,敲代码的速度也是够快,啪啪rm -rf一个回车,然后就是打脸时刻 。新人操作文件时往往战战兢兢、反复确认,反而不容易出错。如果你也是一个有多年工作经验的工程师,也给自己提个醒:淹死的都是会水的。我们需要区分两种场景来进行误删除文件的恢复:

  • 第一种场景:被删除的文件正在被进程使用
  • 第二种场景:文件没有被任何进程使用

第一种场景的数据恢复相对简单一些。

二、场景一数据恢复实验

第一种场景:被删除的文件正在被其他进程使用。我们先创建一个独立目录testdel,用于完成我们的实验。然后使用echo命令创建一个文件test-recovery.txt,放在testdel目录下,文件内容是:"test file delete recovery"。重点来了:我们使用命令tail来一直监听这个文件,表示这个文件一直被tail进程监听占用。

$ mkdir ./testdel;
$ echo "test file delete recovery"  > ./testdel/test-recovery.txt;
$ tail -f ./testdel/test-recovery.txt;

此时我们新打开一个linux终端,完成文件删除操作,文件删除之后使用ls命名在该目录下查看不到任何的文件。

$ rm -fr ./testdel/test-recovery.txt;
$ ls -l ./testdel

下面我们来进行文件的恢复,执行下文中的lsof命令,在其返回结果中我们可以看到test-recovery.txt (deleted)被删除了,但是其存在一个进程tail使用它,tail进程的进程编号是1535。

$ lsof | grep test-recovery.txt;
tail      1535        kafka    3r      REG  253,2        26  34095906 /home/kafka/testdel/test-recovery.txt (deleted)

然后我们使用cd /proc/1535/fd命令进入该进程的文件目录下,1535是tail进程的进程id,这个文件目录里包含了若干该进程正在打开使用的文件。


我们看到文件名为3的文件,就是我们刚刚“误删除”的文件,所以我们使用下面的cp命令把它恢复回去。至此,有进程引用的文件误删除恢复就完成了。

cp ./3 /home/kafka/testdel/test-recovery.txt;

三、场景二数据恢复

对于场景二,没有程序使用该文件,则该文件被删除之后进行文件恢复就稍微麻烦一些了。首先我们要区分当前操作系统挂载的磁盘目录的文件格式,比如:执行cat /etc/fstab得到如下的结果


除了xfs磁盘文件格式,linux常用的还有ext4的磁盘文件格式。每种磁盘文件格式,数据恢复的方式,使用到的工具都是不一样的。鉴于篇幅的问题,我就不在本文中介绍了,请关注我我会继续更新!

四、深入-为什么数据可以恢复?

第一种情况:当某个文件正在被某个程序使用时,linux针对该文件有两个计数器

  • i_count计数器:该文件可能被多个进程使用,每一个进程使用该文件,i_count数值都会加1。反之,进程释放该文件的引用,则该计数器减1
  • i_nlink作用是记录该文件产生的硬链接的次数(在linux种可以使用ln命令创建文件的硬链接)。

当以上两个计数器都为0的时候,该文件实际上就是属于没有进程使用它的状态,就直接被删除掉了。如果有进程使用它,那么该文件的i_count数值不为0,就可以在/proc/<进程id>/fd目录种找回来

第二种情况:此时没有进程使用被删除的文件,被删除的文件的两个计数器i_count和i_link此时都为0。这个时候我们要理解一个概念

https://www.36dianping.com/vs/d73n.html
https://www.36dianping.com/vs/bucm.html
https://www.36dianping.com/vs/d73o.html
https://www.36dianping.com/vs/d73p.html
https://www.36dianping.com/vs/d73q.html
https://www.36dianping.com/vs/d73r.html
https://www.36dianping.com/vs/d73s.html
https://www.36dianping.com/vs/d73t.html
https://www.36dianping.com/vs/d73u.html
https://www.36dianping.com/vs/d73v.html
https://www.36dianping.com/vs/d73w.html
https://www.36dianping.com/vs/d73x.html
https://www.36dianping.com/vs/d73y.html
https://www.36dianping.com/vs/d73z.html
https://www.36dianping.com/vs/d730.html
https://www.36dianping.com/vs/d731.html
https://www.36dianping.com/vs/d732.html
https://www.36dianping.com/vs/d733.html
https://www.36dianping.com/vs/d734.html
https://www.36dianping.com/vs/d735.html
https://www.36dianping.com/vs/d736.html
https://www.36dianping.com/vs/d737.html
https://www.36dianping.com/vs/d738.html
https://www.36dianping.com/vs/d739.html
https://www.36dianping.com/vs/d74a.html
https://www.36dianping.com/vs/d74b.html
https://www.36dianping.com/vs/d74c.html
https://www.36dianping.com/vs/wqg.html
https://www.36dianping.com/vs/d74d.html
https://www.36dianping.com/vs/d74e.html
https://www.36dianping.com/vs/d74f.html
https://www.36dianping.com/vs/d74g.html
https://www.36dianping.com/vs/d74h.html
https://www.36dianping.com/vs/d74i.html
https://www.36dianping.com/vs/d74j.html
https://www.36dianping.com/vs/d74k.html
https://www.36dianping.com/vs/d74l.html
https://www.36dianping.com/vs/d74m.html
https://www.36dianping.com/vs/d74n.html
https://www.36dianping.com/vs/d74o.html
https://www.36dianping.com/vs/d74p.html
https://www.36dianping.com/vs/d74q.html
https://www.36dianping.com/vs/wo2.html
https://www.36dianping.com/vs/d74r.html
https://www.36dianping.com/vs/d74s.html
https://www.36dianping.com/vs/d74t.html
https://www.36dianping.com/vs/d74u.html
https://www.36dianping.com/vs/d74v.html
https://www.36dianping.com/vs/d74w.html
https://www.36dianping.com/vs/d74x.html
https://www.36dianping.com/vs/d74y.html
https://www.36dianping.com/vs/d74z.html
https://www.36dianping.com/vs/d740.html
https://www.36dianping.com/vs/d741.html
https://www.36dianping.com/vs/d70w.html
https://www.36dianping.com/vs/d742.html
https://www.36dianping.com/vs/d743.html
https://www.36dianping.com/vs/d747.html
https://www.36dianping.com/vs/d748.html
https://www.36dianping.com/vs/d749.html
https://www.36dianping.com/vs/d75a.html
https://www.36dianping.com/vs/d75b.html
https://www.36dianping.com/vs/d75c.html
https://www.36dianping.com/vs/d75d.html
https://www.36dianping.com/vs/d75e.html
https://www.36dianping.com/vs/d75f.html
https://www.36dianping.com/vs/d75g.html
https://www.36dianping.com/vs/d75h.html
https://www.36dianping.com/vs/d75i.html
https://www.36dianping.com/vs/d75j.html
https://www.36dianping.com/vs/d75k.html
https://www.36dianping.com/vs/d75l.html
https://www.36dianping.com/vs/d75m.html
https://www.36dianping.com/vs/d75n.html
https://www.36dianping.com/vs/d75o.html
https://www.36dianping.com/vs/d75p.html
https://www.36dianping.com/vs/d75q.html
https://www.36dianping.com/vs/d75r.html
https://www.36dianping.com/vs/d75s.html
https://www.36dianping.com/vs/d75t.html
https://www.36dianping.com/vs/d75u.html
https://www.36dianping.com/vs/d75v.html

  • 操作系统文件删除:操作系统层面的删除文件,只是删除文件的inode信息。删除inode信息之后,该文件对于操作系统及操作系统的用户不可见了。
  • 磁盘文件物理删除:我们知道物理磁盘是由一个个数据块组成的,所以如果想恢复文件,我们需要找到存放文件的数据块block单元,真正在磁盘上存储文件的block暂时并未被删除(准确的说是暂时并未被覆盖)。

需要注意的是:存放数据块block单元的文件内容会一直存在么?答案是否定的,因为该数据块的内容被删除了,所以该数据块是可以被其他进程重新利用写入数据的。所以,当你发现你误删除了非常重要的文件时,你需要做的第一件事就是将磁盘从操作系统中unmout,或者停止所有进程向磁盘中写数据。因为写作数据操作,可能会占用覆盖你"误删除文件"所在数据块,一旦数据块被写的数据写入覆盖,你的数据文件就再也找不回来了。

推荐阅读:《java并发编程》

欢迎关注我的博客,更多精品知识合集

本文转载注明出处(必须带连接,不能只转文字):字母哥博客 - zimug.com

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力!。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 对于误删除文件恢复,可以使用一些工具来进行恢复,比如说TestDisk、PhotoRec等等。这些工具可以扫描硬盘并找回被删除文件,但是需要注意的是,如果文件被覆盖或者硬盘已经受损,那么恢复的成功率会降低。 ### 回答2: 在Linux系统中,当文件误删除时,我们有几种方法可以尝试恢复文件。 首先,我们可以使用一些命令行工具来恢复误删除文件。比如使用“find”命令可以搜索整个文件系统,找到被删除文件的副本。命令如下: ``` $ find / -name "filename" ``` 这将在整个文件系统中搜索名为“filename”的文件,并显示它们的位置。然后可以将文件移动回原来的位置。 第二种方法是使用“grep”命令。它可以在磁盘上搜索二进制数据,找到被删除文件的内容并使用其内容重建文件。命令如下: ``` $ grep -a -B100 -A100 'text in the file' /dev/sda1 > recovered_file ``` 这个命令将在磁盘设备/sda1上搜索包含“file”中内容的二进制数据,并将结果保存到一个名为“recovered_file”的文件中。 第三种方法是使用专业的数据恢复工具。有许多第三方软件可以帮助我们恢复误删除文件,例如TestDisk、PhotoRec等。这些工具通常具有更复杂的功能,可以深入扫描磁盘,寻找被删除文件的各个部分,并尝试将它们重新组装起来。 尽管使用这些方法可以恢复误删除文件,但是成功率并不是百分之百,因为文件删除后,其数据可能已经被覆盖或者损坏。因此,在误删除文件后,应尽快采取措施来尝试恢复文件,以提高成功的机会。此外,为了避免类似问题的发生,我们应该定期备份重要文件,并小心操作。 ### 回答3: 在Linux系统中,当我们误删除文件时,通常可以采取以下方法进行恢复: 1. 使用回收站:某些文件管理器在删除文件时会将其移动到回收站而不是直接永久删除。可以尝试在文件管理器的回收站或垃圾桶中查找并恢复误删除文件。 2. 使用undelete命令:在终端中,可以尝试使用undelete命令来恢复误删除文件。通过在终端输入该命令并指定所需恢复文件路径,系统将尝试从硬盘上恢复删除文件。 3. 使用恢复工具:还可以使用一些专门的恢复工具来恢复误删除文件。例如,extundelete和testdisk是两个常用的Linux文件恢复工具。这些工具可以扫描硬盘并尝试恢复删除文件。 需要注意的是,无论使用哪种方法,都应尽可能在误删除后尽早采取恢复措施。一旦新的文件被写入硬盘上原文件所在的空间,恢复工作就会变得更加困难或者不可能。因此,当发现误删除文件后,尽量避免继续使用该硬盘,以最大限度地提高文件恢复成功率。 此外,为了避免误删除文件,建议定期备份重要的文件。备份可以帮助我们恢复文件,即使出现误操作或其他问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值