系统运维数据存储知识-系统数据误删除恢复

操作系统数据误删除恢复方法

在任何企业环境中,系统中所存储的数据信息都是至关重要,因此如果不小心删除了重要文件,轻则会给系统服务运行带来影响,重则会给整个公司企业带来重大的经济损失,所以在删除文件数据时必须谨慎的操作。但是,正所谓常在河边走,哪有不湿鞋的,有时候墨菲定律就是常出现在我们的生活中,越不想发生的事,越可能出现。在应对数据不小心误删除情况时,类似于windows系统误删了文件,可以使用一些软件进行恢复操作。同样,Linux也是有几款软件可以做到误删除软件之后的数据恢复,本文就给大家介绍几种亲测有效的数据误删除恢复方式。

注意事项:
虽然有软件可以对误删的数据进行恢复,但是完全恢复数据的概率并不是百分百的。因此,使用rm命令删除文件的时候,建议大家做好以下几点。
· 重要的数据在进行编辑修改时,一定要有备份数据信息;
· 在无用数据文件信息进行删除操作时,建议可以先放入临时目录几天,系统服务运行无影响后再删除清理磁盘空间;
· 一旦误操作删除数据时,恢复删除的数据前,删除文件的目录内不能往进存放新东西,否则覆盖掉的信息无法找回

1. 利用Linux系统软件恢复数据-lsof

lsof(list open files)是一个查看进程打开的文件的工具。在linux系统中一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。

1.1 恢复数据原理介绍

这个命令实际上并不能直接用来恢复文件,不过它可以列出被各种进程打开的文件信息。配合其他命令,从/proc目录下的信息中恢复已删除的文件,但能恢复的文件必须是被进程调用打开的状态。

/proc目录是挂载的是在内存中所映射的一块区域,当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。因此,当我们对文件进行读取或写入时(即有进程正使用文件时),哪怕硬盘中的该文件已删除,还可以从内存中的信息恢复文件。

注意事项:
· 必须以root 用户的权限运行, 因为lsof需要访问核心内存和各种文件;
· 只能恢复“文件已删除,但进程仍保持打开该文件的状态”的文件;
· 如果误删了目录,目录中的其他文件未被进程打开,没有进行使用的文件将无法使用此方法恢复

1.2 命令操作输出信息

[root@web01 ~]# lsof |head -n10
COMMAND     PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1         root  cwd       DIR                8,3      4096         64 /
systemd       1         root  rtd       DIR                8,3      4096         64 /
systemd       1         root  txt       REG                8,3   1612152   34018594 /usr/lib/systemd/systemd
systemd       1         root  mem       REG                8,3     20064      45721 /usr/lib64/libuuid.so.1.3.0
systemd       1         root  mem       REG                8,3    265600      48715 /usr/lib64/libblkid.so.1.1.0
systemd       1         root  mem       REG                8,3     90248     747862 /usr/lib64/libz.so.1.2.7
systemd       1         root  mem       REG                8,3    157424      48741 /usr/lib64/liblzma.so.5.2.2
systemd       1         root  mem       REG                8,3     23968      49064 /usr/lib64/libcap-ng.so.0.0.0
systemd       1         root  mem       REG                8,3     19896      48599 /usr/lib64/libattr.so.1.1.0

以上命令输出信息,各列代表含义解释说明:

编号信息 各列信息 含义解释
COMMAND 服务进程名称信息
PID 服务进程PID编号信息
TID 服务线程TID编号信息
USER 服务进程管理者用户信息
FD 用来识别该文件,文件描述符信息
TYPE 用来识别该文件所属类型
DEVICE 指定设备存储编号信息
SIZE 指定文件的大小信息
NODE 索引节点信息,文件在磁盘上的标识
NAME 具体打开文件的路径和确切名称
此命令长使用参数介绍:
编号信息 参数信息 参数解释
---- ---- ----
-c 显示某进程现在打开的文件
-p 显示哪些文件被某pid进程打开
-g 显示归属某pgid的进程情况
-d 显示目录下被进程开启的文件
-i 显示打开指定端口的进程

1.3 系统恢复文件操作

环境准备阶段:

准备恢复数据的环境,在/test/目录创建一个文件oldboy.txt,其中一个远程连接会话窗口在编辑查看此文件,然后另一个终端将其删除

A窗口ssh连接会话中,准备出要准备删除的数据信息,并同时查看打开文件

[root@web01 ~]# mkdir /test/
  在 /var/spool/mail/root 中有邮件
[root@web01 ~]# touch /test/oldboy.txt
[root@web01 ~]# echo oldboyedu.com >/test/oldboy.txt
[root@web01 ~]# less /test/oldboy.txt
oldboyedu.com
/test/oldboy.txt (END)

B窗口ssh连接会话中,查看被加载的文件进程信息

[root@web01 ~]# lsof -c less
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
---部分无关信息省略---
less    28025 root    4r   REG    8,3        14  68076441 /test/oldboy.txt

