首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OCFS2的扩展属性使用、架构及关键代码解析

对于Linux操作系统而言,所有文件系统的扩展属性都是通过setfattr命令进行设置的。通过getfattr可以获取某个文件的所有的扩展属性列表。

所谓扩展属性是相对于文件基本属性而言的。我们知道每个文件有大小、访问权限和时间等属性,这些属性是基本属性。但是有时这些属性并不能满足用户的实际需求,因此就出现了扩展属性。

文件的扩展属性

展属性(xattrs)提供了一个机制用来将键值对(Key/Value)永久地关联到文件,让现有的文件系统得以支持在原始设计中未提供的功能。扩展属性是文件系统不可知论者,应用程序可以通过一个标准的接口来操纵他们,此接口不因文件系统而异。每个扩展属性可以通过唯一的键来区分,键的内容必须是有效的UTF-8,格式为namespace.attribute,每个键采用完全限定的形式,也就是键必须有一个确定的前缀(例如user)。

Linux操作系统有如下集中扩展属性:

system:用于实现利用扩展属性的内核功能,例如访问控制表。eg:system.posix_acl_access便是位于此用户空间的扩展属性,用户是否可以读取或写入这些属性取决于所使用的安全模块。

security:用于实现安全模块。

trusted:把受限制的信息存入用户空间。

user:一般进程所使用的标准命名空间,经过一般文件权限位来控制此命名空间的访问。

上面就是Linux操作系统的常见扩展属性。下面我们介绍一下如何对文件进行扩展属性的设置。

文件扩展属性的设置和查询

在Linux操作系统下,扩展属性的管理通过一组命令实现,分别是setfattr、getfattr和attr等命令。其中setattr是设置文件的扩展属性,getfattr则是获取文件的扩展属性,attr则可以设置或者获取文件的扩展属性。

安装软件

有的系统默认可能没有上述命令,这时需要先安装一下这些命令。这些命令在同一个软件包中,以Ubuntu 18.04为例,安装方法如下:

apt install attr

设置文件的扩展属性

我们知道设置文件扩展属性的命令是setfattr或者attr,现在我们介绍一下这些命令的具体用法。当然,您也可以通过man命令查询详细的帮助文档。

通过setfattr设置,比如我们设置文件testfile的扩展属性:

setfattr -n user.example -v test testfile

也可以通过attr命令来设置,具体如下:

attr -s user.example2 -V test2 testfile

设置方法还是比较简单的。

获取文件的扩展属性

前文已述,可以通过getfattr或者attr命令来获取扩展属性。比如获取(getfattr testfile)刚才设置的两个扩展属性。

上述命令获取了文件的所有扩展属性,也可以通过选项控制查询条件,比如某个扩展属性的值等内容。

删除文件的扩展属性

通过setattr命令或者attr命令可以删除某个扩展属性。对于setfattr命令来说是通过-x选项来完成该动作。对于attr命令来说是通过-r选项。

OCFS2文件扩展属性架构

文件系统的扩展属性也是基于VFS框架之下的,因此当用户通过命令设置或者获取扩展属性时,首先会经过VFS的函数。然后VFS根据设置扩展属性的关键字前缀(例如上例中的user)及文件系统来调用具体文件系统的实现函数。

扩展属性与文件关联,因此扩展属性的数据也自然与文件关联,也就是与inode关联。在OCFS2文件系统中,OCFS2的inode有一个名为i_xattr_loc的成员,该成员记录了扩展属性数据在磁盘的位置。

OCFS2设置扩展属性流程

为了更加清楚的了解OCFS2扩展属性的架构和处理流程,我们以设置user属性为例介绍一下设置属性的流程。如图所示为整个函数调用栈,从fsetattr命令开始,一直到OCFS2文件系统的ocfs2_xattr_user_set函数。

在上述流程中是如何找到user扩展属性的处理函数ocfs2_xattr_user_set的呢?这个主要借助的是扩展属性的名称user。前面例子我们也可以看出,扩展属性的名称为user.example。然后通过xattr_resolve_name函数可以找到具体的函数指针。

以user扩展属性为例,其定义的函数指针如下。其中prefix成员就是前缀,这里是一个宏定义。

其实这个宏定义XATTR_USER_PREFIX就是字符串user.。具体定义如下所示。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OUm8QnVH_VUsqtF8WxuKJmGA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券