Linux自主访问控制机制模块详细分析之

2..ACL在ext中的实现

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所示,该函数调用的函数上面均已介绍过,所以这里不对其进行详细说明。

赞赏

人赞赏









































北京治白癜风医院哪个好
白癜风能够治疗好吗



转载请注明:http://www.92nongye.com/zyjs/204613919.html