搞它!!!深入了解linux文件系统底层原理及日志文件介绍

文章目录

  • 一、linux系统文件系统类型
    • 1、ext家族
    • 2、为什么伴随linux那么久的ext家族凉了呢?xfs文件系统!!
  • 二、简介Linux的ext系列文件系统
    • 1、Linux的ext系列文件系统的构成
    • 2、元信息,inode和block、superblock概述
      • (1)inode包含文件的元信息
      • (2)inode的号码
    • 4、文件的不一致性
  • 三、查看与删除文件的过程
    • 1、查看文件
    • 2、删除文件
  • 四、文件恢复
    • 1、恢复EXT类型的文件
  • 2、 恢复XFS类型的文件

一、linux系统文件系统类型

1、ext家族

entos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3
ext4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统,是ext3文件系统的后继版本
ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。
ext3目前只支持32000个子目录,而ext4取消了这一限制,理论上支持无限数量的子目录

2、为什么伴随linux那么久的ext家族凉了呢?xfs文件系统!!

  • xfs是一种非常优秀的日志文件系统,它是SGI公司设计的。xfs被称为业界最先进的、最具可升级性的文件系统技术
  • xfs是一个64位文件系统,最大支持8EB减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在16TB
    xfs在很多方面确实做的比ext4好,ext4受限制于磁盘结构和兼容问题,可扩展性和scalability确实不如xfs,另外xfs经过很多年发展,各种锁的细化做的也比较好
  • 而且还有一个ext文件系统还有一个让人头疼的事,它格式化的时候是真的慢,他在格式化的时候就将inode和block就已经分好了,而xfs与他的区别在于xfs格式化的时候不分,当数据来了的时候再分发inode和block

二、简介Linux的ext系列文件系统

1、Linux的ext系列文件系统的构成

superblock:记录文件系统的整体信息,包括:inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;

inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;

block:实际记录文件的内容,若文件太大时,会占用多个 block 。

2、元信息,inode和block、superblock概述

搞它!!!深入了解linux文件系统底层原理及日志文件介绍_第1张图片
文件数据包括元信息与实际数据

文件存储在硬盘上,硬盘最小存储单元是“扇区”,每个扇区存储512字节

元信息

元信息是关于信息的信息,用于描述信息的结构、语义、用途和用法等,比如文件的创建者,文件的创建日期,文件的大小等

block(块)

操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)

连续的八个扇区组成一个block,“块”的大小,最长见的是4KB

是文件存取的最小单位

inode(索引节点)

文件数据存储在“块”中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者,文件的创建日期,文件的大小等

这种存储文件元信息的区域就叫做inode,中文译名为(索引节点),也叫i节点

一个文件必须占用一个inode,但至少占用一个block

super block

负责掌控全局,记录着此文件系统的整体信息,,包括inode和block总量,使用剩余量,以及文件系统的格式。

存储内容 存储位置
元信息 inode
数据 block

(1)inode包含文件的元信息

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
创建时间:-

(2)inode的号码

用户通过文件名打开文件时,系统内部的过程

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

4、文件的不一致性

我理解的不一致性就是:
当你想存储一个文件的时候,首先要通过查看superblock表看看有没有位置可以存,如果有的话就直接根据iinode位图和block位图进行写入,那么正常情况下,写完以后,superblock表会自动将此次存储的记录更新在自己的表象中。这是一个正常的情况下,
那么非正常情况呢,也就是产生不一致性的情况
当文件已经通过inode位图和superblock位图进行写入完成后,此时是不是需要更新一下自己的superblock表,在你存数据的过程中,或者说已经存完而又没有更新superblock表,此时停电了(当然只是举个例子),那么怎么办,superblock上没有这个文件的表象,而文件已经写入进去了,那么这个过程就叫文件的不一致性。

三、查看与删除文件的过程

1、查看文件

搞它!!!深入了解linux文件系统底层原理及日志文件介绍_第2张图片
表面上,打开文件是通过文件名,实际上要执行下面几个步骤:
1、查找superblock图,看看所查文件的inode号是否存在,如果有的话,将根据inode位图进行查找
2、查找文件的inode编号
3、根据inode编号,找到inode信息
4、根据inode信息找到文件对于所在的block,进行数据的读写。

2、删除文件

搞它!!!深入了解linux文件系统底层原理及日志文件介绍_第3张图片
这里要强调的是,我们日常中删除文件是将inode号删除了,下一次访问的时候就无法找到对应的block,也就无法打开文件了
文件并没有真正的删除,只有覆盖才有可能真正的删除(即新建的文件恰好使用该块存储数据即把原来的数据覆盖了)

四、文件恢复

1、恢复EXT类型的文件

编译安装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
成功恢复

2、 恢复XFS类型的文件

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的文件系统

你可能感兴趣的:(linux)