更新时间:2022-09-23 09:29
EXT是延伸文件系统(英语:Extended file system,缩写为 ext或 ext1),也译为扩展文件系统,一种文件系统,于1992年4月发表,是为linux核心所做的第一个文件系统。采用Unix文件系统(UFS)的元数据结构,以克服MINIX文件系统性能不佳的问题。它是在linux上,第一个利用虚拟文件系统实现出的文件系统,在linux核心0.96c版中首次加入支持,最大可支持2GB的文件系统
它是专门为Linux设计的,拥有最快的速度和最小的CPU占用率。
Linux作为自由软件,赢得了许多用户,其磁盘分区格式一种是Linux Native主分区,另一种是Linux Swap交换分区,并且主分区和交换分区都采用同一种格式,既Native和Swap格式。
这两种分区格式的安全和稳定性相当好,使用Linux操作系统死机的机会将大大减少。但是,目前支持这类分区格式的操作系统也有Linux和Android。
虽然从Ext2到Ext4,找数据的方式发生了变化,但是,磁盘的布局还是非常相似的。其实这个东西也不需要变化,因为现在也没什么特别巧妙的方式,而且磁盘的吞吐量、效率的瓶颈也不在这里。当然,这里排除那些根据自身文件特点设计的数据库,毕竟还是为了支持通用文件。
Boot在第一个块,放的应该是引导程序,超级块就放在了第二个块上,如果不是可以在mount的时候通过参数sb来设置。对于经常要访问(比较重要)的内容可以在每个块组中都存储(当然这是比较浪费空间的,所有有的只选择在部分),在不同的块组中访问这些内容的时候磁头移动的距离就小了。如果开启了sparse block功能,那么只会在3、5、7的幂级的块组上才冗余这些信息。
在超级块里面保存了这个文件系统的统计信息等,而且从中可以看出这个文件系统的特点。在内存中装载的时候也从超级块开始,知道了磁盘上的布局之后才能顺利的进行后面的操作,ext4_super_block的内容大概如下:
(1)块、inode等统计信息,访问时间等。
(2)块大小、以及每块数目等布局信息。
(3)uid、gid。
(4)特性相关。
(5)预先分配相关。
(6)日志支持相关。
(7)64位的支持,其实保存了需要的高16位。
块组中其实没有保存什么有用的信息(例如超级块),ext4_group_desc的存在就是为了把磁盘分成一个个的块组。那分成块组之后有什么好处呢?试想一下如果没有块组,那么是不是位图这个关键的数据是不是要集中放到磁盘上的一个固定的位置?访问当然是没有问题的,但是不管在磁盘上的什么地方访问的时候都要跑到一个相同的地方去再访问一次位图,这样的代价就比较大了。而且在分配的时候尽量把文件的数据块放在同一个组,那么能在分配阶段就一定程度地避免了碎片。下面是ext4_group_desc中大概的内容(和Ext2中的不同的是对更大范围的支持):
(1)块组中块位图、inode位图、inode表的位置
(2)空闲块(inode)、目录的数目
(3)校验
接下来就是块位图、inode位图了。为什么需要inode位图呢?因为ext4文件系统在要分配一个新的inode的时候并不是像在内存中分配其他数据结构的时候需要的时候分配数据结构占用的空间,而是预先分配好一组放在位图后面,就像一个inode池的感觉。那么在需要ext4_inode的时候就需要知道哪些是空闲的,哪些是用过的,这就是位图的作用了。位图具体就没什么好介绍的了,下面看ext4_inode的内容:
(1)mode、uid、gid等我们能看到的信息
(2)各种时间戳
(3)i_data用来找到数据块
(4)file acl
在对Ext文件系统还什么都不知道的时候应该比较关心从路径名到ino的过程。这个过程的大部分工作量应该在VFS中吧,而且感觉没什么特别的地方。现在查找数据对这部分的内容就忽略不计了。我们关系的是,给定ino&offset,怎么样知道在磁盘上的位置呢?在课本上学到的只是告诉我们这个地方应该是用B树的,但是从Ext2好像没看的B树的影子,反而看到了内存管理中见过的东西:间接块。
间接块管理磁盘上文件的数据块位置和内存中分页的效果有点像,当然细节还是不同的。不过这个地方的坏处就很明显了,如果是访问大文件中的两个顺寻的物理块,那么即使他们物理上也是相邻的(如果内存中没有其缓存的话),也要从第一层的间接块开始访问,直到最后一层才知道真正的块号。在内存中分页当然是问题不大的,但是磁盘上这样高出几倍的访问时间效率会很差。
什么是日志以及日志的作用就不在这里说了。Ext3与Ext2的管理数据块的方式都是差不多的,不同之处是加上了记录日志的功能,可以从Ext2平滑地过渡到Ext3。Ext3日志文件系统的思想就是对文件系统任何的高级操作都分两步进行,首先,把待写入的块的一个副本存放在日志中;其次,当发往日志的I/O数据传送完成时,块就写入文件系统。当发往文件系统的I/O数据传送终止时,日志的块副本就被丢弃。
Ext3既可以只对元数据的修改做日志,也可以记录所有的日志。有下面的三种日志模式:
(1)journal,把所有数据块的改变都记入日志,最安全也最慢。
(2)ordered,只记录元数据的改动,Ext3会把元数据和相关的数据块进行分组,以便把元数据写入磁盘之前写入数据块。
(3)writeback,只记录元数据改动,最快的一种模式。