科技行者

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

知识库

知识库 安全导航

至顶网网络频道JFS布局:日志文件系统如何处理磁盘布局(12)

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

  • 扫一扫
    分享文章到微信

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

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

来源:51cto.com 2007年12月27日

关键字: 数据恢复 数据安全

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

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

扩展聚集以增大文件系统

要扩展聚集,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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

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