0. 背景介绍
该内容主要来自于《ZFS On-Disk Specification》一书的第5章,其中部分内容依据ZFS代码有所更新。
ZAP(ZFS Attribute Process)模块位于DMU模块之上,用来对ZAP对象进行操作。ZFS通过ZAP对象来存储名字值对(name-value pairs)形式的属性,该属性的名字部分为一个以空字符('\0')结尾的字符串(最长为256字节),而属性的值部分为一组整数,该值的大小仅仅受限于ZAP数据块的大小。
ZAP对象可以用来保存数据集(dataset)的属性,用来查找文件系统中的对象,用来保存存储池的属性等等,它在ZFS整个系统中有十分重要的作用。下面的这张表包含了ZFS中ZAP类型的对象。(更多的ZAP类型的对象可以在dmu.h中定义的dmu_object_type枚举中查看)
DMU_OT_OBJECT_DIRECTORY |
---|
DMU_OT_DSL_DIR_CHILD_MAP |
DMU_OT_DSL_DS_SNAP_MAP |
DMU_OT_DSL_PROPS |
DMU_OT_DIRECTORY_CONTENTS |
DMU_OT_MASTER_NODE |
DMU_OT_DELETE_QUEUE |
DMU_OT_ZVOL_PROP |
ZAP对象有两种形式:microzap对象和fatzap对象。microzap对象可以认为是轻量级的fatzap对象,它为较小的属性(数量少,名字和值的长度都有限)提供了一种快速存取和查找机制。而fatzap用来存储包含大量名字值对(且名字和值的长度较大)的属性。
ZFS根据下面3个条件决定应该是否可以用microzap对象来存储某一组属性的名字值对
1. 所有的名字值对都可以存入一个数据块中。对于ZFS来说,最大的数据块是128KB,即总共可以存放2047个microzap条目。(下面会详细介绍microzap的结构)
2. 所有属性的值都为uint64_t类型
3. 每个属性的名字部分为少于50个字节的字符串(包括结尾的空字符)
如果以上有一个条件未满足,则采用fatzap存放。
每个ZAP对象的数据块的头64个字节用来表明该数据块中包含的ZAP数据的类型,一共有3种类型的ZAP数据块,如下表所示:
标识符 | 描述 | 值 |
---|---|---|
ZBT_MICRO | 该数据块中存放microzap条目 | (1ULL<<63)+3 |
ZBT_HEADER | 该块属于一个fatzap对象,该标识符只出现在fatzap对象的第一个数据块中 | (1ULL<<63)+1 |
ZBT_LEAF | 该块属于一个fatzap对象,该标识符出现在除了第一块之外所有的fatzap对象的数据块中 | (1ULL<<63)+0 |
1. microzap磁盘结构
microzap实现了存取少量属性的一种简单方法。一个microzap对象只包含一个数据块,该数据块上存放microzap的条目(由mzap_ent_phys 结构体表示),每个microzap条目结构存放一个属性(名字值对)。
一个microzap数据块的结构如下:
1. 数据块开始的128个字节为一个microzap头部结构体(由mzap_phys结构体表示),该结构体定义如下: