位置:海鸟网 > IT > linux/Unix >

JFS 文件系统概述及布局分析(二)

JFS内部(潜在)限制

JFS是完全64位的文件系统。所有JFS文件系统结构化字段都是64位大小。这允许JFS同时支持大文件和大分区。

文件系统大小

JFS支持的最小文件系统是16M字节。最大文件系统的大小是文件系统块尺寸和文件系统元数据结构支持的最大块数两者的乘积。JFS将支持最大文件长度是512万亿字节(TB)(块尺寸是512字节)到4千万亿字节(PB)(块尺寸是4K字节)

文件长度

最大文件长度是主机支持的虚拟文件系统最大文件长度。例如:如果主机只支持32位,则这就限制了文件长度。

可移动媒体

JFS不支持把软盘作为基本文件系统设备。

标准管理实用程序

JFS提供创建和维护文件系统的标准管理实用程序。

创建文件系统

这个实用程序提供mkfs命令的JFS特定部分,用来在指定的驱动器上初始化JFS文件系统。该实用程序在较低级别上操作,并假设文件系统所存在的任何卷的创建/初始化由更高级别的另一个实用程序处理。

检查/修复文件系统

这个实用程序提供fsck命令的JFS特定部分。该命令检查文件系统的一致性,修复发现的问题。它也重放日志,把提交的改动应用到文件系统元数据,如果由于日志重放而声明文件系统是干净的,就不会再采取进一步操作。如果文件系统不认为是干净的,这意味着由于某种原因没有完整和正确地重放日志,或者文件系统不能单靠重放日志来恢复到一致状态,那么,就对文件系统执行一遍完整检查。

当执行全部完整性检查时,检查/修复实用程序首要目的是要达到可靠的文件系统状态,以防止将来文件系统崩溃或故障,第二个目的就是面对崩溃时保存数据。这意味着为了达到文件系统的一致性,实用程序可能丢弃数据。具体而言,当实用程序在不做假设的情况下,无法获得所需信息以将结构上不一致的文件或目录恢复到一致状态时,就会废弃数据。当遇到不一致的文件或目录时,就废弃整个文件或目录,而不再试图保存任何部分。任何由删除受损目录所孤立起来的文件或子目录,都放在文件系统根下的lost+found目录中。

文件系统检查/修复实用程序重点考虑的因素之一是所需虚存数量。通常,这些实用程序所需的虚存数量由文件系统的大小决定,这是由于所需虚存主要用于跟踪文件系统中个别块的分配状态。随着文件系统增大,块的数量增多,用来跟踪这些块所需的虚存数量也随之增加。

JFS检查/修复实用程序的设计区别在于其虚存需求由文件系统中文件和目录的数量(而不是由块的数量)所决定。对JFS检查/修复实用程序而言,每个文件或目录的虚存大约为每个文件或目录32字节,或者对于包含百万个文件和目录的文件系统而言,不论其文件系统大小,虚存需求都是大约32兆字节。如同所有其它的文件系统,JFS实用程序需要跟踪块分配状态,但避免使用虚存方法,而是使用位于实际文件系统中的一小块保留工作区来实现。

日志文件系统如何处理磁盘布局

本文描述磁盘日志文件系统(JFS)布局,以及使用磁盘布局结构来实现可扩展性、可靠性和性能的机制。还会了解用来操作这些结构的策略和算法,以及JFS是在哪里使用遍布文件系统的B+树来提高文件系统操作性能。

JFS体系结构可通过其磁盘布局特性的上下文进行说明。磁盘布局是JFS用来控制文件系统的格式。本文讨论盘区的文件几何构造、目录格式、块分配映射表格式、inode和布局结构的其它特性。本文还提供了文件布局使用的B+树数据结构的细节和示例。选择B+树是为了提高读写盘区的性能,这是JFS执行的最普通操作。

分区、聚集、分配组、文件集

分区

JFS文件系统建立在分区上,分区是由FDISK导出到JFS的抽象。

分区有:

固定分区块尺寸,其合法值为512、1024、2048或4096字节。分区块尺寸定义了分区上支持的最小I/O单元。这对应于组成分区的物理设备的基本磁盘扇区大小,最普遍的尺寸是512字节。

