LINUX EXT文件系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EXT文件系统研究报告
EXT2 文件系统
The Second Extended File System(ext2)文件系统是Linux系统中的标准文件系统,是通过对Minix的文件系统进行扩展而得到的,其存取文件的性能极好。

在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。

一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被删除。

此外,同一文件在磁盘中存放和被打开时所对应的inode是不同的,并由内核负责同步。

ext2文件系统采用三级间接块来存储数据块指针,并以块(block,默认为1KB)为单位分配空间。

其磁盘分配策略是尽可能将逻辑相邻的文件分配到磁盘上物理相邻的块中,并尽可能将碎片分配给尽量少的文件,以从全局上提高性能。

ext2文件系统将同一目录下的文件(包括目录)尽可能的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。

在扩展文件时,会尽量一次性扩展8个连续块给文件(以预留空间的形式实现)。

一、文件系统特性
磁盘分区完毕后还需要进行格式化,之后操作系统才能够使用这个分区。

这是因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式。

传统的磁盘与文件系统的应用中,一个分区誻只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个分区。

操作系统的文件数据除文件内容外,通常还有非常多的属性,Linux中的文件权限(rxw)与文件属性(所有者,群组、时间参数等)。

文件系统通常会将这两部分数据分别存放在不同的块:
权限与属性放置到inode中.
至于实际数据则放置到data block块中。

另外还有一个超级块(super block)会记录整个文件系统的的整体信息,包括inode 与block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

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

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

由于每个inode与block都有编号,而每个文件都会占用一个inode,inode内则有文件数据放置的block号码。

因此,如果能找到文件的inode的话,那么自然就会知道这个文件所放置数据的block号码,也就能够读出该文件的实际数据。

如图,假设某一个文件的权限与属性数据放置到inode 4号下(小方格)而这个inode记录了文件数据的实际放置点为2,7,13,15这4个block号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一下子将4个block内容读出来。

二、Linux的ext2文件系统
文件系统一开始就将inode与block规划好了,除非重新格式化(或者利用resize2fs等命令更改文件系统大小)否则inode与block固定后就不再变动。

为了方便管理,ext2文件系统在格式化时基本上是区分为多个块组的。

每个块组都有独立的inode/block/super block系统。

如下图所示:
文件系统最前面有一个启动扇区,这个启动扇区可以安装引导装载程序,这样我们就能够将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的MBR,这样也才能制作出多重引导的环境。

*data block:用来放置文件内容的地方,在ext2文件系统中所支持的block的大小有1KB,2KB,4KB,在格式化时大小就固定了,每个block内最多只能放置一个文件的数据,如果文件大于一个block的大小,则一个文件会占用多个block数量,若文件小于block,则该block的剩余空间就不能够再被使用了。

block的大小而产生的ext2文件系统限制如下:
*inode table(inode 表格)
inode记录的文件数据至少有:
1、该文件的访问模式;(rwx)
2、该文件的所有者与组(ower/group);
3、该文件的大小;
4、该文件创建或状态改变的时间(ctime);
5、最近一次读的时间(atime);
6、最近修改的时间(mtime);
7、该文件的特性的标志(flag);
8、该文件真正内容的指向(pointer);
而有这么强大功能的inode的大小均固定为每个128B。

inode除了文件权限属性记录区域外,还有12个直接,1个间接,一个双间接与一个三间接记录区。

12个直接指向号码的对照,这12个记录就能够直接取得block号码,至于所谓的间接就是再拿一个block来当作block号码的记录区,如果文件太大,就会使用间接的block来记录编号。

同理,如果文件持续长大,那么就复用所谓的双间接,第一个仅再指出下一个记录编号的block在哪里,实际记录在第二个block当中。

依此类推,三间接就是复用第三层block来记录编号。

如下图所示:
*Super block:
Super block是非常重要的,因为文件系统的基本信息都写在这里,一个文件系统应该仅有一个super block而已。

它记录的信息主要有:
1、block与inode总量;
2、未使用与已使用的inode、block数量;
3、block与inode的大小;
4、文件系统的挂载时间、最近一次写入数据的时间,最近一次检验磁盘的时间等文件系统的相关信息;
5、一个validbit数值,若此文件系统已挂载,则validbit为0,若未挂载,则validbit 为1;
*File system Description(文件系统描述说明)
这个区段可以描述每个block group的开始与结束的号码,以及说明每个区段分别介于哪一个block号码之间。

可以用dumpe2fs来查看。

*block bitmap(块对照表)
通过block bitmap可以知道哪些block是空的,因此我们的系统就能够很快速地找到可以使用的空间来处置文件。

同样,如果你删除某些文件时,那么那些文件原本占用的block 号码就得要释放出来,此时在block bitmap当中相对应到该block号码的标志就得要修改成为“未使用”。

*inode bitmap(inode对照表)
这个其实与block bitmap 是类似的功能,只是block bitmap 记录的是使用与未使用的block 号码,至于inode bitmap 则是记录使用与未使用的inode 号码。

三、与目录树的关系
每个文件(不管是一般文件还是目录文件)都会占用一个inode ,且可依据文件内容的大小来分配多个block 给该文件使用。

