linux文件误删除后文件恢复

it2023-05-26  69

操作前,我们先要了解一下inode与block

一、inode与block概述

block

文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储 512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是 4KB,即连续八个 sector 组成一个 block。 i 节点 文件数据存储在“块”中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做 inode,中文译名为“索引节点”,也叫 i 节点。因此,一个文件必须占用一个 inode,但至少占用一个 block  一个块block(4KB)=8个扇区sector(512B)

inode 包含很多的文件元信息,但不包含文件名

例如: Ø 文件的字节数 Ø 文件拥有者的 UserID Ø 文件的 GroupID Ø 文件的读、写、执行权限 Ø 文件的时间戳 Ø … 使用 stat 命令即可查看某个文件的 inode 信息。 [root@localhost ~]# stat anaconda-ks.cfg Linux 系统文件有三个主要的时间属性 Ø ctime(change time) 是最后一次改变文件或目录(属性)的时间,例如执行 chmod, chown 等命令; Ø atime(access time)是最后一次访问文件或目录的时间; Ø mtime(modify time)是最后一次修改文件或目录(内容)的时间

inode 中并不包括文件名,其实文件名是存放在目录当中的 目录文件的结构如图 

每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件,Linux 系统内部不使用文件名,而使用 inode 号码来识别文件

用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成 Ø 系统找到这个文件名对应的 inode 号码; Ø 通过 inode 号码,获取 inode 信息; Ø 根据 inode 信息,找到文件数据所在的 block,并读出数据。

常见的查看 inode 号码的方式有两种: Ø ls -i 直接查看文件名所对应的 inode 号码; Ø stat 文件名 通过查看文件 inode 信息而查看到 inode 号码。

当用户在 Linux 系统中试图访问一个文件时,系统会先根据文件名去查找它对应的 inode,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的数据 block, 如果没有,就返回 Permission denied。而一块硬盘分区后的结构则是如图 删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录里面的 block 中,删除这个文件的名字 数据被误删后,针对 Linux 下的 EXT 文件系统,可用的恢复工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4 文件系统

在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做是为了避免存在磁盘的数据被其它操作给覆盖了,这样就真的丢失了

extundelete工具恢复EXT类型文件实例

1. 编译安装 extundelete

[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs #依赖包 [root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 #好像下载不了,需要自己去下软件包 [root@localhost ~]# tar -xf extundelete-0.2.4.tar.bz2 [root@localhost ~]# cd extundelete-0.2.4 [root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete&& make && make install [root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/

2. 模拟删除并执行恢复操作

(1)使用 fdisk 命令创建新分区,将其挂载到/tmp 目录下,往该目录下新建一些文件或目录

fdisk 命令创建新分区,将其挂载到/tmp 目录的过程省略了 [root@localhost ~]# mkdir /test/ [root@localhost ~]# mount /dev/sdb1 /test/ [root@localhost ~]# cd /test/ [root@localhost test]# echo a>a [root@localhost test]# echo a>b [root@localhost test]# echo a>c [root@localhost test]# echo a>d [root@localhost test]# ls a b c d lost+found

执行完命令‘extundelete /dev/sdb1”后输入”y“即可查看该文件系统的使用情况 extundelete /dev/sdb1 --inode 2 查看文件系统/dev/sdb1 下存在哪些文件, 具体的使用情况。其中–inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。

(2)模拟误操作并恢复

[root@localhost test]# rm -rf a b [root@localhost test]# ls c d lost+found [root@localhost test]# cd [root@localhost ~]# umount /test/ [root@localhost ~]# extundelete /dev/sdb1 --restore-all 执行完恢复的命令后,在当前目录下会出现一个/RECOVERED_FILES/目录,里面保 存了已经恢复的文件。

extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS 7 系统默认采用 xfs 类型的文件。针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数据备份,以避免数据丢失

XFS类型文件恢复

使用 xfsdump 时,需要注意以下的几个限制:

Ø xfsdump 不支持没有挂载的文件系统备份,所以只能备份已挂载的; Ø xfsdump 必须使用 root 的权限才能操作(涉及文件系统的关系); Ø xfsdump 只能备份 XFS 文件系统; Ø xfsdump 备份下来的数据(档案或储存媒体)只能让 xfsrestore 解析; Ø xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同UUID 的文件系统。

xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复 xfsdump 按照inode 顺序备份一个 xfs 文件系统。 xfsdump 的备份级别有两种: 0 表示完全备份; 1-9 表示增量备份。 xfsdump 的备份级别默认为0。 xfsdump 的命令格式为: xfsdump -f 备份存放位置 要备份路径或设备文件

常用的备份参数包括以下几种:

Ø -f:指定备份文件目录; Ø -L:指定标签 session label; Ø -M:指定设备标签 media label; Ø -s:备份单个文件,-s 后面不能直接跟路径。

例: [root@localhost ~]# yum install -y xfsdump [root@localhost ~]# mkfs.xfs /dev/sdb1 [root@localhost ~]# mkdir /date [root@localhost ~]# mount /dev/sdb1 /date/ [root@localhost ~]# cd /date [root@localhost date]# cp /etc/passwd ./ [root@localhost date]# mkdir test [root@localhost date]# touch test/a [root@localhost date]# tree /date [root@localhost ~]# xfsdump -f /opt/dump_sdb1 /dev/sdb1 #备份整个分区 [root@localhost date]# xfsdump -f /opt/dump_sdb1 /dev/sdb1 … please enter label for this dump session (timeout in 300 sec) -> dump_sdb1 #需要指定备份会话标签 … please enter label for media in drive 0 (timeout in 300 sec) -> sdb1 #需要指定设备标签,就是对要备份的设备做一个描述 media label entered: “sdb1” … xfsdump: Dump Status: SUCCESS [root@localhost date]# xfsdump -I … xfsdump: Dump Status: SUCCESS

删除之前创建的内容,模拟数据丢失

[root@localhost ~]# cd /date/ [root@localhost date]# ls passwd test [root@localhost date]# rm -rf ./* [root@localhost date]# ls

xfsrestore 命令的语法为:xfsrestore -f 恢复文件的位置 存放恢复后文件的路径。 [root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /date/ [root@localhost ~]# ls /date/

最新回复(0)