文件系统支持一特性就是扩展性,给一个文件(inode)添加各种属性。对于ext2文件系统来说,xattr(extend attribution)是它支持的为数不多的现代文件系统的特征之一。
那么为什么需要这个特性呢?这要从文件系统的元数据和数据的区别说起。xattr属于元数据,元数据一般是固定的,但一些场景下它也要提供一定的扩展性,而xattr就是为元数据的扩展性而存在的。下面扯下我对元数据和数据的理解,分析下为什么需要元数据。
我们知道文件的数据分为两类:元数据(meta data)和数据(data)。元数据是用来控制用户对数据的操作的。这也符合k8s中通过对象控制对象的程序范式。
一般来说元数据不需要用户主动感知,比如文件创建时,对应的时间信息由文件系统自动写入。但必需以不同的方式提供它的访问。如果和常规数据放一起了,如下:
filename: hello.txt
modify_time: 2021-3-7 20:00:00
regular_data:
hello world
这种方式可行吗?当然可行了。只是你无法控制用户是否会误操作,把对应的元数据改掉了;模块化编程的原则之一最小接口原则,在这里也适用,单独的接口修改,对比直接的修改来说,接口的能力(自由度)下降了,系统对用户的约束增强了,可以避免用户对数据的乱修改。
另外一个问题是,元数据的变更是稳定的,即使你频繁地读写一个文件,这个文件的元数据需要修改的只是对应的访问时间戳和修改时间戳。没有分开的情况下,元数据整体被频繁的读出,写入,这对系统来说是无意义的消耗,更别说在那个计算能力不足的年代背景下了。
通过以下分析,我们知道元数据需要单独存储。单独存储就需要单独的接口,因为普通文件的读写接口权限过大。但一方面,对一个文件来说,通过的读写接口不能满足对元数据修改的需求,需要提供其他系统接口。Linux下就是用ioctl系统调用实现对元数据的修改的。
主要setfattr和getfattr。通过查看ext2代码才知道,它支持三种类型的attr。通过不同的命名前缀区分。
示例:
setfattr -n user.word -v "hello world" test
getfattr -n user.word hello
# file: hello
user.word="hello world"