entos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3
ext4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统,是ext3文件系统的后继版本
ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。
ext3目前只支持32000个子目录,而ext4取消了这一限制,理论上支持无限数量的子目录
superblock:记录文件系统的整体信息,包括:inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个 block 。
文件存储在硬盘上,硬盘最小存储单元是“扇区”,每个扇区存储512字节
元信息
元信息是关于信息的信息,用于描述信息的结构、语义、用途和用法等,比如文件的创建者,文件的创建日期,文件的大小等
block(块)
操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)
连续的八个扇区组成一个block,“块”的大小,最长见的是4KB
是文件存取的最小单位
inode(索引节点)
文件数据存储在“块”中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者,文件的创建日期,文件的大小等
这种存储文件元信息的区域就叫做inode,中文译名为(索引节点),也叫i节点
一个文件必须占用一个inode,但至少占用一个block
super block
负责掌控全局,记录着此文件系统的整体信息,,包括inode和block总量,使用剩余量,以及文件系统的格式。
存储内容 | 存储位置 |
---|---|
元信息 | inode |
数据 | block |
inode简介
要理解inode,就先要理解文件的存储方式。我们都知道,文件是存储在硬盘上的。硬盘的最小单位是扇区,每个扇区的大小为512字节。
如果系统在读取硬盘数据的时候按扇区一个一个来读取,那效率就太低了,而是一次连续性读取多个扇区,所以设计者又将多个扇区整合成一个块(block),所以,块就是文件存取的最小单位。一个块的大小为4k。
我们现在已经有了块的概念,文件数据就是存放在块中。但光有数据还是不行啊?为了方便管理文件,我们还需要文件的元信息,比如文件的属性,创建时间,权限,所占的块大小,数量等等。这些信息就是inode信息。所以硬盘在分区的时候会分为两个区域,一个区域存放数据,一个区域存放inode信息。
每一个文件都有一个对应的inode
inode包含很多的文件元信息,但不包括文件名
文件的字节数
文件拥有者的UserID
文件的GroupID
文件的读,写,执行权限
文件的时间戳
使用stat命令即可查看某个文件的inode信息
指针:就是记录数据在哪个块上
[root@localhost ~]# touch 333.txt
[root@localhost ~]# stat 333.txt
文件:"333.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:802h/2050d Inode:50331717 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2019-11-16 21:25:30.259045437 +0800
最近更改:2019-11-16 21:25:30.259045437 +0800
最近改动:2019-11-16 21:25:30.259045437 +0800
创建时间:-
用户通过文件名打开文件时,系统内部的过程
1.系统找到这个文件名对应的inode号码
2.通过inode号码,获取inode信息
3.根据inode信息,找到文件数据所在的block,读出数据
inode号码指向block存储路径
查看inode号码的方法
ls -i命令,查看文件名对应的inode号码
[root@localhost ~]# ls -i
50331717 333.txt 18560747 公共 1790202 图片 50331758 音乐
50331714 anaconda-ks.cfg 1790201 模板 34291860 文档 34291859 桌面
50331724 initial-setup-ks.cfg 18560748 视频 50331757 下载
[root@localhost ~]# ls -i 333.txt
50331717 333.txt
查看文件系统的inode数量信息(总数,已用,可用)
[root@localhost opt]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda2 10485760 117069 10368691 2% /
devtmpfs 229705 372 229333 1% /dev
tmpfs 233378 1 233377 1% /dev/shm
tmpfs 233378 543 232835 1% /run
tmpfs 233378 16 233362 1% /sys/fs/cgroup
/dev/sda5 5241856 141 5241715 1% /home
/dev/sda1 3145728 328 3145400 1% /boot
tmpfs 233378 16 233362 1% /run/user/0
我理解的不一致性就是:
当你想存储一个文件的时候,首先要通过查看superblock表看看有没有位置可以存,如果有的话就直接根据iinode位图和block位图进行写入,那么正常情况下,写完以后,superblock表会自动将此次存储的记录更新在自己的表象中。这是一个正常的情况下,
那么非正常情况呢,也就是产生不一致性的情况
当文件已经通过inode位图和superblock位图进行写入完成后,此时是不是需要更新一下自己的superblock表,在你存数据的过程中,或者说已经存完而又没有更新superblock表,此时停电了(当然只是举个例子),那么怎么办,superblock上没有这个文件的表象,而文件已经写入进去了,那么这个过程就叫文件的不一致性。
表面上,打开文件是通过文件名,实际上要执行下面几个步骤:
1、查找superblock图,看看所查文件的inode号是否存在,如果有的话,将根据inode位图进行查找
2、查找文件的inode编号
3、根据inode编号,找到inode信息
4、根据inode信息找到文件对于所在的block,进行数据的读写。
这里要强调的是,我们日常中删除文件是将inode号删除了,下一次访问的时候就无法找到对应的block,也就无法打开文件了
文件并没有真正的删除,只有覆盖才有可能真正的删除(即新建的文件恰好使用该块存储数据即把原来的数据覆盖了)
编译安装extundelete软件包(只能使用6版本,7无法使用)
安装依赖包
e2fsprogs-libs-1.41.12-18.el6.x86_64.rpm
e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
配置、编译及安装
extundelete-0.2.4.tar.bz2
模拟删除名执行恢复操作
先检查挂载信息,然后安装环境包
实验:
[root@localhost ~]#cd /mnt/Packages
[root@localhost Packages]# df -h //查看镜像文件是否挂载
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 3.1G 16G 17% /
tmpfs 932M 76K 932M 1% /dev/shm
/dev/sda1 5.8G 168M 5.4G 3% /boot
/dev/sda3 9.7G 150M 9.0G 2% /home
/dev/sr0 3.6G 3.6G 0 100% /mnt //挂载在/mnt目录
[root@localhost ~]# cd /mnt/Packages/
[root@localhost Packages]# ls '发现有很多软件包可以安装'
...省略部分内容
zip-3.0-1.el6.x86_64.rpm
zlib-1.2.3-29.el6.i686.rpm
zlib-1.2.3-29.el6.x86_64.rpm
zlib-devel-1.2.3-29.el6.i686.rpm
zlib-devel-1.2.3-29.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm
[root@localhost Packages]# rpm -ivh e2fsprogs-libs-1.41.12-18.el6.x86_64.rpm //安装
[root@localhost Packages]# rpm -ivh e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm //安装
…………省略
pkgconfig(com_err) is needed by e2fsprogs-devel-1.41.12-18.el6.x86_64 (报错,发现要先安装依赖包)
[root@localhost Packages]# rpm -ivh libcom_err-devel-1.41.12-18.el6.x86_64.rpm (安装依赖包)
[root@localhost Packages]# rpm -ivh e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm //安装成功
进行编译安装
[root@localhost Packages]# mount.cifs //192.168.10.124/linux /aaa
Password:
[root@localhost Packages]# ls /aaa //发现extundelete-0.2.4.tar.bz2存在
extundelete-0.2.4.tar.bz2 john-1.8.0.tar.gz
[root@localhost Packages]# cd /aaa (进入111目录)
[root@localhost aaa]# tar jxvf extundelete-0.2.4.tar.bz2 -C /opt //将压缩包解压到opt目录中
..........省略部分信息
[root@localhost aaa]# ls /opt //查看是否解压成功
extundelete-0.2.4 rh
(进行编译安装)
[root@localhost 111]# cd /opt/extundelete-0.2.4/ //进入件文件中查看
[root@localhost extundelete-0.2.4]# ls
acinclude.m4 autogen.sh configure depcomp LICENSE Makefile.in README
aclocal.m4 config.h.in configure.ac install-sh Makefile.am missing src
[root@localhost extundelete-0.2.4]# yum install gcc gcc-c++ -y //安装编译器
[root@localhost extundelete-0.2.4]# ./configure //开始配置
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# make //make编译
make -s all-recursive
Making all in src
extundelete.cc:571: 警告:未使用的参数‘flags’
[root@localhost extundelete-0.2.4]# make install //make install 安装
Making install in src
/usr/bin/install -c extundelete '/usr/local/bin'
新添加磁盘,建立分区、格式化并挂载分区,最后查看信息
[root@localhost extundelete-0.2.4]# df -hT //挂载分区
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 20G 3.2G 16G 18% /
tmpfs tmpfs 932M 76K 932M 1% /dev/shm
/dev/sda1 ext4 5.8G 168M 5.4G 3% /boot
/dev/sda3 ext4 9.7G 150M 9.0G 2% /home
/dev/sr0 iso9660 3.6G 3.6G 0 100% /media/RHEL_6.5 x86_64 Disc 1
/dev/sr0 iso9660 3.6G 3.6G 0 100% /mnt
/dev/sdb1 ext4 20G 172M 19G 1% /aaa
在挂载点创建文件,然后删除文件,同时解挂载,最后尝试恢复
[root@localhost extundelete-0.2.4]# cd /bbb //进入挂载点
[root@localhost 222]# ls
lost+found
[root@localhost 222]# echo a>a //创建文件
[root@localhost 222]# echo a>c
[root@localhost 222]# ls //创建成功
a c lost+found
[root@localhost 222]# cd ~ //返回家目录
[root@localhost ~]# umount /bbb //解挂载
[root@localhost ~]# rm -rf /bbb/a /bbb/c
[root@localhost ~]# umount /bbb (解挂载/bbb)
[root@localhost ~]# extundelete /dev/sdb1 --restore-all //恢复数据
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 160 groups loaded.
Loading journal descriptors ... 29 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 ~]# cd RECOVERED_FILES/ //进入恢复的文件中查找
[root@localhost RECOVERED_FILES]# ls //误删的文件恢复成功
a c
[root@localhost RECOVERED_FILES]# cp a /opt //将文件复制到目标位置
[root@localhost RECOVERED_FILES]# ls /opt
a extundelete-0.2.4 rh
成功恢复
xfsdump命令格式
xfsdump -f 指定创建备份存放的位置 备份存放的路径或设备文件
1
例如:xfsdump -f /opt/xfs_dump /dev/sdb1
xfsdump备份级别(默认为0)
0:完全备份
1~9:增量备份9看,
xfsdump常用选项:-f、-L、-M、-s
xfsrestore命令格式:
xfsrestore -f 备份的文件位置 指定恢复文件的位置
例如: xfsrestore -f /opt/xfs_dump /abc
模拟删除并执行恢复操作
实验:
[root@localhost ~]# fdisk /dev/sdb //添加新磁盘并创建分区
…………省略内容
[root@localhost ~]# mkfs.xfs /dev/sdb1 //格式化
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
…………省略内容
[root@localhost ~]# mkdir /abc //创建目录
[root@localhost ~]# vim /etc/fstab //将sdb1挂载到/abc
[root@localhost ~]# mount -a
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 3.5G 17G 18% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 9.0M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 37M 10G 1% /home
/dev/sda1 xfs 6.0G 174M 5.9G 3% /boot
tmpfs tmpfs 183M 4.0K 183M 1% /run/user/42
tmpfs tmpfs 183M 24K 183M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 xfs 20G 33M 20G 1% /abc //挂载成功
[root@localhost ~]# echo "this is test" > /abc/demo1 //在/abc下创建demo1并输入this is test
[root@localhost ~]# echo "this is test" > /abc/demo2 //在/abc下创建demo2并输入this is test
[root@localhost ~]# cd /abc
[root@localhost abc]# ls
demo1 demo2
[root@localhost abc]# cat demo2
this is test
[root@localhost abc]# mkdir test
[root@localhost abc]# ls
demo1 demo2 test
[root@localhost abc]# echo "1,2,3,4,5,6" > ./test/test1.txt // 在当前目录下的test目录中创建test1.txt并写入内容
[root@localhost abc]# cd test
[root@localhost test]# ls
test1.txt
[root@localhost test]# cat test1.txt
1,2,3,4,5,6
[root@localhost test]# tree /abc/ //查看树
/abc/
├── demo1
├── demo2
└── test
└── test1.txt
1 directory, 3 files
[root@localhost ~]# xfsdump -f /opt/xfs_dump /dev/sdb1 //备份,指定存放在sdb1,/opt/xfs_dump下
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control
============================= dump label dialog ==============================
please enter label for this dump session (timeout in 300 sec)
-> label
media label entered: "label"
--------------------------------- end dialog ---------------------------------
…………省略部分内容
[root@localhost ~]# cd /opt //切换至/opt查看备份成功
[root@localhost opt]# ls
rh xfs_dump
[root@localhost opt]# ls -a xfs_dump
xfs_dump
[root@localhost opt]# cd /abc
[root@localhost abc]# ls
demo1 demo2 test
[root@localhost abc]# rm -rf * //删除/abc下的所有文件及目录
[root@localhost abc]# ls
[root@localhost abc]# xfsrestore -f /opt/xfs_dump /abc //将/opt/xfs_dump的备份内容恢复至/abc中
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control
…………省略中间部分内容
xfsrestore: Restore Status: SUCCESS
[root@localhost abc]# ls //查看内容已恢复
demo1 demo2 test
[root@localhost abc]# cat demo2
this is test
[root@localhost abc]#
xfsdunp使用限制
只能备份已挂载的文件系统
必须使用root的权限才能操作
只能备份XFS文件系统
备份后的数据只能让xfsrestore解析
不能备份两个具有相同UUID的文件系统