2.7 文件系统的扩展属性
在文件系统中,文件的基础属性比较有限,如文件的inode ID、创建时间、大小和访问属性等。通用文件系统的用户往往有很多个性化的需求,因此文件系统通过扩展属性允许用户自定义一些功能。
文件的扩展属性(xattrs)通过“键-值”对(Key/Value)方式提供了一种存储附加信息的方式,扩展属性与文件或目录相关联。每个扩展属性可以通过唯一的键来区分,键的内容必须是有效的UTF-8编码,格式为namespace.attribute,每个键采用完全限定的形式,也就是键必须有一个确定的前缀(如user)。
在Linux中,对扩展属性的管理可以通过setfattr命令和getfattr命令完成。前者是设置文件的扩展属性,后者是获取文件的扩展属性。以设置文件的扩展属性为例,setfattr命令的语法格式如下:
执行上述命令后就为文件f1.txt设置了扩展属性。需要注意的是,该扩展属性的数据并不在文件内容中,而是在其他地方。
在图2-18中,第1个命令用于设置文件的扩展属性和获取文件的扩展属性。在设置扩展属性时,-n后面是扩展属性的名称,而-v后面则是扩展属性的值。
通过getfattr命令获取文件的扩展属性。在图2-18中,第2个命令可以获取该文件的所有扩展属性,当然也可以配合选项来获取某些特定名称的扩展属性。
图2-18 文件扩展属性的设置与获取
这两个命令的功能很丰富,大家可以自行阅读man手册,此处不再赘述。除了可以使用上述命令来对扩展属性进行管理,还可以通过API来管理扩展属性,这更适合程序员使用。使用API设置和获取扩展属性的语法格式如下:
这里需要说明的是,setxattr中的flags参数用于指定setxattr的行为。该参数有两种可能的值,分别是XATTR_CREATE和XATTR_REPLACE。如果参数的值是XATTR_CREATE,在添加扩展属性时,遇到同名属性,则返回错误码EEXIST。如果是XATTR_REPLACE,则会用新值替换该属性的旧值。
扩展属性的具体应用要根据用户的用途而定。比如,在Ceph分布式存储中,使用本地文件系统的扩展属性来存储对象的一些属性信息。一些桌面应用使用扩展属性存储一些附属信息,如文档的作者和描述信息等。