深入理解Linux系统、恢复误删文件、xfs 类型文件的备份和恢复 小结

一、inode与block详解

崭新的操作系统的文件数据除了实际内容外,还含有非常多的属性。例如 linux操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等),文件系统通常会将这两部分分别存放在inode和block中。

1.1 inode和block概述

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

1.2 inode的内容

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

  • 文件的字节数
  • 文件拥有者的UserID
  • 文件的GroupID
  • 文件的读,写,执行权限
  • 文件的时间戳
    使用stat命令即可查看某个文件的inode信息。
[root@localhost opt]# stat 333
  文件:"333"
  大小:16              块:0          IO 块:4096   目录
设备:fd00h/64768d      Inode:3616        硬链接:2
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2020-06-23 15:48:15.943127893 +0800
最近更改:2020-06-23 15:48:08.621106675 +0800
最近改动:2020-06-23 15:48:08.621106675 +0800
创建时间:-
  • linux 系统有三个主要的时间属性,分别时ctime(change time)、atime(access time)、mtime(modify time)
  • ctime(change time)是最后一次最后改变文件或目录(属性)的时间,例如执行过chmod、chown等命令。
  • atime(access time)是最后一次访问文件或目录的时间。
  • mtime(modity time)是最后一次修改文件或目录(内容)的时间。

1.3 inode的内容

inode并不包括文件名,文件名是存放在目录当中的。linux系统中一切皆文件,因此目录也是一种文件。

文件名1inode号码1
文件名2inode号码2
  • 操作系统用inode号码来识别不同文件,linux内部不适用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的名称。

1.4inode的号码

用户是通过文件名来打开文件,实际上,在系统内部这个过程分成三步:
1、系统找到这个文件名对应的inode号码。
2、通过inode信号,获取inode信息。
3、根据inode信息,找到文件数据所在的block,读出数据。

  • 查看文件对应的inode 用ls -i命令。
[root@localhost opt]# ls -i   ## 查看文件的inode
3616 333
  • 当一个用户在linux系统中访问一个文件时,系统会先根据文件名去查找inode,看用户是否具有访问这个文件的权限,有指出相对应的数据block,没有,则返回 Permission denied 。
  • 一块硬盘分区后的结构如图所示
    在这里插入图片描述

1.5 inode的大小

  • inode也会消耗硬盘空间,每个inode大小,一般是128字节或者256字节。inode的总数,在格式化时就给定。
  • 查看每个硬盘分区的inode总数和已经使用的数量,执行df - i
[root@localhost /]# df -i
文件系统                    Inode 已用(I)   可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 154726400   27012 154699388       1% /
devtmpfs                   479648     378    479270       1% /dev
tmpfs                      482689       1    482688       1% /dev/shm
tmpfs                      482689    1250    481439       1% /run
tmpfs                      482689      16    482673       1% /sys/fs/cgroup
/dev/sr0                        0       0         0        - /mnt
/dev/sda1                  524288     327    523961       1% /boot
tmpfs                      482689       1    482688       1% /run/user/0

二、硬连接与软连接

2.1 硬连接

  • 一般情况下,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。但是Linux系统允许,多个文件名指向同一个inode号码。这表示可以用不同的文件名来访问同样的内容
ln命令可以创建硬链接,命令基本格式
ln 源文件 目标
不能对目录做硬链接
  • 运行此命令后,源文件和目标文件的inode号码相同,都指向同一个inode。inode信息中的“链接数”此时就会增加1
  • 当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名,但删除一个文件名,不会影响另一个文件名的访问,删除一个文件名,就会使得inode信息中的“链接数”减少1.

2.2 软链接

  • 软连接就是创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件名称
    例如,文件A和B的inode号码虽然不一样,但是文件A的内容是文件B的路径,读取文件A时
    系统会自动访问者导向文件B,这时,文件A就称为文件B的‘软连接’或者符号连接
  • 删除原始文件后,软链接无法找到原始文件的文件名,所以会报错。硬链接与原始文件inode相同,所以不影响访问,仍旧可用。
  • 删除一个文件,实际上并不清除inode节点和block的数据,只是在这个文件的父目录里面的block中,删除这个文件的名字Linux是通过link的数量来控制文件的删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。
软链接(符号链接)硬链接
删除原始文件后失效仍旧可用
使用范围适用于文件或目录只可用于文件
保存位置与原始文件可以位于不同的文件系统中必须与原始文件在同一个文件系统(如一个Linux分区)内

