扩展属性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

  1. 将在文件系统检查地制约下由非特权级进程操控。要想获取User EA值,需要由文件地读权限;要想改变User EA值,则需要写权限。若无所需权限,将会导致EACCES错误。

  2. 在ext2、ext3、ext4或Reiserfs文件系统上,如要将User EA与一文件关联,需要在装配底层文件系统时候带选上user_xattr选项。
    $ mount –o user_xattr device directory

Trusted EA

  1. 也可以由用户进程驱使,跟User EA类似。
    
  2. 与User EA的区别是,要操纵trusted EA,必须是特权进程。
    

System EA:供内核使用,将系统对象与一文件关联。目前仅支持访问控制列表。

Security EA

  1. 用来存储服务于操作系统安全模块地文件安全标签;
    
  2. 将可执行文件与能力关联起来;
    
  3. 设计初衷是为了支持安全强化版地Linux(SELinux)。
    

一个i节点可以拥有多个相关EA,其所属地命名空间可以相同,也可不同。各个命名空间里,EA是自成一体的,即是说这些命名空间是互不排斥的。另外,在user和trusted命名空间内,EA名可以是任意字符串。在system内,只有经过内核明确认可地命名才可使用,比如访问控制列表。

3、EA的Shell指令

在Shell中,可执行setfattr(1)和getfattr(1)命令来设置和查看文件的EA。

1
2
3
4
5
6
7

touchtfile
setfattr -n user.x -v "The past is not dead." tfile

getfattr -n user.xtfile
getfattr -d tfile

另外需要注意的是,EA值可以为空字符串,这不同于未定义的EA值。

  1. setfattr

EA1.png

  1. getfattr

EA2.png

默认情况下,getfattr只会列出User EA值。可利用-m选项指定一个正则表达式,来筛选要显示地EA名

1
2
3
4
5
6
7
8
9
10
11

$ getfattr -m - tfile
# file: tfile
user.x

$ getfattr -m x tfile
# file: tfile
user.x

$ getfattr -m y tfile

  1. attr

EA3.png

这个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值。

EA4.png

setxattr:通过pathname来标识文件,如果文件名是符号链接,则对其解引用;

lsetxattr:通过pathname来标识文件,如果文件名是符号链接,不会对其解引用;

fsetxattr:通过打开文件描述符fd来标识文件。

以上3者之间的差异同样适用于本文下面介绍的其他各组系统调用。

参数name是一个以空字符串结尾地字符串,定义了EA地名称。

参数value是一个指向缓冲区地指针,包含了为EA定义地新值。

参数size是指明缓冲区地大小。

默认情况,指定名称地EA不存在,系统调用会创建一个新的EA。已经存在地话,就会进行替换。

参数flags是可对这一行为进行控制,将这参数指定为0,设定为默认情况。或者可将其指定为如下常量之一:

EA5.png

2) 获取EA值

可利用以下方法来获取EA值。

EA6.png

参数name是一个以空字符串结尾地字符串,定义了EA地名称。用来标识要取值地EA。

返回的EA值保存于参数value所指向地缓冲区中,该缓冲区必须由调用者分配,其大小由size来指定。若调用成功,会返回复制到value所指向地缓冲区中地字节数

若文件不含name的EA,系统调用失败,会返回错误ENODATA。

若size过小,系统调用也会失败,并返回错误ERANGE。

可设size为0,将会忽略value,系统调用仍会返回EA值地大小,可用来获取EA值所需value缓冲区大小。

3) 删除EA

可利用以下方法删除文件的EA。

EA7.png

Name所含以空字符串结尾的字符串,用于标识打算删除的EA。若试图删除不存在的EA,调用将失败,并会返回错误ENODATA。

4) 获取文件相关的所有EA

以下方法返回的列表会包含与某文件关联的所有EA的名称。

EA8.png

将EA地名称列表以一系列以空字符结尾地字符形式置于list所指向地缓冲区中。缓冲区大小由size指定。

与getxattr一样,可以将size指定为0,系统调用将忽略list,并返回后续调用实际获取EA名称列表时所需的缓冲区大小。

想要获取与某文件相关的EA列表,只需对文件拥有访问权限,对文件本身则无需任何权限。

处于安全堪虑,list中返回的EA名称可能不包含调用进程无权访问的属性名。比如,在非特权进程中调用listxattr()时,大多数文件系统都会忽略trusted EA。

扩展属性Extended Attributes

http://example.com/2022/07/24/2016-08-22-EA/

作者

yalechen

发布于

2022-07-24

更新于

2022-07-24

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.