免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2766 | 回复: 0
打印 上一主题 下一主题

ZFS磁盘格式(6) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-22 16:00 |只看该作者 |倒序浏览

第六章 ZPL
ZPL,ZFS Posix层,使得DMU对象对外表现为POSIX文件系统。Posix标准定义了文件系统必须提供的一组服务。ZFS提供了posix所有这些要求的服务。
ZPL将文件系统表示为类型为DMU_OST_ZFS的对象集。所有快照,克隆,文件系统都实现为这种类型的对象集。ZPL使用了进行定义的格式来组织对象集中的对象。
6.1 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位对象编号
描述:属性的值包含文件系统的根目录的对象编号
6.2 目录和目录搜索
文件系统目录以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: 上次文件访问时间。从1970年1月1日起计算,zp_atime[0] 中存放秒,zp_atime[1]中存放纳秒。
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结构。定义如下。
6.3 ZFS 访问控制列表
访问控制列表(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_typeACE类型,如下表
表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规定的成功和失败的访问进行告警


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103238/showart_2057684.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP