科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道JFS布局:日志文件系统如何处理磁盘布局

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文描述磁盘日志文件系统(JFS)布局,以及使用磁盘布局结构来实现可扩展性、可靠性和性能的机制。

作者:Steve Best 来源:51CTO.com 2008年7月7日

关键字: 数据安全 数据保护

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共6页)

1041377 字节的稀疏文件: 考虑经由以下 POSIX 风格的操作而创建的文件:


fd = create ("newfile", blah blah blah);
write (fd, "hi", 2);

lseek (fd, 1041374, 0);
write (fd, " bye" , 3);

该文件有以逻辑字节偏移量 0 开始的两字节数据("hi"),还有以逻辑字节偏移量 1,041,374 开始的三字节数据 ("bye"),并且在这两者之间全为 0(稀疏的)。文件的长度为 1041377 字节。

通常,JFS 不分配物理磁盘空间以保存从不写入文件的字节范围。因此,将占用两个 xad 结构来表示该文件:一个为包含 "hi" 数据的盘区,一个为包含 "bye" 数据的盘区:


xad #0 :
flag        这里不讨论
offset      0                   /* the beginning of the file  */
length      1                   /* 1 1KB aggregate blocks     */
address     xxxxx               /* aggregate block #          */

xad #1:
flag        这里不讨论
offset      1016                /* the beginning of the file  */
length      1                   /* 1 1KB aggregate blocks     */
address     yyyyy               /* aggregate block            */

在该例中,第一个盘区(xad 0)包含字节 "hi",紧接着是 1022 字节 0。最后一个盘区(xad 1)包含 990 字节 0,紧接着是 3 字节 "bye"。1KB 盘区中剩余的 31 字节不是文件的组成部分。(它们与第一个例子中丢失成为内部存储碎片的 31 个字节相同)。

请注意,该例中, xad_offset 字段是必需的;这是知道 xad 1 表示文件内在无法预料的逻辑偏移量字节序列的唯一方法(也即,xad 1 的偏移量不等于 xad 0 的偏移量加长度)。这是表示稀疏文件的方法。

inode 的 di_size 字段包含写入的最后一个字节偏移值加 1。

连续分配的 16GB 的文件: xad 结构中的长度字段仅有 24 位长:因此,它能包含的最大值是 2(24)-1。如果聚集块大小是 1KB(例如),那么一个 xad 能够表示的最大盘区是(2(24)-1)*2(10)=1KB,小于 16G。暗示这也是 xad 结构能够表示的最大盘区。因此,如果文件够大的话,就算它在磁盘上是相连的,也需要多个 xad 结构来表示它。本例中显示了这样一个连续分配的文件:一个 16G 文件,它从聚集块号 12345 开始连续分配,获取 16777216 个 1KB 的聚集块(16G)。


xad #0 :
flag        这里不讨论
offset      0                   /* the beginning of the file  */
length      16777215            /* 1 1KB aggregate blocks     */
address     12345               /* aggregate block            */

xad #1:
flag        这里不讨论
offset      16777215            /* the beginning of the file  */
length      1                   /* 1 1KB aggregate blocks     */
address     16789560            /* aggregate block #          */

在该例中,不论文件在磁盘上是否相连,要表示它至少需要两个 xad 结构,这是由于单个盘区的长度限制。

块分配映射表

块分配映射表用来为整个聚集跟踪分配或释放的磁盘块。由于聚集内所有的文件集共享相同的磁盘块池,在分配或释放磁盘块时,聚集内所有的文件集可使用该分配映射表。

块分配映射表本身是聚集 inode 2 描述的文件。当初始创建聚集时,分配包括聚集空间的映射表数据块。映射表将随着聚集的扩充或紧缩而相应动态地增大或缩小。

块分配映射表跟踪是否每个个别的聚集块被分配还是释放。

图 5 显示由块映射表 inode 索引的映射表的逻辑和物理结构。映射表的每页长度为 4K。映射表包含三种类型的页:bmap 控制页、dmap 控制页和 dmap 页。

每个 dmap 包含表示每个聚集块的一位。第 i 位表示第 i 个逻辑聚集块的分配状态。它由 struct dmap_t 的 jfs_dmap.h 文件定义。每个 dmap 页包括 8K 的聚集块。

因为块分配映射表可能有许多 dmap 页,它们由 dmap 控制页组织,LN 在图 5 中。这些页改进了查找空闲块的大盘区的性能。聚集的大小将决定需要多少页和多少层。至多有三层,它允许的聚集块的最大尺寸是 2(43)。如果不是所有层都需要,块映射表 inode 是每个没有使用层的第一页有“洞”的稀疏文件。

JFS 使用提交策略确保控制数据可靠更新。可靠更新意味着一旦系统出错时,要维持一致的 JFS 结构和资源分配状态。为了保证块分配映射表是一致状态,JFS 维护 dmap 结构中的两张映射表,工作映射表和持续映射表。工作映射表记录当前分配状态。持续映射表记录提交的分配状态,由磁盘上找到的或 JFS 日志或提交的 JFS 事务内的记录描述的分配状态组成。当释放聚集块时,首先更新永久映射表。当分配聚集块时,首先更新工作映射表。位值为 0 表示空闲资源,值为 1 表示已分配资源。

块分配映射表的 dmap 控制页包含与 dmap 结构中树相似的树,除叶层包含 1024 个元素外。dmap 控制页由 struct dmapctl_t 定义。可在 jfs_dmap.h.文件中找到它。

