趁着你对象吃泡面的功夫,我修复了误删除的文件

news2025/1/10 3:26:25

在这里插入图片描述

文章目录

  • 前言
  • 一. linux下文件删除原理
    • 1.1 文件删除原理的简单介绍
    • 1.2 测试inode号是否容易被覆盖?
  • 二. 实验测试过程
    • 2.1 实验环境:
    • 2.2 新增一块硬盘测试
    • 2.3 对磁盘分区
      • 2.3.1 分区(使用fdisk分区)
      • 2.3.2 格式化,创建目录挂载
      • 2.3.3 创建测试文件
      • 2.3.4 删除文件测试
      • 2.3.5 安装工具extundelte
      • 2.3.6 使用工具去恢复数据
  • 写在最后

前言

如果你一不小心删除了文件,该如何恢复? \textcolor{red}{如果你一不小心删除了文件,该如何恢复? } 如果你一不小心删除了文件,该如何恢复?

这句话已经成了面试官口中的高频面试题,作为运维的你,真的知道如何恢复吗?快来跟我一起查缺补漏,通过一个实战案例来实现误删除文件的恢复吧。

一. linux下文件删除原理

1.1 文件删除原理的简单介绍

简单的说,文件系统由文件名,inode,block 三部分组成。

当一个文件要申请inode,首先GDT检索然后跳到inode位图看哪的inode空闲,把stat存到inode,然后开始写文件内容。

如果要删除文件,其实就是将数据块block bit map置0,inodebitmap置0,所以删除很快,而数据内容在磁盘还在相应的数据块。

在inode中并没有文件名这个信息, 因为电脑是根据inode来判断文件的。

那么文件名存放在什么位置呢?

答案是: 存在目录中,根目录的inode默认为2,寻找文件名会从根目录开始:

一般的寻址过程,找到目录的数据块,匹配记录项,文件名,再找到inode编号。

这里有两个通识:

  • 删除文件其实删除的inode
  • inode号一旦释放,若有其他文件申请到了这个刚刚释放的inode号,对应这个inode号位置的数据就会被覆盖。

1.2 测试inode号是否容易被覆盖?

## 创建测试 目录
[root@mufeng71 ~]# mkdir test
# 创建测试文件
[root@mufeng71 ~]# touch a.txt
## 查看文件的inode
[root@mufeng71 ~]# ls -i a.txt
34503763 a.txt
## 删除文件后,再次创建a.txt,看是否还是原来的inode号
[root@mufeng71 ~]# rm -rf a.txt
[root@mufeng71 ~]# touch a.txt
[root@mufeng71 ~]# ls -i a.txt
33803902 a.txt
## 如果第一次与原来不同,可能是正好有缺省的inode,可以再次测试
[root@mufeng71 ~]# rm -rf a.txt
[root@mufeng71 ~]# touch a.txt
[root@mufeng71 ~]# ls -i a.txt
33803902 a.txt
## 这里第二次测试的时候,发现inode和被删除时候的inode一致
[root@mufeng71 ~]# touch b.txt
## 创建一个不同的文件名测试
[root@mufeng71 ~]# ls -i b.txt
33803903 b.txt
[root@mufeng71 ~]# rm -rf b.txt 
[root@mufeng71 ~]# touch b.txt
[root@mufeng71 ~]# ls -i b.txt
33803903 b.txt
##测试创建文件名不同,占用inode是相同的吗?
[root@mufeng71 ~]# rm -rf b.txt 
[root@mufeng71 ~]# touch c.txt
[root@mufeng71 ~]# touch b.txt
[root@mufeng71 ~]# ls -i b.txt
33803903 b.txt
[root@mufeng71 ~]# ls -i c.txt
33803901 c.txt
[root@mufeng71 ~]# rm -rf c.txt
[root@mufeng71 ~]# touch d.txt
[root@mufeng71 ~]# ls -i d.txt
33803901 d.txt
## 可以看到即使文件名不同,inode也有可能相同

根据以上代码测试,我们总结出一个规律:

  • inode的申请是随机的,申请到的必然是空闲的inode
  • inode指向block (真正存放数据的地方)

那我们是否可以通过inode号来恢复数据?

二. 实验测试过程

2.1 实验环境:

[root@mufeng71 ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)

2.2 新增一块硬盘测试

选择硬盘-添加添加,如下图:

image-20220518151437271
创建新的磁盘
image-20220518151527399
指定磁盘容量并设置存储为单个文件
image-20220518151629177

新增磁盘结束之后,开启虚拟机

2.3 对磁盘分区

2.3.1 分区(使用fdisk分区)

