一、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。这个时候我们要理解一个概念

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

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

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

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

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

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

linux系统下文件误删除该如何恢复?的更多相关文章

  1. 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件

    PhotoRec – Recover Deleted or Lost Files in Linux 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件 当你在系统中有意或无意地 ...

  2. Linux系统下文件压缩与打包命令

    Linux系统下文件压缩与打包命令 常用的压缩文件拓展名 * .Z * .zip * .gz * .bz2 * .xz * .tar * .tar.gz * .tar.bz2 * .tar.xz 压缩 ...

  3. Linux 系统下文件夹与文件的读写可执行权限问题

    linux是一个多用户操作系统,linux对文件系统内的所有文件,实行了严格的权限划分管理.防止没有权限的用户访问某个文件.linux文件或目录的权限分为 读.写.可执行三种权限.文件访问的用户类别分 ...

  4. 05 Linux系统下的用户以及用户权限管理(权限管理介绍、用户管理、常见命令介绍)

    这一节我们介绍Linux的用户以及权限管理的前半段,包括:1.权限管理介绍: 2.用户管理: 3.常见命令 权限管理介绍 权限管理: 为了访问计算机资源,我们需要对其进行授权才能访问,根据什么东西来进 ...

  5. linux系统下修改文件夹目录权限

    linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...

  6. Linux系统下远程文件拷贝scp命令

    在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...

  7. linux系统下怎么安装.deb文件

    linux系统下怎么安装.deb文件? deb 是 ubuntu .debian 的格式.rpm 是 redhat .fedora .suse 的格式. 他们不通用(虽然可以转换一下). deb是de ...

  8. linux系统下,递归删除.svn文件

    linux系统下,递归删除.svn文件 SVNLinux 进入要删除的目录,执行下面的命令就可以啦. find . -name "*.svn"  | xargs rm -rf

  9. Linux系统下查看某文件修改的时间戳

    Linux系统下查看某文件修改的时间戳查看文件时间戳命令:stat awk.txt File: `awk.txt' Size: 20              Blocks: 8          I ...

随机推荐

  1. circle_clock 简单canvas实现圆弧时钟

    渣渣成品图:http://codepen.io/thewindswor... 最近对于圆形有种特别的感情呢...因为写了个cricle_process_bar就像到了用来做时钟大概会比较有趣吧,所以就 ...

  2. java中递归的用法和例子

    递归   直接或者间接调用自己, public class Test{    public static void main(String[] args){        int i = 5;    ...

  3. Golang | 测试与性能调优

    Test 我们在日常的工作过程中,自测是不可缺少的,公司还会要求所有的公共方法必须要写单测,在别的语言中,我们如果想要写单测还需要使用到测试框架,但是Go语言中,直接支持测试,并且使用起来非常简单. ...

  4. c++对c的拓展_内联函数

    目的:保持处理宏的高效及安全性 解决的问题:1.c中预处理宏有些难以发现的问题 2.c++ 中预处理不能访问类成员,不能作用类的成员函数 作用:无函数调用时开销,又可像普通函数般进行参数.返回值类型安 ...

  5. Java中的List接口实现类LinkedList

    package collection; import java.util.LinkedList; /* * 1.implement List接口 * 2.底层是一个链表结构:查询慢,增删快 * 注意: ...

  6. SpringMVC-注解@RequestParam

    当请求的参数名称与Controller的业务方法不一致时,就需要通过@RequestParam注解进行显示的绑定 1.value:映射参数 @RequestMapping("/report1 ...

  7. jquery版本的ajax请求

    首先引入 <script src="https://code.jquery.com/jquery-3.6.0.js"></script>   $ 和 jqu ...

  8. 百度飞桨数据处理 API 数据格式 HWC CHW 和 PIL 图像处理之间的关系

    使用百度飞桨 API 例如:Resize Normalize,处理数据的时候. Resize:如果输入的图像是 PIL 读取的图像这个数据格式是 HWC ,Resize 就需要 HWC 格式的数据. ...

  9. 最新MATLAB R2021b超详细安装教程(附完整安装文件)

    摘要:本文详细介绍Matlab R2021b的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用. ...

  10. k8s入门之namespace(三)

    namespace的作用就是用来隔离资源,将同一集群中的资源划分为相互隔离的组.同一名称空间内的资源名称要唯一,但不同名称空间时没有这个要求.有些k8s资源对象与名称空间没有关系,例如 Storage ...