治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu
分类:
2018-08-28 15:29:22
原文地址:ZFS磁盘格式(6) 作者:qincp-
ZPL,ZFS Posix层,使得DMU对象对外表现为POSIX文件系统。Posix标准定义了文件系统必须提供的一组服务。ZFS提供了posix所有这些要求的服务。
ZPL将文件系统表示为类型为DMU_OST_ZFS的对象集。所有快照,克隆,文件系统都实现为这种类型的对象集。ZPL使用了进行定义的格式来组织对象集中的对象。
ZPL对象集中有一个对象位置固定,而且对象编号也固定。这个对象称为“主节点”(master node),对象编号为1。主节点是包含三个属性的ZAP对象:DELETE_QUEUE, VERSION, 以及ROOT。
名称: DELETE_QUEUE
值: 删除队列对象的对象编号
描述: The delete queue provides a list of deletes that were in-progress when
the filesystem was force unmounted or as a result of a system failure such as a
power outage. Upon the next mount of the filesystem, the delete queue is
processed to remove the files/dirs that are in the delete queue. This mechanism is
used to avoid leaking files and directories in the filesystem. 删除队列是一个文件系统强制卸载时或者系统错误时,正在删除过程中的对象的链表。在文件系统的下一次挂载时,在删除队列中的文件/目录会被删除。这个机制用于防止文件系统中文件和目录的泄露。
名称: VERSION
值: 当前为1。
描述: ZPL版本
名称: ROOT
值: 64位对象编号
描述:属性的值包含文件系统的根目录的对象编号
文件系统目录以ZAP对象实现,类型为DMU_OT_DIRECTORY。每个目录拥有一组name/value对,包含了每个目录条目的名称和对象编号。目录树上的搜索即是简单的寻找一个具有某个值的条目,读出其对象编号。
所有文件系统对象在它的dnode的bonus缓存中包含一个znode_phys_t结构。这个结构存储了文件系统对象的属性。Znode_phys_t结构如下所示:
typedef struct znode_phys {
uint64_t zp_atime[2];
uint64_t zp_mtime[2];
uint64_t zp_ctime[2];
uint64_t zp_crtime[2];
uint64_t zp_gen;
uint64_t zp_mode;
uint64_t zp_size;
uint64_t zp_parent;
uint64_t zp_links;
uint64_t zp_xattr;
uint64_t zp_rdev;
uint64_t zp_flags;
uint64_t zp_uid;
uint64_t zp_gid;
uint64_t zp_pad[4];
zfs_znode_acl_t zp_acl;
} znode_phys_t
zp_atime: 上次文件访问时间。从
zp_mtime: 上次文件内容修改(modification)时间。
zp_ctime: 上次文件属性更改(change)时间。
zp_crtime: 文件创建时间
zp_gen: 文件创建的事务组编号
zp_mode: 文件模式和文件类型。模式低8位是访问模式位;第9位是粘性位,13-16位用于指定文件类型。
类型 |
描述 |
13-16位的值 |
S_FIFO |
Fifo |
0x1 |
S_IFCHR |
字符特殊设备 |
0x2 |
S_IFDIR |
目录 |
0x4 |
S_IFBLK |
块特殊设备 |
0x6 |
S_IFREG |
正规文件 |
0x8 |
S_IFLNK |
符号链接 |
0xA |
S_IFSOCK |
套接字 |
0xC |
S_IFDOOR |
Door |
0xD |
S_IFPORT |
事件端口 |
0xE |
zp_size: 文件大小,以字节为单位
zp_parent: 包含该文件的父目录的对象id
zp_links: 该文件上的硬链接
zp_xattr: 目录隐藏属性的ZAP对象的对象id。按ZFS中的普通目录处理,但它是隐藏的,应用需要通过openat()函数建立隧道来进行访问。
zp_rdev: 类型为S_IFCHR 或r S_IFBLK的文件的dev_t结构
zp_flags: 文件上的持久性标志,如下表
表16 zp_flag
标志 |
值 |
ZFS_XATTR |
0X01 |
ZFS_INHERIT_ACE |
0X02 |
zp_uid: 文件拥有者的64位标识。
zp_gid: 文件拥有者组标识。
zp_acl: 包含文件的ACL条目的zfs_znode_acl结构。定义如下。
访问控制列表(ACL)是一个用于控制用户对ZFS对象的访问权限的机制。ACL在ZFS中是一个ACE(Access Control Entries)的表格。
Znode_phys_t包含一个zfs_znode_acl结构,这个结构如下:
#define ACE_SLOT_CNT 6
typedef struct zfs_znode_acl {
uint64_t z_acl_extern_obj;
uint32_t z_acl_count;
uint16_t z_acl_version;
uint16_t z_acl_pad;
ace_t z_ace_data[ACE_SLOT_CNT];
} zfs_znode_acl_t;
z_acl_extern_obj: ACL有多余6个ACE 时,znode中存放不下,剩余的ACL内容放在这个对象里。外部ACL的对象类型为DMU_OT_ACL。
z_acl_count: ACL中的ACE个数。
z_acl_version: 留作以后使用。
z_acl_pad: 留作以后使用
z_ace_data: 大小为6的ACE数组
ACE规定了某用户或用户组对特定对象的访问权限。
typedef struct ace {
uid_t a_who;
uint32_t a_access_mask;
uint16_t a_flags;
uint16_t a_type;
} ace_t;
a_who: 这个域在ACE_OWNER, ACE_GROUP 以及ACE_EVERYONE没有设置时才有意义。如果ACE_IDENTIFIER_GROUP被设置,域包含一个GID,否则域包含一个UID。
a_access_mask: 32位访问掩码,下表列出每个位对应的访问属性。
表17 访问掩码值
属性 |
值 |
ACE_READ_DATA |
0x00000001 |
ACE_LIST_DIRECTORY |
0x00000001 |
ACE_WRITE_DATA |
0x00000002 |
ACE_ADD_FILE |
0x00000002 |
ACE_APPEND_DATA |
0x00000004 |
ACE_ADD_SUBDIRECTORY |
0x00000004 |
ACE_READ_NAMED_ATTRS |
0x00000008 |
ACE_WRITE_NAMED_ATTRS |
0x00000008 |
ACE_EXECUTE |
0x00000010 |
ACE_DELETE_CHILD |
0x00000020 |
ACE_READ_ATTRIBUTES |
0x00000040 |
ACE_WRITE_ATTRIBUTES |
0x00000080 |
ACE_DELETE |
0x00000100 |
ACE_READ_ACL |
0x00010000 |
ACE_WRITE_ACL |
0x00020000 |
ACE_WRITE_OWNER |
0x00040000 |
ACE_SYNCHRONIZE |
0x00080000 |
ACE_READ_DATA |
0x00100000 |
a_flags: 16位整数,ACL类型以及继承标志
表18 ACL类型及继承标志
ACE标志 |
值 |
ACE_FILE_INHERIT_ACE |
0x0001 |
ACE_DIRECTORY_INHERIT_ACE |
0x0002 |
ACE_NO_PROPAGATE_INHERIT_ACE |
0x0004 |
ACE_INHERIT_ONLY_ACE |
0x0008 |
ACE_SUCCESSFUL_ACCESS_ACE_FLAG |
0x0010 |
ACE_FAILED_ACCESS_ACE_FLAG |
0x0020 |
ACE_IDENTIFIER_GROUP |
0x0040 |
ACE_OWNER |
0x1000 |
ACE_GROUP |
0x2000 |
ACE_EVERYONE |
0x4000 |
a_type:ACE类型,如下表
表19 ACE类型
类型 |
值 |
描述 |
ACE_ACCESS_ALLOWED_ACE_TYPE |
0x0000 |
按a_access_mask赋予访问权限 |
ACE_ACCESS_DENIED_ACE_TYPE |
0x0001 |
按a_access_mask拒绝访问权限 |
ACE_SYSTEM_AUDIT_ACE_TYPE |
0x0002 |
按a_access_mask统计成功和失败访问 |
ACE_SYSTEM_ALARM_ACE_TYPE |
0x0003 |
对a_access_mask规定的成功和失败的访问进行告警 |