【运维安全】文件误删除恢复实战

本文涉及的产品
运维安全中心(堡垒机),企业双擎版|50资产|一周时长
运维安全中心(堡垒机),免费版 6个月
简介: 趁着你对象吃泡面的功夫,我修复了误删除的文件

在这里插入图片描述
@[toc]

前言

如果你一不小心删除了文件,该如何恢复?

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

一. 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 5月  18 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 5月  18 23:19 /dev/sdb
brw-rw----. 1 root disk 8, 17 5月  18 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系统中,由于有默认的备份机制,空文件和空目录是可以恢复的。

写在最后

✨原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
相关文章
|
1月前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible实战应用
【9月更文挑战第33天】本文将带你深入理解Ansible,一个强大的自动化运维工具。我们将从基础概念开始,逐步探索其配置管理、任务调度等功能,并通过实际案例演示其在自动化部署和批量操作中的应用。文章旨在通过浅显易懂的语言和实例,为读者揭开Ansible的神秘面纱,展示其在简化运维工作中的强大能力。
164 64
|
21天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
113 3
|
1月前
|
运维 监控 安全
安全运维:入侵检测与防御实战指南
安全运维:入侵检测与防御实战指南 【10月更文挑战第9天】
110 3
|
2月前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible实战应用
【9月更文挑战第24天】在现代IT基础设施的快速迭代与扩展中,自动化运维成为提升效率、保障稳定性的关键。本文将深入探讨Ansible这一流行的自动化工具,通过实际案例分析其如何简化日常运维任务,优化工作流程,并提高系统的可靠性和安全性。我们将从Ansible的基础概念入手,逐步深入到高级应用技巧,旨在为读者提供一套完整的Ansible应用解决方案。
|
1月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
143 56
|
11天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
33 4
|
13天前
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
22 1
|
29天前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
3月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19356 30
|
1月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
下一篇
无影云桌面