而我们知道目录的内容在记录文件名,一般文件才是实际记录数据内容的地方。

那么目录与文件在Ext2 文件系统当中是如何记录数据的呢?1、目录:在Linux下的ext2文件系统新建一个目录时,ext2会分配一个inode与至少一块block给该目录。

inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。

2、文件:在Linux下的ext2文件系统新建一个文件时,ext2会分配一个inode与相对于该文件大小的block数量给该文件。

例如:假设我的一个block 为4 Kbytes ,而我要创建一个100 KBytes 的文件,那么linux 将分配一个inode 与25 个block 来储存该文件!注意,如果文件太大,block的数量还要加上间接,双间接和三间接指向所指向的block。

3、由上述可知,inode本身并不记录文件名,文件名的记录是在目录的block当中。

当我们要读取某个文件进,就务必会经过目录的inode与block,然后才能够找到那个待读取文件的inode号码,最终才会读到正确的文件的block内的数据。

由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码,此时就能够得到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,再一层层地往下读到正确的文件名。

四、ext3文件系统
为了避免文件系统不一致的情况发生,在文件系统当中规划出一个块,该块专门记录写入或修订文件时的步骤,也就是加入了日志文件系统。

这就是ext3文件系统,它是ext2文件系统的升级版。

如果在我们的filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤,那不就可以简化一致性检查的步骤了?也就是说:
1.预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入
的信息;
2.实际写入:开始写入文件的权限与数据;开始升级metadata 的数据;
3.结束:完成数据与metadata 的升级后,在日志记录区块当中完成该文件的纪录。

在这样的程序当中,万一数据的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块,就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整块filesystem 去检查,这样就可以达到快速修复filesystem 的能力了!
五、Linux 文件系统的运行
我们现在知道了目录树与文件系统的关系了,我们也知道,所有的数据都得要加载到内存后CPU 才能够对该数据进行处理。

想一想,如果你常常编辑一个好大的文件,在编辑的过程中又频繁的要系统来写入到磁盘中,由于磁盘写入的速度要比内存慢很多,因此你会常常耗在等待硬盘的写入/读取上。

真没效率!
为了解决这个效率的问题,因此我们的Linux 使用的方式是透过一个称为异步处理(asynchronously) 的方式。

所谓的异步处理是这样的:
当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被配置为干净(clean)的。

但如果内存中的文件数据被更改过了(例如你用nano 去编辑过这个文件),此时该内存中的数据会被配置为脏的(Dirty)。

此时所有的动作都还在内存中运行,并没有写入到磁盘中!系统会不定时的将内存中配置为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。

你也可以利用 sync命令来手动强迫写入磁盘。

我们知道内存的速度要比硬盘快的多,因此如果能够将常用的文件放置到内存当中,这不就会添加系统性能吗?没错!是有这样的想法!因此我们Linux 系统上面文件系统与内存有非常大的关系喔:
∙系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写;
∙承上,因此Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
∙你可以手动使用sync 来强迫内存中配置为Dirty 的文件回写到磁盘中;
∙若正常关机时,关机命令会主动呼叫sync 来将内存的数据回写入磁盘内;
但若不正常关机(如跳电、死机或其他不明原因),由于数据尚未回写到磁盘内,因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。

六、挂载点的意义
每个文件系统都有独立的inode、block、super block等信息,这个文件系统要能够链接到目录树才能被我们使用。

将文件系统与目录树结合的操作我们称为挂载。

挂载点一定是目录,该目录为进入该文件系统的入口,必须要“挂载”到目录树后,才能够使用该文件系统。

EXT3 文件系统
EXT3 是对EXT2 系统的扩展,它兼容EXT2。

日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。

因此每当系统要关机时,必须将其所有的文件系统全部shutdown 后才能进行关机。

如果在文件系统尚未shutdown 前就关机时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。

然而,此一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。

为了克服此问题,使用所谓“日志式文件系统(Journal File System)” 。

此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。

1)EXT3 日志文件系统特点
a)高可用性
系统使用了EXT3 文件系统后,即使在非正常关机后,系统也不需要检查文件系统。

宕机发生后,恢复EXT3 文件系统的时间只要数十秒钟。

b)数据的完整性
EXT3 文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。

在保证数据完整性方面,EXT3 文件系统有2 种模式可供选择。

其中之一就是“同时保持文件系统及数据的一致性”模式。

采用这种方式,你永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。

c) 文件系统的速度
尽管使用EXT3 文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上
看来,EXT3 比EXT2 的性能还要好一些。

这是因为EXT3 的日志功能对磁盘的驱动器读
写头进行了优化。

所以,文件系统的读写性能较之EXT2 文件系统并来说,性能并没有降低。

d) 数据转换
由EXT2 文件系统转换成EXT3 文件系统非常容易,只要简单地键入两条命令即可完
成整个转换过程,用户不用花时间备份、恢复、格式化分区等。

用一个EXT3 文件系统提供的小工具tune2fs,它可以将EXT2 文件系统轻松转换为EXT3 日志文件系统。

另外,EXT3 文件系统可以不经任何更改,而直接加载成为EXT2 文件系统。

