一、概述
-
文件的扩展属性(EA)
-
即以名称-值对形式将任意元数据与文件 i 节点关联 起来的技术。
2. EA 可用于实现访问列表(第 17 章)和文件能力(第 39 章)。
二、EA 命名空间
-
EA 的命名格式为 namespace.name。其中 namespace 用来把 EA 从功能上划分为截然不同的几大类,而 name 则用来在既定命名空间内唯一标识某个 EA。
-
可供 namespace 使用的值有 4 个:user、trusted、system 以及 security。这 4 类 EA 的用途如下所示:
-
user EA 将在文件权限检查的制约下由非特权级进程操控。欲获取user EA 值,需要有文件的读权限;欲改变userEA值,则需要写权限,如欲将 user EA 与一文件关联, 在装配底层文件系统时需带有 user_xattr 选项。
mount -o user_xattr device directory
-
trusted EA 也可由用户进程“驱使”,这点与 user EA 相似。而区别则在于,要操纵 trusted EA,进程必须具有特权(CAP_SYS_ADMIN)
-
system EA 供内核使用,将系统对象与一文件关联。目前仅支持访问控制列表(第 17 章)。
-
security EA 的作用有二:其一,用来存储服务于操作系统安全模块的文件安全标签; 其二,将可执行文件与能力关联起来(39.9.2 节)。而发明 security EA 的初衷是为了支持安全强化版的 Linux。
3. 一个 i 节点可以拥有多个相关 EA,其所从属的命名空间可以相同,也可不同。在各命名空间内的 EA 名均自成一体。在 user 和 trusted 命名空间内,EA 名可以为任意字符串。而在 system 命名空间内,只有经内核明确认可的(例如,用于访问控制列表的)命名方可使用。
三、通过 shell 创建并查看 EA
-
在 shell 中,可执行 setfattr(1)和 getfattr(1)命令来设置和查看文件的 EA
四、扩展属性的实现细节
-
扩展属性的实现细节
-
对于符号链接,会对所有用户开启所有权限,且不容更改。
-
对于设备文件、套接字以及 FIFO 而言,授予用户权限,意在对其针对底层对象所执 行的 I/O 操作加以控制。如欲操控这些权限,转而求取对创建 user EA 的控制,则二 者间会产生冲突。
五、操控扩展属性的系统调用
-
创建和修改 EA
-
系统调用 setxattr()、lsetxattr()以及 fsetxattr()用来设置文件的 EA 值之一。
2. 这 3 个系统调用之间的区别类似于 stat()、lstat()以及 fstat()三者间的差异。
-
setxattr()通过 pathname 来标识文件,若文件名为符号链接,则对其解引用。
-
lsetxattr()通过 pathname 来标识文件,但不会对符号链接解引用。
-
fsetxattr()则通过打开文件描述符 fd 来标识文件。
3. 默认情况下,若具有给定名称(name)的 EA 不存在,上述系统调用会创建一个新 EA。 若 EA 已经存在,则将替换 EA 值。可利用参数 flags 将这一行为控制得更为精准。将该参数 指定为 0,以获得默认行为,或者可将其指定为如下常量之一。
常量 | 含义 |
XATTR_CREATE | 若具有给定名称(name)的 EA 已经存在,则失败。 |
XATTR_REPLACE | 若具有给定名称(name)的 EA 不存在,则失败。 |
4. 可利用系统调用 getxattr()、lgetxattr()以及 fgetxattr()来获取 EA 值。
-
若文件不含名为“name”的属性 ,上述系统调用则会失败,并会返回错误 ENODATA。 若 size 值过小,上述系统调用也会失败,并返回错误 ERANGE。
5. 系统调用 removexattr()、lremovexattr()以及 fremovexattr()用来删除文件的 EA。
6. 想获取与某文件相关联的 EA 名列表,只需对文件拥有“访问”权限(亦即对 pathname 下的所有路径均拥有执行权限),对文件本身则无需任何权限。