图 6 从一个 dmap 结构显示树字段的细节。要注意,dmap 结构中的这一字段是一个平面数组,但它表示图中显示的树。树跟踪除最底层之外的每层上连续块的最大号。树的最底层,从树 [85] 到树 [341],包含下面描述的工作映射表的二进制搭档表示法。树的其它层包含来自下一较低层的四个部分的最大数目相连空闲块。

二进制搭档系统用来完成每个摘要树的叶层。通过首先为位图的每个字获得空闲位的最长二进制搭档字符串而形成 dmap 结构的树。字符以 2 的幂编码,-1 用来表示已分配全部。

图 7显示了字查找一个空的最长二进制搭档字符串的例子。

然后,使用二进制搭档系统完成树的叶。通过取得从指定索引开始、只包括其以 2 的幂显示的搭档的最大数目空闲块,可形成此树。

图 8 显示了用图描述 dmap 树叶的缩略的示例。请注意,只有完全空闲的字才与其完全空闲的搭档组合。组合时,最右搭档变成 -1,以指示它由另一项所表示。

块分配映射表的 dmap 控制页包含与 dmap 结构中树相似的树,除叶层包含 1024 个元素外。这些元素是树 [0] 为紧跟下面的 1024 个映射表页的二进制搭档表示法。对于 L0 页,它是接下来的 1024 个 dmap 页,对于 L1 页,它是接下来的 1024 个 L0 页,而对于 L2 页,它是接下来 1024 个 L1 页。

在块分配映射表的顶部,有映射表控制结构 structdbmap_t 。该结构包含摘要信息,能加快查找比平均空闲空间多的 AG。可在 jfs_dmap.h 中找到该结构。

块分配映射表没有记日志:它能在恢复期间由 logredo 修复,或者由 fsck 重构。在 fsck 或 logredo 后工作和持续映射表,都必需是相同状态。

扩展聚集以增大文件系统

要扩展聚集,JFS 必须确保有足够的页存储块分配映射表, 索引聚集新扩展的块。通常,从现有的聚集分配空间给新增的页,但是如果该聚集空间已满,那就不可能了。所以我们需要解决这种特殊情况。

要解决该问题,通常 JFS 为块分配映射表分配的空间多于索引聚集地址空间所需的空间。每个映射表都有额外页空间用于存放位图,如果该页指向另一层摘要树,则该映射表就需额外页存放所需的摘要信息。这种额外空间使得 JFS 可以在必要时将聚集分为更小的单位,以扩大聚集至所需的大小。扩展聚集,需采取以下步骤:

如果现有聚集的空间足以扩展块分配映射表,使其能索引新聚集的所有块,那么,JFS 不做任何特殊处理,将聚集扩展至整个空间。仅当需要考虑聚集将来的扩展时,块分配映射表才需增加额外页。
如果没有足够空间扩展,那么 JFS 仅给聚集扩展块分配映射表中已有额外页所能寻址的块。
至此,JFS 有一些额外的聚集块未在聚集中使用到。JFS 可以用这些聚集块扩大块分配映射表,以继续将聚集扩展至所需大小。JFS 必须谨记将这些额外页放入块分配映射表中。
这个处理过程完全由 vfs_cntl() 处理,对系统的其它部分隐藏。

另一种表示法:二进制编码搭档表示法

块分配映射表也可以用二进制编码搭档系统表示。除了树的叶结点和 dmap 结构不同外,这种表示法的逻辑和物理结构与前一种一样。

struct dmap 定义块分配映射表的最下层。每个 dmap 页包括 8K 的聚集块。


/*
 *  dmap summary tree
 *
 * dmaptree_t must be consistent with dmapctl_t.
 */
typedef struct {
    int32   nleafs;             /* 4: number of tree leafs     */
    int32   l2nleafs;           /* 4: l2 number of tree leafs      */
    int32   leafidx;            /* 4: index of first tree leaf     */
    int32   height;             /* 4: height of the tree       */
    int8    budmin;             /* 1: min l2 tree leaf value to combine*/
    int8    stree[TREESIZE];        /* TREESIZE: tree          */
    uint8   pad[2];             /* 2: pad to word boundary     */
} dmaptree_t;                   /* - 360 -             */


/*
 *  dmap page per 8K blocks bitmap
 */
typedef struct {
    int32       nblocks;      /* 4: num blks covered by this dmap */
    int32       nfree;        /* 4: num of free blks in this dmap */
    int64       start;        /* 8: starting blkno for this dmap  */
    dmaptree_t  tree;         /* 360: dmap tree                   */
    uint8       pad[1672];    /* 1672: pad to 2048 bytes          */
    uint32      wmap[LPERDMAP];   /* 1024: bits of the working map    */
    uint32      pmap[LPERDMAP];   /* 1024: bits of the persistent map */
} dmap_t;                 /* - 4096 -                         */

二进制编码搭档系统的每一项都有三个字段: type , size 和 bitmap 。 type 字段表示块空闲、已分配、用位图表示或不由该字段表示 (don't care)。如果类型是"don't care"则这些块由左搭档表示, size 字段忽略。如果 type 是位图,则 位图 字段的 32 位和 32 块一一对应,表示其空闲或已分配。位值 0 表示空闲块,1 表示块已分配。size 是 2 的幂次方,表示该项描述的聚集块的个数。

对于每个全空闲项,如果其相同大小的左搭档也完全空闲,则右搭档设为"don't care"类型,且右搭档的空间合并入左搭档。当分配块时,仅当搭档分配在同一盘区才合并。必须维护"don't care"类型,以便 logredo 修正映射表。

图 9显示了进行分配和回收二进制编码搭档的小例子。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章