一、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. python-输入列表,求列表元素和(eval输入应用)

    在一行中输入列表,输出列表元素的和. 输入格式: 一行中输入列表. 输出格式: 在一行中输出列表元素的和. 输入样例: [3,8,-5] 输出样例: 6 代码: a = eval(input()) t ...

  2. 【weex开发】weex官方源码

    公司目前使用版本:weex_sdk:0.10.0 介绍地址:https://bintray.com/alibabaweex/maven/weex_sdk/0.18.0 weex最新版本:weex_sd ...

  3. java中Number Type Casting(数字类型强转)的用法

    4.5 Number Type Casting(数字类型强转)隐式 casting(from small to big) byte a = 111; int b = a;显式 casting(from ...

  4. [ThinkPHP]2-Rce buuoj

    [ThinkPHP]2-Rce 进来是这个页面 构造路径. 好,构造正确,但是服务器拦截了对该操作的访问 打开提示网站,看到关键信息 分析正则 老版本的正则可以用 '@'符号表示模式.以下正则是模式e ...

  5. 动态代理-JDK

    代理模式:假设一个场景,你的公司是一位软件公司,你是一位软件工程师,显然客户带着需求不会去找你谈,而是去找商务谈,此时商务就代表公司. 商务的作用:商务可以谈判:也有可能在开发软件之前就谈失败,此时商 ...

  6. QT-图标设置

    记录一下怎么在QT里添加图片,包括exe图标和里面使用的其他图片. 注意这个图片是指ico后缀的图片,去网上搜就有了,一大堆. 随便找的一个在线转换,http://www.bitbug.net/ 新建 ...

  7. ThinkPHP3.2.3反序列化链子分析

    前言 目前官方已经不再维护ThinkPHP3.2.3,本文仅对ThinkPHP3.2.3反序列化链子进行复现,如有纰漏,还望指正. 环境介绍 MAMP pro PhpStorm Xdebug 利用条件 ...

  8. node.js -- 身份认证

    请问昨天结束的早是对堆积在了今天吗,今天还来加个班更博,看在这个毅力的份上能否给亿点点推荐. 有个好消息有个坏消息,先说坏消息吧,就是在这么学下去我急需急支糖浆,来回顾回顾前面的知识,这几天学的太急了 ...

  9. 【Azure 应用服务】Azure Function 启用 Managed Identity后, Powershell Funciton出现 ERROR: ManagedIdentityCredential authentication failed

    问题描述 编写Powershell Function,登录到China Azure并获取Azure AD User信息,但是发现遇见了 [Error] ERROR: ManagedIdentityCr ...

  10. 接口测试框架实战(一) | Requests 与接口请求构造

    1080×388 33.4 KB Requests 是一个优雅而简单的 Python HTTP 库,其实 Python 内置了用于访问网络的资源模块,比如urllib,但是它远不如 Requests ...