三、恢复误删除的文件

  • 删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录 里面的 block 中,

  • 删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候,这个文件才会被删除。 在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情 况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收 站”找回的情况,比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复工具有 debugfs、ext3grep、extundelete 等。

  • 其中 extundelete 是一个开源的 Linux 数据 恢复工具,支持 ext3、ext4 文件系统。

  • 在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的 数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原 因很简单,因为将文件删除后,仅仅是将文件的 inode 节点中的扇区指针清零,实际文件还 存储在磁盘上,如果磁盘继续以读写模式挂载,

  • 这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,
    这些数据就真的丢失了,恢复工具也回 天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数 据成功的比例。
    恢复步骤:

3.1 编译安装extundelete及所需要用到的包

  • 在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel,
  • 这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。
    e2fsprogs-devel 安装依赖于 libcom_err-devel 包。 安装完依赖包之后,即可将提前上传的 extundelete 软件包解压、配置、编译、安装。
[root@localhost /]# yum -y install e2fsprogs-devel e2fsprogs-libs  ## 安装e2fsprogs-devel e2fsprogs-libs两个包
加载插件:fastestmirror
Determining fastest mirrors
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: mirrors.aliyun.com
base                                                     | 3.6 kB     00:00     
extras                                                   | 2.9 kB     00:00     
updates                                                  | 2.9 kB     00:00     
(1/4): updates/7/x86_64/primary_db                         | 2.1 MB   00:00     
(2/4): base/7/x86_64/group_gz                              | 153 kB   00:00     
(3/4): extras/7/x86_64/primary_db                          | 194 kB   00:00     
(4/4): base/7/x86_64/primary_db                            | 6.1 MB   00:01  
·······  省略一部分
[root@localhost /]# yum -y install wget    ## 安装网上下载工具
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 wget.x86_64.0.1.14-18.el7_6.1 将被 安装
--> 解决依赖关系完成
依赖关系解决
·······  省略一部分
## 从网上下载extundelete 安装包
[root@localhost /]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
--2020-06-23 19:45:27--  http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
正在解析主机 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)... 140.110.96.69, 2001:e10:ffff:1f02::17
正在连接 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)|140.110.96.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:108472 (106K) [application/octet-stream]
正在保存至: “extundelete-0.2.4.tar.bz2”

100%[======================================>] 108,472     4.66KB/s 用时 18s    

2020-06-23 19:45:46 (5.88 KB/s) - 已保存 “extundelete-0.2.4.tar.bz2” [108472/108472])

## 下载压缩工具
[root@localhost /]# yum -y install bzip2
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 bzip2.x86_64.0.1.0.6-13.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
·······  省略一部分
## 解压extundelete压缩包到opt目录下
[root@localhost /]# tar xvf extundelete-0.2.4.tar.bz2 -C /opt
extundelete-0.2.4/
extundelete-0.2.4/acinclude.m4
extundelete-0.2.4/missing
extundelete-0.2.4/autogen.sh
extundelete-0.2.4/aclocal.m4
extundelete-0.2.4/configure
extundelete-0.2.4/LICENSE
extundelete-0.2.4/README
extundelete-0.2.4/install-sh
extundelete-0.2.4/config.h.in
extundelete-0.2.4/src/
extundelete-0.2.4/src/extundelete.cc
extundelete-0.2.4/src/block.h
extundelete-0.2.4/src/kernel-jbd.h
extundelete-0.2.4/src/insertionops.cc
extundelete-0.2.4/src/block.c
extundelete-0.2.4/src/cli.cc
extundelete-0.2.4/src/extundelete-priv.h
## 安装 extundelete
[root@localhost opt]# cd extundelete-0.2.4/
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install
Configuring extundelete 0.2.4
Writing generated files to disk
make -s all-recursive
Making all in src
extundelete.cc: 在函数‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’中:
extundelete.cc:1272:29: 警告:在 {} 内将‘search_flags’从‘int’转换为较窄的类型‘ext2_ino_t {aka unsigned int}’ [-Wnarrowing]
    buf, match_name2, priv, 0};
                             ^
Making install in src
  /usr/bin/install -c extundelete '/usr/local/extundelete/bin'
 [root@localhost extundelete-0.2.4]# cd /usr/local/extundelete/bin
[root@localhost bin]# ln -s /usr/local/extundelete/bin/* /usr/sbin/
#####没有make  安装make####
make是gcc的编译器,一定要安装
1、安装:
yum -y install gcc automake autoconf libtool make
[root@localhost /]# yum -y install gcc automake autoconf libtool make
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
.......省略
2、安装g++:
yum install gcc gcc-c++
[root@localhost /]# yum install gcc gcc-c++
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: mirrors.aliyun.com
软件包 gcc-4.8.5-39.el7.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
...省略

