分配 JFS 文件空间
文件空间分配是在操作系统中为数据分配物理存储空间的方法。
内核以逻辑块的形式为文件或目录分配磁盘空间。 JFS 的逻辑块将文件分区或目录内容提交给 4096 字节的单元。 逻辑块不是有形的实体;然而,逻辑块中的数据占用磁盘上的物理存储空间。 每个文件或目录由 0 或多个逻辑块组成。 片段(而不是逻辑块)是 JFS 中分配的磁盘空间的基本单元。
完整逻辑块和部分逻辑块
文件或目录可以包含完整或部分逻辑块。 完整逻辑块包含 4096 字节的数据。 文件或目录的最后一个逻辑块包含的数据少于 4096 字节时,产生部分逻辑块。
例如,8192 字节的文件为两个逻辑块。 前面 4096 字节位于第一个逻辑块中,接下来的 4096 字节位于第二个逻辑块中。 同样,4608 字节的文件由两个逻辑块组成。 然而,最后一个逻辑块是部分逻辑块,包含文件数据的最后 512 字节。 只有文件的最后一个逻辑块才能是部分逻辑块。
分段文件系统中的分配
缺省的分段大小是 4096 字节。 可以在文件系统创建期间使用 mkfs 命令指定更小的片段大小。 允许的片段大小为:512、1024、2048 和 4096 字节。 在文件系统中,只能使用一种分段大小。
为了保持文件系统操作的效率,JFS 为大小为 32 KB 或更大的文件和目录分配 4096 字节的分段空间。 包含 4096 字节磁盘空间的分段被分配给整个逻辑块。 数据被添加到文件或目录时,内核分配磁盘分段来存储逻辑块。 因此,如果文件系统的分段大小为 512 字节,那么完整逻辑块分配有 8 个分段。
内核分配磁盘空间,以使只有数据的最后字节接收到部分块分配。 当部分块增长超过其当前分配的限制时,分配附加的分段。 如果部分块增加到 4096 字节,存储在其分段中的数据重新分配到 4096 文件系统块分配中。 包含少于 4096 字节数据的部分逻辑块被分配最匹配其存储需求的分段数目。
如果数据被添加到代表文件孔的逻辑块,也会发生块重新分配。 文件孔是位于存储数据的最后一个逻辑块之前的空白逻辑块。 (目录内不产生文件孔。) 这些空白逻辑块不分配分段。 然而,当数据被添加到文件孔时,发生分配。 先前没有分配磁盘空间的每个逻辑块被分配 4096 字节的分段空间。
如果文件或目录中间的现有数据被覆盖,那么不需要附加的块分配。 包含现有数据的逻辑块已经被分配分段。
JFS 试图在磁盘上保持文件或目录逻辑块的邻近分配。 保持邻近分配可减少寻道时间,因为可以连续访问文件或目录的数据并在磁盘的相同区域查找。 然而,一个逻辑块的磁盘分段不始终邻近另一个逻辑块的磁盘分段。 邻近分配所需的磁盘空间可能不可用(如果此空间已经被其他文件或目录写入)。 然而,单个逻辑块的分配始终包含邻近的分段。
文件系统使用称为块分配图的位图记录文件系统中每个块的状态。 文件系统需要分配新的分段时,它参考分段分配图来标识哪些分段可用。 同一时间一个分段只能被分配给单个文件或目录。
压缩 JFS 文件系统中的分配
在支持数据压缩的文件系统中,目录被分配磁盘空间。 数据压缩也适用于大小大于其索引节点大小的常规文件和符号链接。
压缩文件系统磁盘空间的分配与分段文件系统中分段的分配相同。 逻辑块在修改时被分配 4096 字节。 此分配保证将有空间存储逻辑块(如果数据不压缩)。 系统需要在逻辑块初始修改时写或存储操作将超出磁盘空间情况报告至内存映射文件中。 修改完成之后,逻辑块在写到磁盘之前被压缩。 然后,仅分配存储压缩的逻辑块所需要的分段数目。
在分段的文件系统中,只有文件(不大于 32 KB)的最后一个逻辑块可以被分配少于 4096 字节。 逻辑块成为部分逻辑块。 在压缩的文件系统中,每个逻辑块可以被分配少于整个块。
逻辑块被写到磁盘之后,不再被视为修改。 每次修改逻辑块,都会根据系统要求再次分配一个完整的磁盘块。 当压缩数据的逻辑块被成功写到磁盘时,发生初始完整块的重新分配。
启用大文件的 JFS 文件系统中的分配
在启用大文件的文件系统中,JFS 为常规文件分配两种大小的分段。 “大”分段 (32 X 4096) 被分配用于 4 MB 边界之后的逻辑块,4096 字节分段被分配用于 4 MB 边界之前的逻辑块。 所有非常规文件分配 4096 字节的分段。 这种几何尺寸允许最大文件大小稍小于 64 GB (68589453312)。
大分段由 32 个邻近的 4096 字节的分段组成。 因为这种要求,建议启用大文件的文件系统中主要是大文件。 存储许多小文件(小于 4 MB 的文件)会导致可用空间分段问题。 这会导致大的分配以 ENOSPC 错误条件而失败,因为文件系统不包含 32 个邻近的磁盘地址。
磁盘地址格式
JFS 片段支持需要分段级别的可寻址能力。 作为结果,磁盘地址具有特殊的格式用于映射逻辑块的分段位于磁盘上的何处。 分段和压缩文件系统使用相同的方法来表示磁盘地址。 磁盘地址包含在 i_rdaddr 中索引节点的字段或间接块中的字段。 单个地址中引用的所有分段在磁盘上必须邻近。
磁盘地址格式由 nfrags 和 addr 字段组成。 这些字段描述地址涵盖的磁盘区域:
- addr
- 指示磁盘上的哪个分段是起始分段
- nfrags
- 指示地址不使用的邻近分段的总数目
例如,如果文件系统的分段大小为 512 字节并且逻辑块被分成 8 个分段,nfrags 值为 3,那么指示地址中包括 5 个分段。
下列实例说明不同磁盘地址的 addr 和 nfrags 字段的可能值。 这些值假定分段大小为 512 字节,指示逻辑块被分成 8 个分段。
addr: 143 nfrags: 7此地址指示数据在磁盘上的起始位置为分段 143。 nfrags 值指示地址中包含的分段总数目为一个。 在分段大小不是 512 字节的文件系统中,nfrags 值有所变化。 要正确读取 nfrags 值,系统或任何检查地址的用户必须知道文件系统的分段大小。
addr: 1117 nfrags: 3这种情况中,地址从磁盘上的分段号 1117 开始并连续 5 个分段(包括起始分段)。 3 个分段保留,如同 nfrags 值所示。
磁盘地址大小为 32 位。 位从 0 到 31 进行编号。 0 位始终被保留。 位 1 到 3 包含 nfrags 字段。 位 4 到 31 包含 addr 字段。
JFS 间接块
JFS 使用间接块来寻址分配给更大文件的磁盘空间。 间接块提供文件大小的最大灵活性和最快的检索时间。 使用磁盘索引节点的 i_rindirect 字段分配间接块。 此字段允许下列几何学或方法用于寻址磁盘空间:
- 直接
- 单一间接
- 双重间接
每一种方法都使用相同的磁盘地址格式作为压缩和分段文件系统。 因为大于 32 KB 的文件被分配 4096 字节的分段,使用单一间接或双重间接方法的地址的 nfrags 字段值为 0。
直接方法
使用磁盘寻址的直接方法时,磁盘索引节点 i_rdaddr 字段中列示的 8 个地址中的每一个均直接指向单个分配的磁盘分段。 使用直接几何学的文件的最大大小为 32768 字节 (32 KB) 或 8 x 4096 字节。 文件需要多于 32 KB 时,间接块被用于寻址文件的磁盘空间。
单一间接方法
i_rindirect 字段包含指向单一间接块或双重间接块的地址。 使用单一间接磁盘寻址方法时,i_rindirect 字段包含间接块(含有 1024 个地址)的地址。 这些地址指向每个分配的磁盘分段。 使用单一间接块几何方法,文件最大可达 4194304 字节 (4 MB),也就是 1024 x 4096 字节。
双重间接方法
双重间接磁盘寻址方法使用 i_rindirect 字段指向双重间接块。 双重间接块包含指向间接块(包含分段分配的指针)的 512 个地址。 在未启用大文件的文件系统中,双重间接几何方法可以使用的最大文件大小为 2147483648 字节 (2 GB),也就是 512 x 1024 x 4096 字节。
(1 * (1024 * 4096)) + (511 * (1024 * 131072))分配给目录的分段分配每个均被分成 512 字节的记录并根据这些记录的分配而增长。
配额
磁盘配额限制任何单个用户或组可以独占的文件系统空间的数量。
- 硬限制
- 允许的最大限制。 进程达到其硬性限制时,请求更多空间失败。
- 软限制
- 应用的限制。 如果进程达到软性限制,一个警告被显示到用户终端。 通常在登录时显示警告。 如果用户在多次登录会话之后无法纠正问题,软性限制会成为硬性限制。
系统警告设计用来鼓励用户留意软性限制。 然而,配额系统允许进程在临时需要更多资源时访问更高的硬性限制。