扩展属性 (xattrs) 提供了一个机制用来将键 / 值对永久地关联到文件, 让现有的文件系统得以支持在原始设计中未提供的功能. 扩展属性是文件系统不可知论者, 应用程序可以通过一个标准的接口来操纵他们, 此接口不因文件系统而异. 每个扩展属性可以通过唯一的键来区分, 键的内容必须是有效的 UTF-8, 格式为 namespace.attribute, 每个键采用完全限定的形式.
需要注意的是这里的值可以是任意字节的数组, 未必是字符存, 而且最后可能不是 null, 这样在访问的时候必须知道值的大小. 在设置的时候当然也就需要设置值大小.
一个扩展属性的用处: GUI 的文件管理程序的行为根据文件类型而异. 要判断文件的格式, Winodws 之类的操作系统仅需要查看文件的扩展名就可以了, 而 Unix 系统往往需要查看文件的内容来判断类型. 有些文件管理程序会直接产生此信息, 有些则会将产生的信息缓存起来以备下次使用. 一个更好的做法就是将此类元数据存入扩展属性.
Linux 下定义的 4 种扩展属性命名空间:
system: 用于实现利用扩展属性的内核功能, 例如访问控制表. eg:system.posix_acl_access 便是位于此用户空间的扩展属性, 用户是否可以读取或写入这些属性取决于所使用的安全模块.
security: 用于实现安全模块.
trusted: 把受限制的信息存入用户空间.
user: 一般进程所使用的标准命名空间, 经过一般文件权限位来控制此命名空间的访问.
下面是一个使用扩展属性的例子:
创建磁盘
- # dd if=/dev/zero of=/opt/testptn count=512
- # mke2fs xattr_disk
挂载磁盘
# mount -o loop,user_xattr xattr_disk mnt
扩展特性的操作
# touch test.txt
设置扩展特性
# setfattr -n user.abc -v 123 test.txt
显示扩展特性
- # getfattr -n user.abc test.txt
- # file: test.txt
- user.abc="123"
再一个例子:
- #include <stdio.h>
- #include <unistd.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/xattr.h>
- #include <sys/types.h>
- void testset(){
- char key[7] = {'u','s','e','r','.','#','\0'};
- char value[2] = {'#','\0'};
- int i, ret;
- for(i = 0; i <10; i++){
- key[5] = value[0] = '0'+i;
- ret = setxattr("test", key, value, 2, 0);
- }
- }
- void testlist(){
- char buf[1000];
- int ret, i=0, j = 0;
- printf("The key on test are:\n");
- ret = listxattr("test", buf, 1000);
- while(i < ret){
- printf("%s\n", buf+i);
- i += strlen(buf+i);
- i++;
- }
- }
- void testremove(){
- char key[7] = "user.2";
- int ret;
- ret = removexattr("test", key);
- printf("%d\n", ret);
- }
- void testget(){
- char key[7] = "user.#";
- char value[3];
- int ret, i;
- printf("The <key,value> on test are:\n");
- for(i = 0; i <11; i++){
- key[5] = '0'+i;
- ret = getxattr("test", key, value, 3);
- if(ret != -1)
- printf("<%s,%s>\n", key, value);
- }
- }
- int main(){
- testset();
- testlist();
- testremove();
- testget();
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2729659.html