大小为:PART_NBlocks,是分区磁盘块数。

分区磁盘块的抽象地址空间[0..PART_NBlocks-1]。

聚集

为了支持DCEDFS(分布式计算环境分布式文件系统),JFS将磁盘空间分配池(称为聚集)的概念,与可安装的文件系统子树(称为文件集)的概念分开。本文中聚集和文件集的术语与其DFS用法一致。每个分区刚好只有一个聚集;每个聚集可能有多个文件集。在第一个发行版中,JFS仅支持每个聚集一个文件集;但是,所有元数据都已设计成适用于所有情况。

聚集有:

在此聚集的开始部分有32K保留区域。

固定的聚集块尺寸,其合法值为512、1024、2048或4096字节,但不小于分区块尺寸。聚集块尺寸定义了聚集上支持的最小空间分配单元。不要把它与分区块尺寸混淆起来,后者定义的是I/O的最小单元。

主聚集超级块和辅助聚集超级块。超级块包含聚集方面的信息,例如:聚集的大小、分配组的大小、聚集块的尺寸等等,辅助聚集超级块是主聚集超级块的直接副本。如果主聚集超级块损坏,则使用辅助聚集超级块。这些超级块位于固定位置。这使得JFS不依赖任何其它信息,就能够找到它们。超级块结构在jfs_superblock.h的structjfs_superblock中定义。

聚集inode表,包含描述聚集范围的控制结构的inode。聚集inode表逻辑上包含一个inode数组。聚集无目录结构;在聚集或文件集名字空间中,任何地方都没有聚集inode。

辅助聚集inode表,包含从聚集inode表复制的inode。由于对任何文件系统信息的查找而言,聚集inode表中的inode都是至关重要的,所以它们每一个在辅助聚集inode表中都有备份。当然,不会复制inode的实际数据,而只是复制可用来查找数据和inode本身的寻址结构。

聚集inode映射表,描述聚集inode表。聚集inode分配映射表包含聚集inode上及其磁盘位置上的分配状态信息。

辅助聚集inode映射表,描述辅助聚集inode表。由于必须复制聚集inode表本身,辅助聚集inode映射表实际上是与聚集inode分配映射表分开的映射结构。

块分配映射表,描述在聚集内分配和释放聚集磁盘块的控制结构。块分配映射表在聚集磁盘块内进行一对一映射。

fsck工作区,它为fsck提供用来跟踪聚集块分配的空间。因为JFS支持超大聚集,所以这一区域是必需的;当fsck运行时,可能没有足够的内存用来跟踪内存中的这些信息。超级块描述了这一区域。每个聚集块需要一位。fsck工作区总是存在于聚集的末端。

内嵌日志为记录聚集中的元数据更改提供了空间。超级块描述了这一区域。内嵌日志总是紧跟fsck工作空间后。

初始情况下,在聚集创建时分配了第一个inode盘区。按需要动态分配和释放其它inode盘区。每个聚集inode描述聚集本身的某些方面,如下:

保留聚集inode0。

聚集inode1,即自身inode,描述包括聚集inode映射表的聚集磁盘块。这是一种循环表示法,因为聚集inode1本身也在自己所描述的文件中。可通过强制规定至少第一个聚集inode盘区要在众所周知的位置,即主聚集超级块后面4K的位置,来处理以上显而易见的循环表示法问题。因此,JFS能轻而易举地找到聚集inode1,从聚集inode1,通过跟随inode1中的B+树,能找到聚集inode表的余下inode。

要复制聚集inode表,JFS还需要找到聚集inode1的副本,以查找所复制表的其余部分。超级块会包含一个盘区描述符,该描述符描述辅助聚集inode表的第一个inode盘区的位置。JFS能够从中找到辅助聚集inode1,以及辅助聚集inode表的余下部分。

聚集inode2描述块分配映射表。

聚集inode3描述安装时的内嵌日志。虽然分配了inode,但无数据存入磁盘。

聚集inode4描述在聚集格式化期间发现的坏块。在块映射表中这些标记成已分配。该inode是数据为坏块的普通文件。