目录
一、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系统中一切皆文件,因此目录也是一种文件。
文件名1 | inode号码1 |
---|---|
文件名2 | inode号码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