[root@mufeng71 ~]# ll /dev/sdb*
brw-rw----. 1 root disk 8, 16 518 23:16 /dev/sdb
[root@mufeng71 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x95ad17d7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

...

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x95ad17d7

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         654     5253223+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@mufeng71 ~]# ll /dev/sdb*
brw-rw----. 1 root disk 8, 16 518 23:19 /dev/sdb
brw-rw----. 1 root disk 8, 17 518 23:19 /dev/sdb1

2.3.2 格式化,创建目录挂载

创建挂载目录

[root@mufeng71 ~]# mkdir /tmp/sdb1

开始格式化

[root@mufeng71 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
328656 inodes, 1313305 blocks
65665 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1346371584
41 block groups
32768 blocks per group, 32768 fragments per group
8016 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

进行目录挂载

挂载目录:
[root@mufeng71 ~]# mount /dev/sdb1 /tmp/sdb1
[root@mufeng71 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        20G  3.5G   15G  20% /
tmpfs           2.2G   72K  2.2G   1% /dev/shm
/dev/sda1       190M   40M  140M  23% /boot
/dev/sdb1       4.9G   11M  4.6G   1% /tmp/sdb1

2.3.3 创建测试文件

[root@mufeng71 ~]# cp /etc/passwd /tmp/sdb1
[root@mufeng71 ~]# cp /etc/hosts /tmp/sdb1
[root@mufeng71 ~]# echo aaa > a.txt
[root@mufeng71 ~]# mkdir -p /tmp/sdb1/a/b/c
[root@mufeng71 ~]# cp a.txt  /tmp/sdb1/a
[root@mufeng71 ~]# cp a.txt  /tmp/sdb1/a/b
[root@mufeng71 ~]# touch !$/kong.txt
touch /tmp/sdb1/a/b/kong.txt
/etc/passwd  

创建完成后查看目录结构:

## 镜像挂载
[root@mufeng71 sdb1]# mount /dev/cdrom /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only

## 安装tree命令
[root@mufeng71 sdb1]# yum install tree*
## 使用tree命令查看
[root@mufeng71 sdb1]# tree
.
├── a
│   ├── a.txt
│   └── b
│       ├── a.txt
│       ├── c
│       └── kong.txt
├── hosts
├── lost+found
└── passwd

4 directories, 5 files

2.3.4 删除文件测试

将文件全部删掉,并查看:

[root@mufeng71 sdb1]# ls
a  hosts  lost+found  passwd
[root@mufeng71 sdb1]# rm -rf ./*

删除文件后,为了防止数据被覆盖掉:
卸载分区,或者设置为只读,我们再此处用卸载分区的方法:

[root@mufeng71 ~]# umount /dev/sdb1
[root@mufeng71 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        20G  3.5G   15G  20% /
tmpfs           2.2G   72K  2.2G   1% /dev/shm
/dev/sda1       190M   40M  140M  23% /boot
/dev/sr0        3.7G  3.7G     0 100% /mnt
[root@mufeng71 ~]# 

2.3.5 安装工具extundelte

使用工具 extundelete进行数据恢复,可以提前下载好,然后用rz命令上传。

若没有rz命令,需要提前使用 yum进行安装

[root@mufeng71 ~]# yum install lr*

安装完成后,执行rz,然后选择你要上传的包即可, 传完后可以在虚拟机查看到此文件:

上传完成:

[root@mufeng71 ~]# ls extundelete-0.2.4.tar.bz2
 extundelete-0.2.4.tar.bz2

安装extundelete

安装环境:
[root@mufeng71 ~]# yum install gcc* 
[root@mufeng71 extundelete-0.2.4]# yum install e2fsprogs-devel

解压并开始进行安装

[root@mufeng71 ~]# tar xf extundelete-0.2.4.tar.bz2 
[root@mufeng71 ~]# cd extundelete-0.2.4

开始编译安装

[root@mufeng71 extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
Writing generated files to disk
[root@mufeng71 extundelete-0.2.4]# make && make install

2.3.6 使用工具去恢复数据

1. 查看之前被删除的文件的inode号


[root@mufeng71 test]# extundelete /dev/sdb1 --inode 2
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 41 groups loaded.
Group: 0
Contents of inode 2:
................

File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11             Deleted
passwd                                            12             Deleted
hosts                                             13             Deleted
a                                                 128257         Deleted
[root@mufeng71 test]# 

2. 通过inode号来恢复

目前inode 12 是passwd文件,我们直接用inode号进行恢复即可:

[root@mufeng71 test]# extundelete /dev/sdb1  --restore-inode 12
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 41 groups loaded.
Loading journal descriptors ... 62 descriptors loaded.
[root@mufeng71 test]# ls
RECOVERED_FILES
[root@mufeng71 test]# cd RECOVERED_FILES/
[root@mufeng71 RECOVERED_FILES]# ls
file.12
## 使用md5测试,发现和源文件一致
[root@mufeng71 RECOVERED_FILES]# md5sum file.12 /etc/passwd
53baee54724c650df260e45099a82100  file.12
53baee54724c650df260e45099a82100  /etc/passwd
[root@mufeng71 RECOVERED_FILES]# 

3. 通过文件名来恢复

[root@mufeng71 RECOVERED_FILES]# extundelete /dev/sdb1  --restore-file passwd
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 41 groups loaded.
Loading journal descriptors ... 62 descriptors loaded.
Successfully restored file passwd
[root@mufeng71 RECOVERED_FILES]# cd RECOVERED_FILES/
[root@mufeng71 RECOVERED_FILES]# ls
passwd
[root@mufeng71 RECOVERED_FILES]# md5sum passwd /etc/passwd
53baee54724c650df260e45099a82100  passwd
53baee54724c650df260e45099a82100  /etc/passwd
[root@mufeng71 RECOVERED_FILES]# 

4. 通过目录名字来恢复

[root@mufeng71 RECOVERED_FILES]# extundelete /dev/sdb1  --restore-directory a
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 41 groups loaded.
Loading journal descriptors ... 62 descriptors loaded.
Searching for recoverable inodes in directory a ... 
8 recoverable inodes found.
Looking through the directory structure for deleted files ... 
4 recoverable inodes still lost.
[root@mufeng71 RECOVERED_FILES]# cd RECOVERED_FILES/
[root@mufeng71 RECOVERED_FILES]# ls
a
[root@mufeng71 RECOVERED_FILES]# tree a
a
├── a.txt
└── b
    └── a.txt

1 directory, 2 files
[root@mufeng71 RECOVERED_FILES]# 

5. 一次性恢复所有文件

[root@mufeng71 RECOVERED_FILES]# extundelete /dev/sdb1  --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 41 groups loaded.
Loading journal descriptors ... 62 descriptors loaded.
Searching for recoverable inodes in directory / ... 
8 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost.
[root@mufeng71 RECOVERED_FILES]# cd RECOVERED_FILES/
[root@mufeng71 RECOVERED_FILES]# ls
a  hosts  passwd
[root@mufeng71 RECOVERED_FILES]# tree
.
├── a
│   ├── a.txt
│   └── b
│       └── a.txt
├── hosts
└── passwd

2 directories, 4 files
[root@mufeng71 RECOVERED_FILES]# 

image-20220518160434915
有没有发现空文件和空目录没有被恢复? 这是因为 在ext4系统中,默认会认为空文件和空目录没有恢复的必要。但在XFS系统中,由于有默认的备份机制,空文件和空目录是可以恢复的。

写在最后

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络化多智能体系统的共识与合作

在所有参与者之间提供快速协议和团队合作的算法通过自组织网络系统实现有效的任务执行。By Reza Olfati-Saber, Member IEEE, J. Alex Fax, and Richard M. Murray, Fellow IEEE小于 翻译摘要:本文提供了一个理论框架,用于分析多智能体网络系统的共识算法…

Linux文件与目录的查看:ls

前言 ls作为我们在Linux系统中最常用的命令,因为我们常常需要去知道文件或是目录的相关信息,但我们Linux的文件所记录的信息实在是太多了,ls也没有需要全部都列出来,所以,当我们执行ls命令时,默认显示的只…

【数据结构】基础:二叉搜索树

【数据结构】基础:二叉搜索树 摘要:本文为二叉树的进阶,主要介绍其概念与基本实现(递归与非递归),再介绍其应用,主要介绍内容为KV模型。最后为简单的性能分析。 文章目录【数据结构】基础&#…

【数据结构】1.1 数据结构的研究内容

文章目录数据结构的研究内容数据结构研究的内容小结数据结构的研究内容 早期,计算机主要用于数值计算: 首先,分析问题、提取操作对象,然后,找出操作对象之间的关系,用数学语言加以描述,建立相应数学方程。…

Java日志门面技术 SLF4J

文章目录背景SLF4J概述切换日志框架实际应用配合自身简单日志实现(slf4j-simple)配置logback日志实现配置Log4J日志实现(需适配器)配置JUL日志实现(需适配器)添加slf4j-nop依赖(日志开关)桥接旧的日志实现框架背景 随着系统开发的进行,可能会更新不同的日志框架&am…

TF数据流图图与TensorBoard

2.1 TF数据流图 学习目标 目标 说明TensorFlow的数据流图结构应用 无内容预览 2.1.1 案例:TensorFlow实现一个加法运算 1 代码2 TensorFlow结构分析2.1.2 数据流图介绍 2.1.1 案例:TensorFlow实现一个加法运算 2.1.1.1 代码 def tensorflow_demo():&…

CMMI对企业有什么价值,如何高效落地?

1、获得权威认证 CMMI是全球性软件与系统工程行业的唯一权威认证,是对企业软件研发与能力服务的认可。 CMMI企业价值 CoCode项目管理全面支持CMMI3-5级高效落地​ 2、降本增效,提高企业能力。 CMMI对软件开发过程进行规范化梳理,保证软…

虚拟机ubuntu系统内存满,无法进入桌面,扩展内存

1、 关闭虚拟机,在虚拟机设置中将原先20GB扩展到30GB 注意:有快照需要删除快照后才能扩展 2、命令行进入ubuntu 内存满了,无法进入Ubuntu图形界面 按下ctrlaltf2~f6组合键 输入用户名和密码进入命令行模式 3、删除一些东西 删除回收站…

vuex的modules和辅助函数

一、回顾:vuex状态管理器1、版本问题:vue2对应的是vuex3;vue3对应的vuex42、vuex作用:每个vuex中都有一个Store(仓库),用于管理vue项目中用到的状态变量(属性)。vuex维护的是一个单一的状态树vu…

工作常用cron总结

一、cron表达式详解 corn从左到右(用空格隔开): 秒 分 小时 日 月 周 (星期中的日期,1代表周日,7代表周六) 年 定时任务统计 数据同步 0 0 10 * * ? 每天上午10点触发…

Spring 整合Mybatis。

目录 一、环境准备 1、Mybatis 环境 2、整合思路分析 二、Spring整合Mybatis 三、Spring整合Junit 一、环境准备 1、Mybatis 环境 ▶ 步骤1 : 准备数据库表 Mybatis是来操作数据库表,所以先创建一个数据库及表 create database spring_db character set utf8; …

LeetCode刷题系列 -- 1008. 前序遍历构造二叉搜索树

给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严…

JVM的理解(垃圾回收算法和类加载过程)

文章目录1、JVM的位置2、JVM的体系结构3、JVM组件3.1、类加载器(加载class文件)3.1.1、类加载器的执行步骤3.2、PC寄存器3.3、方法区3.4、栈3.5、堆4、GC算法4.1、引用计数法4.2、复制算法1、模型2、原理图4.3、标记清除4.4、标记压缩总结:1、…

2023年了学Java还能找到工作么?

Java人才需求缺口巨大 为何还有人找不到工作? 近两年,传统企业开始数字化转型,各企业对互联网IT技术人才呈现井喷趋势。对于进可攻前端、后可守后端的Java程序员而言,市场对他们青睐有加,薪资更是水涨船高。然而在…

Cesium 本地化部署和新增sandcastle案例

源码下载git clone https://gitee.com/mirrors-gis/cesium.gitcd cesium npm install // or yarn install构建 因为下载的源码,还没有构建出cesium的api,以及api对应的文档 ,如果此时直接运行 npm start ,会启动一个8080端口的一个服务,通过 http://localhost:8080 可以看…

SpringCloud Alibaba_Nacos服务注册和配置中心

目录一、Nacos简介1.为什么叫Nacos2.是什么3.能干嘛4.去哪下5.各种注册中心比较二、安装并运行Nacos三、Nacos作为服务注册中心演示1.官网文档2.基于Nacos的服务提供者3.基于Nacos的服务消费者4.服务注册中心对比4.1 Nacos和CAP4.2 Nacos支持AP和CP模式的切换四、Nacos作为服务…

sonar的安装以及使用

sonar的安装以及使用简介1. sonar是什么2. SonarQube与Sonar安装1.下载sonarqubexxx.zip并且解压即可:2.配置数据库3.重启sonarQube会自动建表。使用1.下载sonar-scanner:(这个工具是对源码进行扫描,并将结果保存到数据库以便用上面的sonarqube进行分析)2.配置mysql…

Spring Cloud 以及 Spring Cloud Alibaba 使用总结

title: Spring Cloud 以及 Spring Cloud Alibaba 使用总结 date: 2023-01-13 11:54:15 tags: Spring categories:Spring cover: https://cover.png feature: false 1. 版本对应 官网版本说明:版本说明 alibaba/spring-cloud-alibaba Wiki (github.com) 这里使用 …

通过应用场景深度理解监控宝在业务中的实践价值

近年来,越来越多的企业实现了核心业务系统互联网化,无论是企业内部员工还是企业外部用户或是供应链上下游合作伙伴,均通过互联网和Web应用与企业建立起了紧密的联系。基于此,网络性能对企业业务的影响也变得越来越重要&#xff0c…

阿里云服务器使用docker部署springboot+mysql+redis项目

首先,由于springboot中使用的内置的tomcat,需要讲将ttp转为https的自行搜索博客把: 步骤大概是再阿里云上注册免费SSL证书,下载证书后 拖到项目资源目录下,配置application.properties相关属性 下面引出博客主要内容……