e)多种日志模式
EXT3 有多种日志模式,一种工作模式是对所有的文件数据及metadata(定义文件系
统中数据的数据,即数据的数据)进行日志记录;另一种工作模式则是只对metadata 记录日志,而不对数据进行日志记录。

系统管理人员可以根据系统的实际工作要求,在系统的
工作速度与文件数据的一致性之间作出选择。

2)EXT3 概述
a)EXT3 结构
目录内容:表,树
文件分配:位图(空闲区域),表(元数据)
坏块:表
b) 限制
最大文件大小:16GB –64TB
最大文件数量:可变
最长文件名限制:255 字节
最大卷大小:2TB –32TB
文件名允许的字符数:除NUL 和'/'外的所有字节
c) 功能
记录日期:修改,属性修改,访问
日期范围:1901 年12 月14 日——2038 年1 月18 日
日期分辨率:1 秒
岔流:是
支持操作系统:Linux、BSD、Windows (通过IFS)
d) 反删除
和EXT2 不同,EXT3 会在删除文件时把文件的节点中的块指标清除。

这样做可以在unclean 载入文件系统后,重放日志时,可以减少对文件系统的访问。

但也同样了文件在反删除上面的困难。

用户唯一的补救是在硬盘中捞取数据,并且要知道文件的起始到结束的块指标。

尽管提供了比EXT2 在删除文件上稍微高一些的安全性,却也无可避免的带来了不便之处。

EXT4 文件系统
1)概述
EXT4 是一种针对EXT3 系统的扩展日志式文件系统。

EXT4 是EXT3 的改进版,修改了EXT3 中部分重要的数据结构,而不仅仅像EXT3 对EXT2 那样,只是增加了一个日志功能而已。

EXT4 可以提供更佳的性能和可靠性,还有更为丰富的功能。

2)特点
1)与EXT3 兼容。

执行若干条命令,就能从EXT3 在线迁移到EXT4,而无须重新格式化磁盘
或重新安装系统。

原有EXT3 数据结构照样保留,EXT4 作用于新数据,当然,整个文件系统因此也就获得了EXT4 所支持的更大容量。

2)更大的文件系统和更大的文件。

较之EXT3 目前所支持的最大16TB 文件系统和最大2TB
文件,EXT4 分别支持1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系统,以及16TB 的文件。

3)无限数量的子目录。

EXT3 目前只支持32,000 个子目录,而EXT4 支持无限数量的子目
录。

4)EXTents。

EXT3 采用间接块映射,当操作大文件时,效率极其低下。

比如一个100MB 大
小的文件,在EXT3 中要建立25,600 个数据块(每个数据块大小为4KB)的映射表。


EXT4 引入了现代文件系统中流行的EXTents 概念,每个EXTent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的25,600 个数据块中”,提高了不少效率。

5)多块分配。

当写入数据到EXT3 文件系统中时,EXT3 的数据块分配器每次只能分配一个
4KB 的块,写一个100MB 文件就要调用25,600 次数据块分配器,而EXT4的多块分配器“multiblock allocator”(mballoc)支持一次调用分配多个数据块。

6)延迟分配。

EXT3 的数据块分配策略是尽快分配,而EXT4 和其它现代文件操作系统的策
略是尽可能地延迟分配,直到文件在cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

7)快速fsck。

以前执行fsck 第一步就会很慢,因为它要检查所有的inode,而现在EXT4 给
每个组的inode 表中都添加了一份未使用inode 的列表,今后fsck EXT4文件系统就可以跳过它们而只去检查那些在用的inode 了。

8)日志校验。

日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数
据会导致更多的数据损坏。

EXT4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将EXT3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

9)“无日志”模式。

日志总归有一些开销,EXT4 允许关闭日志,以便某些有特殊需求的
用户可以借此提升性能。

10)在线碎片整理。

尽管延迟分配、多块分配和EXTents 能有效减少文件系统碎片,但碎片
还是不可避免会产生。

EXT4 支持在线碎片整理,并将提供e4defrag 工具进行个别文件或整个文件系统的碎片整理。

11)inode 相关特性。

EXT4 支持更大的inode,较之EXT3 默认的inode 大小128字节,EXT4
为了在inode 中容纳更多的扩展属性(如纳秒时间戳或inode 版本),默认inode 大小为256 字节。

EXT4 还支持快速扩展属性(fast EXTended attributes)和inode 保留(inodes reservation)。

12)持久预分配。

P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所
下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。

EXT4 在文件系统层面实现了持久预分配并提供相应的API,比应用软件自己实现更有效率。

13)默认启用barrier。

磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化
写入性能,因此文件系统必须在日志数据写入磁盘之后才能写commit 记录,若commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。

EXT4 默认启用barrier,只有当barrier 之前的数据全部写入磁盘,才能写barrier 之后的数据。

参考文献:
(1)认识EXT2 文件系统
/ggjucheng/archive/2012/08/22/2651641.html
(2)初窥Linux 之ext2/ext3文件系统
/ljianhui/article/details/8604140
(3)百度百科-- ext2/ext3/ext4文件系统。

相关文档
最新文档