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。这个时候我们要理解一个概念
- 操作系统文件删除:操作系统层面的删除文件,只是删除文件的inode信息。删除inode信息之后,该文件对于操作系统及操作系统的用户不可见了。
- 磁盘文件物理删除:我们知道物理磁盘是由一个个数据块组成的,所以如果想恢复文件,我们需要找到存放文件的数据块block单元,真正在磁盘上存储文件的block暂时并未被删除(准确的说是暂时并未被覆盖)。
需要注意的是:存放数据块block单元的文件内容会一直存在么?答案是否定的,因为该数据块的内容被删除了,所以该数据块是可以被其他进程重新利用写入数据的。所以,当你发现你误删除了非常重要的文件时,你需要做的第一件事就是将磁盘从操作系统中unmout,或者停止所有进程向磁盘中写数据。因为写作数据操作,可能会占用覆盖你"误删除文件"所在数据块,一旦数据块被写的数据写入覆盖,你的数据文件就再也找不回来了。
推荐阅读:《java并发编程》
欢迎关注我的博客,更多精品知识合集
本文转载注明出处(必须带连接,不能只转文字):字母哥博客 - zimug.com
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力!。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《kafka修炼之道》
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
linux系统下文件误删除该如何恢复?的更多相关文章
- 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件
PhotoRec – Recover Deleted or Lost Files in Linux 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件 当你在系统中有意或无意地 ...
- Linux系统下文件压缩与打包命令
Linux系统下文件压缩与打包命令 常用的压缩文件拓展名 * .Z * .zip * .gz * .bz2 * .xz * .tar * .tar.gz * .tar.bz2 * .tar.xz 压缩 ...
- Linux 系统下文件夹与文件的读写可执行权限问题
linux是一个多用户操作系统,linux对文件系统内的所有文件,实行了严格的权限划分管理.防止没有权限的用户访问某个文件.linux文件或目录的权限分为 读.写.可执行三种权限.文件访问的用户类别分 ...
- 05 Linux系统下的用户以及用户权限管理(权限管理介绍、用户管理、常见命令介绍)
这一节我们介绍Linux的用户以及权限管理的前半段,包括:1.权限管理介绍: 2.用户管理: 3.常见命令 权限管理介绍 权限管理: 为了访问计算机资源,我们需要对其进行授权才能访问,根据什么东西来进 ...
- linux系统下修改文件夹目录权限
linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...
- Linux系统下远程文件拷贝scp命令
在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...
- linux系统下怎么安装.deb文件
linux系统下怎么安装.deb文件? deb 是 ubuntu .debian 的格式.rpm 是 redhat .fedora .suse 的格式. 他们不通用(虽然可以转换一下). deb是de ...
- linux系统下,递归删除.svn文件
linux系统下,递归删除.svn文件 SVNLinux 进入要删除的目录,执行下面的命令就可以啦. find . -name "*.svn" | xargs rm -rf
- Linux系统下查看某文件修改的时间戳
Linux系统下查看某文件修改的时间戳查看文件时间戳命令:stat awk.txt File: `awk.txt' Size: 20 Blocks: 8 I ...
随机推荐
- 从八道面试题看JavaScript DOM事件机制
As we all know,事件机制其实很简单,无非冒泡和捕获这两点,笔者不再赘述,网上相关文章一大堆,下面让我们直接看面试题 题目一到七,统一设置css .test2 { height: 50px ...
- ES6-11学习笔记--数组的扩展
类数组 / 伪数组 Array.from() Array.of() copyWithin() fill() includes() 类数组.伪数组例子: let divs = document.ge ...
- python-模拟页面调度LRU算法
[题目描述]所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面. 问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LR ...
- 小程序生成海报demo
效果图: <view class='poste_box' id='canvas-container' style="margin:0 auto;border-radius:16rpx; ...
- oracle sqlplus不支持上下键查看历史记录问题
我们需要安装rlwrap软件 系统采样: [root@rac-2 src]# su - oracle Last login: Fri Mar 18 23:36:25 CST 2022 on pts/0 ...
- 修复tunl0-二进制安装calico
这篇博文很重要,出现这个问题导致pod之间无法通讯,pod无法连接外网. 出现的问题是二进制方式安装了节点之后, tunl0没有显示,通过ifconfig tunl0 up 启动tunl0 没有意义, ...
- Centos7 搭建 Socks 服务
Centos7 搭建 Socks 服务 一丶拿到一个动态拨号的服务器还不能使用网络得先打开: pppoe-start 二丶安装命令汇总: 通过yum安装ss5 依赖包: yum install gcc ...
- Codeforces Round #771 (Div. 2), problem: (B) Odd Swap Sort
Problem - B - Codeforces 就是给你个序列, 给他整成升序的, 每次操作可以使相邻两个数交换位置, 交换条件是二数之和为奇数 结果只需输出是否可以整成升序的 思路: 需要奇数偶数 ...
- 认识 vh 和 vw 单位
1. 页面 html 结构 <header> <h1>欢迎来到米修在线</h1> <p>Lorem ipsum dolor sit amet conse ...
- 深入浅出聊Taier—大数据分布式可视化DAG任务调度系统
导读: 上周,袋鼠云数栈全新技术开源规划--DTMO(DTstack Meetup Online)的第一场直播圆满完成.袋鼠云数栈大数据开发专家.Taier项目主导人偷天为大家带来了<Taier ...