Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1204199
  • 博文数量: 185
  • 博客积分: 495
  • 博客等级: 下士
  • 技术积分: 1418
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-02 15:12
个人简介

治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu

文章分类

全部博文(185)

文章存档

2019年(1)

2018年(12)

2017年(5)

2016年(23)

2015年(1)

2014年(22)

2013年(82)

2012年(39)

分类:

2018-08-28 15:29:22

原文地址:ZFS磁盘格式(6) 作者:qincp-

第六章 ZPL

ZPLZFS 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对,包含了每个目录条目的名称和对象编号。目录树上的搜索即是简单的寻找一个具有某个值的条目,读出其对象编号。

所有文件系统对象在它的dnodebonus缓存中包含一个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: 上次文件访问时间。从197011起计算,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对象的访问权限的机制。ACLZFS中是一个ACEAccess 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有多余6ACE 时,znode中存放不下,剩余的ACL内容放在这个对象里。外部ACL的对象类型为DMU_OT_ACL

z_acl_count: ACL中的ACE个数。

z_acl_version: 留作以后使用。

z_acl_pad: 留作以后使用

z_ace_data:  大小为6ACE数组

 

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规定的成功和失败的访问进行告警

阅读(1069) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~