在 data文件中创建四个文件a,b,c,d。

[root@localhost ~]# cd /data/
[root@localhost data]# echo a>a && echo a>b && echo a>c  && echo a>d
[root@localhost data]# ls
a  b  c  d

查看该文件系统的使用情况,执行命令‘extundelete /dev/sdb1”后输入”y“即可查看。

3.2 模拟误操作并恢复

  • 使用"rm -rf a b"命令删除/tmp/下的 a 文件和 b 文件,当出现误操作时,
    立刻卸载该文 件系统,然后使用“extundelete /dev/sdb1 --restore-all"
    恢复/dev/sdb1 文件系统下的所有内容。
    模拟误操作
[root@localhost data]# rm -rf a b    ###删除a b 文件
[root@localhost data]# ls
c  d  lost+found
[root@localhost data]# cd               ###切到家目录
[root@localhost ~]# umount /data        ###卸载挂载  防止被新写入的数据被覆盖

恢复数据

[root@localhost ~]# extundelete /dev/sdb1 --restore-all    ###恢复删除的数据
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 160 groups loaded.
Loading journal descriptors ... 18 descriptors loaded.
Searching for recoverable inodes in directory / ... 
2 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost.
[root@localhost ~]# ll
总用量 4
-rw-------. 1 root root 1711 6月  22 08:05 anaconda-ks.cfg
drwxr-xr-x. 2 root root   24 6月  23 22:36 RECOVERED_FILES        ### 恢复的文件存放的目录
[root@localhost ~]# cd RECOVERED_FILES/     ###进入恢复的目录
[root@localhost RECOVERED_FILES]# ll
总用量 8
-rw-r--r--. 1 root root 2 6月  23 22:36 a              ### 恢复的文件 a  和 b
-rw-r--r--. 1 root root 2 6月  23 22:36 b

四、xfs 类型文件备份和恢复

  • extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS 7 系统默认采用 xfs 类型的文件。
    针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数 据备份,以避免数据丢失。
  • xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。若系统中未安装 xfsdump与xfsrestore工具,
  • 可以通过yum install -y xfsdump命令安装。xfsdump 按照inode 顺序备份一个 xfs 文件系统。xfsdump 的备份级别
    有两种:0 表示完全备份;1-9 表示增量 备份。
    xfsdump 的备份级别默认为 0。
  • xfsdump 的命令格式为:xfsdump -f 备份存放位置 要备份路径或设备文件。常用的备份参数包括以下几种:
    -f:指定备份文件目录;
    -L:指定标签 session label;
    -M:指定设备标签 media label;
    -s:备份单个文件,-s 后面不能直接跟路径
    下面通过一个案例来备份恢复 xfs 类型的文件。首先添加一款新硬盘并格式化为 xfs 类 型的文件系统,然后挂在到/date 目录下
[root@localhost /]# mkfs.xfs -f /dev/sdb1  ## 将sdb1 格式化为xfs格式
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=1310656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@localhost /]# mount /dev/sdb1 /data/   ### 挂载
[root@localhost /]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs       295G  1.3G  294G    1% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G   12M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sr0                iso9660   4.3G  4.3G     0  100% /mnt
/dev/sda1               xfs      1014M  146M  869M   15% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/sdb1               xfs        20G   33M   20G    1% /data

准备测试用的文件

[root@localhost /]# cd /data/
[root@localhost data]# cp /etc/passwd ./
[root@localhost data]# mkdir test
[root@localhost data]# touch test/a
[root@localhost data]# yum -y install tree
[root@localhost data]# tree /data
/data
├── passwd
└── test
    └── a

4.1 安装xfsdump


[root@localhost data]# yum install -y xfsdump
[root@localhost data]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 					###指定设备标签,就是对要备份的设备做一个描述
[root@localhost data]# xfsdump -I      ####查看备份内容信息

4.2 模拟数据丢失

[root@localhost data]# ls
passwd  test
[root@localhost data]# rm -rf *
[root@localhost data]# ls

4.3 还原数据

[root@localhost data]# cd    
[root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /data/  ## 用备份在/opt/dump_sdb1里的数据,还原/data/
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: localhost.localdomain
xfsrestore: mount point: /data

[root@localhost ~]#  ls /data/  ## 查看数据还原情况
passwd  test
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值