将打开文件进行删除,查看打开文件状态信息,发现进程加载的文件显示deleted信息,目录下已经不存在被删除的文件数据

[root@web01 ~]# rm -f /test/oldboy.txt 
[root@web01 ~]# lsof -c less
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
---部分无关信息省略---
less    28025 root    4r   REG    8,3        14  68076441 /test/oldboy.txt (deleted)
[root@web01 ~]# ll /test
总用量 0

数据恢复阶段:

切换到/proc下,删除文件对应的进程的pid下的文件描述符中的目录中;将对应的内容重定向或cp到其他文件中,重点关注:PID与FD。

[root@web01 fd]# cd /proc/28025/fd/
[root@web01 fd]# cat 4
oldboyedu.com
[root@web01 fd]# ll
总用量 0
lrwx------. 1 root root 64 9月  28 22:03 0 -> /dev/pts/1
lrwx------. 1 root root 64 9月  28 22:03 1 -> /dev/pts/1
lrwx------. 1 root root 64 9月  28 22:03 2 -> /dev/pts/1
lr-x------. 1 root root 64 9月  28 22:03 3 -> /dev/tty
lr-x------. 1 root root 64 9月  28 22:03 4 -> /test/oldboy.txt (deleted)
[root@web01 fd]# cat 4
oldboyedu.com
[root@web01 fd]# cat 4 >/test/oldboy.txt_recovery
[root@web01 fd]# cat /test/oldboy.txt_recovery 
oldboyedu.com

至此,丢失数据信息恢复完毕

2. 利用Linux系统软件恢复数据-extundelete

Extundelete是在Linux下,基于开源的数据恢复工具。使用阿里云的云服务器ECS,您可以方便地安装,及时还原误删除的重要文件。

2.1 恢复数据原理介绍

extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息,来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。相比于另一种ext3grep数据恢复软件只能恢复ext3文件系统的文件,其适用范围更广,恢复速度更快。

2.2 软件部署安装过程

软件安装环境准备

软件名称 部署信息 链接地址
extundelete 官方网站地址 http://extundelete.sourceforge.net/
extundelete 程序下载地址 https://jaist.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
最新版本的extundelete是0.2.4,于2013年1月发布,暂时未有更新版本
上表中是软件程序的获取方式,可以提前进行下载保存。

注意事项:

· 在数据删除之后,要卸载被删除数据所在的磁盘或是分区

· 如果是系统根分区遭到误删除,就要进入单用户模式,将根分区以只读的方式挂载,尽可能避免数据被覆盖

· 数据被覆盖后无法找回

· 恢复仍有一定的机率失败,平时应对重要数据作备份,小心使用rm

软件安装部署过程

解决软件安装依赖关系:

# centos安装操作
yum install -y e2fsprogs-devel e2fsprogs* gcc*

# ubuntu安装操作
apt-get install build-essential  e2fslibs-dev  e2fslibs-dev

软件编译安装部署过程:

wget https://jaist.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar xf  extundelete-0.2.4.tar.bz2
cd  extundelete-0.2.4
./configure
make
make install

2.3 系统恢复文件操作

执行extundelete命令的当前目录必须是可写的.

查看要恢复文件的分区挂载情况与文件系统类型:

[root@web01 ~]# df -Th
文件系统       类型      容量  已用  可用 已用% 挂载点
---部分无关信息省略---
/dev/sdb1      ext4      9.8G   37M  9.2G    1% /mnt

在指定分区挂载目录中创建数据信息,并删除:

[root@web01 ~]# cd /mnt
[root@web01 mnt]# mkdir test
[root@web01 mnt]# echo oldboyedu.com >test/oldboy.txt
[root@web01 mnt]# cat test/oldboy.txt
oldboyedu.com
[root@web01 mnt]# rm -rf test/
[root@web01 mnt]# echo oldboyedu.com >oldboy.txt
[root@web01 mnt]# rm -f oldboy.txt

将要恢复文件的分区进行卸载操作:

[root@web01 ~]# umount /mnt

查看可以恢复的数据

# 指定误删除文件的分区进行查找,最后一列标记为delete的文件,即为删除了的文件
File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11
test                                              393217         Deleted
oldboy01.txt                                      12             Deleted

恢复单个目录

# 指定要恢复的目录名,如果是空目录则不会恢复
extundelete /dev/vdb1 --restore-directory  test

当执行恢复文件的命令后,会在执行命令的当前的目录下生成RECOVERED_FILES目录,恢复的文件都会放入此目录中。如未生成目录即为失败。
恢复单个文件

# 指定要恢复的文件名,如果几k大小的小文件,有很大几率恢复失败
extundelete /dev/vdb1 --restore-file oldboy01.txt

恢复全部删除的文件

# 无需指定文件名或目录名,恢复全部删除的数据
extundelete /dev/vdb1 --restore-all
posted @ 2020-09-28 15:19  aiweiwei24  阅读(475)  评论(0编辑  收藏  举报