扩展属性Extended Attributes
目录
1、EA的概述
所谓扩展属性,Extended Attributes,以下简称EA,是区分于文件属性、文件的扩展出来的属性。
EA是目前流行的POSIX系统中文件系统具有的一项特殊功能,可以给文件、文件夹添加额外的key/value的键值对,可以以键值对地形式将任意元数据与文件i节点关联起来。键和值都是字符串并且有一定长度地限制,是完全自定义的属性。Linux自版本2.6起,开始支持EA。
我们可利用EA去实现访问列表和文件能力、记录文件地版本号、与文件地MIME类型/字符集有关的信息,或是指向图符的指针。
EA需要底层文件系统来支撑,包括btrfs、ext2、ext3、ext4、JFS、Reiserfs以及XFS等文件系统都支持EA。各类文件系统对EA的支持都属可选项,受内核配置选项中的“File systems”菜单控制。Reiserfs文件系统自Linux 2.6.7开始支持EA。
2、EA的命名空间
EA的命名格式是namespace.name。其中namespace是用来把EA从功能上划分为截然不同地几大类。而name是用来在指定命名空间内唯一标识某一EA。
可供namespace使用的值有4个:user、trusted、system以及security。这4类EA的用途可参考如下:
User EA:
将在文件系统检查地制约下由非特权级进程操控。要想获取User EA值,需要由文件地读权限;要想改变User EA值,则需要写权限。若无所需权限,将会导致EACCES错误。
在ext2、ext3、ext4或Reiserfs文件系统上,如要将User EA与一文件关联,需要在装配底层文件系统时候带选上user_xattr选项。
$ mount –o user_xattr device directory
Trusted EA:
也可以由用户进程驱使,跟User EA类似。
与User EA的区别是,要操纵trusted EA,必须是特权进程。
System EA:供内核使用,将系统对象与一文件关联。目前仅支持访问控制列表。
Security EA:
用来存储服务于操作系统安全模块地文件安全标签;
将可执行文件与能力关联起来;
设计初衷是为了支持安全强化版地Linux(SELinux)。
一个i节点可以拥有多个相关EA,其所属地命名空间可以相同,也可不同。各个命名空间里,EA是自成一体的,即是说这些命名空间是互不排斥的。另外,在user和trusted命名空间内,EA名可以是任意字符串。在system内,只有经过内核明确认可地命名才可使用,比如访问控制列表。
3、EA的Shell指令
在Shell中,可执行setfattr(1)和getfattr(1)命令来设置和查看文件的EA。
1 |
|
另外需要注意的是,EA值可以为空字符串,这不同于未定义的EA值。
- setfattr
- getfattr
默认情况下,getfattr只会列出User EA值。可利用-m选项指定一个正则表达式,来筛选要显示地EA名
1 |
|
- attr
这个shell指令涵盖了setfattr和getfattr的功能,是两者的集合。
4、EA的限制
1) 对User EA的限制
User EA只能施之于文件或目录,之所以将其他文件类型排除在外,原因如下:
1、因为符号链接会对所有用户开启所有权限,而且这是不可更改的。然而,对于User EA,是需要考虑权限地。这是相互矛盾地。如果使用符号链接,系统会吧链接去除掉。
2、对于设备文件、套接字以及FIFO而言,授予用户权限,意在对其针对底层对象所执行的i/o操作加以控制,如欲操控这些权限,转而求取对创建user EA地控制,二者会出现权限冲突。
3、若某一目录启用了粘性位(sticky位),且为其他用户所拥有,则非特权用户不能将一User EA置于该目录之上。惟其如此,才能防止任一用户将EA附于诸如/tmp之类的目录之上,由于其可写权限对所有用户开放,导致任意用户均可操纵此目录的EA,而设置粘性位,意在防止用户删除该目录下为其他用户所拥有的文件。
2)EA实现上的限制
1、EA名称地长度不能超过255个字节
2、EA值的容量为64KB
此外,某些文件系统对可与文件挂钩的EA数量及其大小还有更为严格的限制。
3、在ext2、ext3以及ext4文件系统上,与一文件关联地所有EA命名和EA值地总字节数不会超过单个逻辑磁盘块的大小:1024字节、2048字节或4096字节
4、在JFS上,为某一文件系统所使用的所有EA名和EA值地总字节数上限为128KB
5、EA的系统调用
1) 创建和修改EA
系统可调用以下方法来设置EA值。
setxattr:通过pathname来标识文件,如果文件名是符号链接,则对其解引用;
lsetxattr:通过pathname来标识文件,如果文件名是符号链接,不会对其解引用;
fsetxattr:通过打开文件描述符fd来标识文件。
以上3者之间的差异同样适用于本文下面介绍的其他各组系统调用。
参数name是一个以空字符串结尾地字符串,定义了EA地名称。
参数value是一个指向缓冲区地指针,包含了为EA定义地新值。
参数size是指明缓冲区地大小。
默认情况,指定名称地EA不存在,系统调用会创建一个新的EA。已经存在地话,就会进行替换。
参数flags是可对这一行为进行控制,将这参数指定为0,设定为默认情况。或者可将其指定为如下常量之一:
2) 获取EA值
可利用以下方法来获取EA值。
参数name是一个以空字符串结尾地字符串,定义了EA地名称。用来标识要取值地EA。
返回的EA值保存于参数value所指向地缓冲区中,该缓冲区必须由调用者分配,其大小由size来指定。若调用成功,会返回复制到value所指向地缓冲区中地字节数
若文件不含name的EA,系统调用失败,会返回错误ENODATA。
若size过小,系统调用也会失败,并返回错误ERANGE。
可设size为0,将会忽略value,系统调用仍会返回EA值地大小,可用来获取EA值所需value缓冲区大小。
3) 删除EA
可利用以下方法删除文件的EA。
Name所含以空字符串结尾的字符串,用于标识打算删除的EA。若试图删除不存在的EA,调用将失败,并会返回错误ENODATA。
4) 获取文件相关的所有EA
以下方法返回的列表会包含与某文件关联的所有EA的名称。
将EA地名称列表以一系列以空字符结尾地字符形式置于list所指向地缓冲区中。缓冲区大小由size指定。
与getxattr一样,可以将size指定为0,系统调用将忽略list,并返回后续调用实际获取EA名称列表时所需的缓冲区大小。
想要获取与某文件相关的EA列表,只需对文件拥有访问权限,对文件本身则无需任何权限。
处于安全堪虑,list中返回的EA名称可能不包含调用进程无权访问的属性名。比如,在非特权进程中调用listxattr()时,大多数文件系统都会忽略trusted EA。
扩展属性Extended Attributes
install_url
to use ShareThis. Please set it in _config.yml
.