ACL作为文件的一个属性需要永久保存,那么如何将文件的ACL属性保存到磁盘中呢?在ext文件系统中,ACL是通过扩展属性实现的。下面主要针对ext文件系统来分析ACL的具体实现。
2...1ACL在ext中的表示在Linux中,ACL是基于POSIX标准实现的,因此在ext文件系统中ACL的表示和POSIX中的定义相似,其定义在fs/ext/acl.h中,具体定义如下所示:
如上所示,ext_acl_entry数据结构表示ACL表项在ext文件系统中的表示形式,其各项的含义和posix_acl_entry相同;entry_acl_entry_short数据结构用于表示ACL在ext文件系统中的前四项:ACL_USER_OBJ、ACL_GROUP_OBJ、ACL_MASK、ACL_OTHER,因为这四项不需要指定id,从而使用该数据结构可以节省空间;ext_acl_header数据结构表示ACL在ext文件系统中的ACL首部,该结构体只有一个成员a_version,其用来表示ACL的实现版本,目前该变量只有一个值,即EXT_ACL_VERSION。
2...2ACL在ext中的操作对于ext文件系统,其中有关ACL的相关操作如下表2-7所示,这些操作定义在fs/ext/acl.h和fs/ext/acl.c中。
表2-7ext文件系统中ACL相关操作
函数所属文件
函数名称
函数功能
fs/ext/acl.h
ext_acl_size()
计算ACL所占用的内存空间
ext_acl_count()
计算ACL中包含的ACL表项的数目
fs/ext/acl.c
ext_acl_from_disk()
将ACL从磁盘表示形式转化为内存表示形式
ext_acl_to_disk()
将ACL从内存表示形式转化为磁盘表示形式
ext_get_acl()
根据ACL类型获取指定索引节点的ACL属性。其中类型有两种:ACL_TYPE_ACCESS类型的ACL用于控制文件的访问权限;ACL_TYPE_DEFAULT类型表示目录的默认ACL属性
ext_set_acl()
根据指定访问控制列表的类型设置文件的ACL
ext_init_acl()
初始化一个新的文件的ACL
ext_acl_chmod()
当调用chmod命令修改文件的权限是,将会根据设置的文件权限修改指定文件的用于访问控制的ACL属性
ext_xattr_list_acl_access()
将用于访问控制的ACL对应的扩展属性的名字拷贝到list中,并返回拷贝的字节数
ext_xattr_list_acl_default()
将目录的默认ACL对应的扩展属性的名字拷贝到list中,并返回拷贝的字节数
ext_xattr_get_acl()
将ACL从内存表示形式转换为磁盘表示形式,并将其存放到扩展属性中,最后返回扩展属性所占用的空间的长度
ext_xattr_set_acl()
从扩展属性中获取指定文件的内存表示形式的ACL,并用其设置目标文件的指定类型的ACL属性。
下面只对其中相对重要的部分函数进行分析:
1.ext_acl_from_disk()
ext_acl_from_disk()函数用于将ACL的磁盘表示格式转化为内存表示格式,成功执行时返回指向ACL内存表示形式的指针,函数头如下所示:
如上所示,该函数有两个参数:value表示磁盘格式的ACL在缓存中的地址;size表示ACL的长度。
图2-17ext_acl_from_disk()函数调用流程图
如图2-17所示,下面对该函数主要执行步骤进行说明:
① 通过对value及size进行相关的检查来判断参数的有效性。
② 调用ext_acl_count()函数来获得访问控制列表中访问控制列表项的数量。
③ 调用posix_acl_alloc()函数来根据访问控制列表项的项数分配相应的存储空间。
④ 通过循环将ACL中的表项从磁盘表示形式转换为内存表示形式,并用其来设置相应内存形式的ACL表项。
⑤ 结束并返回acl。
对于ext_acl_to_disk(),其实现和ext_acl_from_disk()函数相似,所以这里不对其详细讨论。
2.ext_init_acl()
ext_init_acl()函数用于初始化一个新文件的ACL,函数头如下所示:
该函数包含三个参数:handle表示用于日志处理的原子更新操作;inode指向新建文件的索引节点;dir表示文件所属目录的索引节点,该函数之所以需要知道新建文件所在目录的inode是因为如果文件所属目录包含默认ACL,那么其包含的内容将会应用到新建的文件,如果目录所在文件系统不支持ACL或没有关联默认的ACL,那么内核只是将进程的当前UMASK设置应用到文件。
图2-18ext_init_acl()函数调用流程图
如图2-18所示,该函数调用的函数上面均已介绍过,所以这里不对其进行详细说明。
赞赏
人赞赏
北京治白癜风医院哪个好白癜风能够治疗好吗