Linux中修改扩展属性的接口

在Linux中,扩展属性(Extended Attributes,简称xattr)允许用户将键值对形式的元数据附加到文件系统对象(文件/目录)上。操作接口分为系统调用和命令行工具两类:


1. 系统调用接口

需包含头文件:#include <sys/xattr.h>

(1) 设置/修改属性

1
2
3
4
5
6
// 通过文件路径操作
int setxattr(const char *path, const char *name, const void *value, size_t size, int flags);
int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); // 不跟随符号链接

// 通过文件描述符操作
int fsetxattr(int fd, const char *name, const void *value, size_t size, int flags);

参数说明

  • path/fd:目标文件路径或描述符
  • name:属性名(格式:命名空间.属性名,如 user.comment
  • value:属性值指针
  • size:属性值长度
  • flags:控制标志(常用值):
    • 0:默认覆盖已有属性
    • XATTR_CREATE:仅当属性不存在时创建
    • XATTR_REPLACE:仅当属性存在时替换

(2) 获取属性

1
2
ssize_t getxattr(const char *path, const char *name, void *value, size_t size);
ssize_t fgetxattr(int fd, const char *name, void *value, size_t size);
  • size=0,函数返回属性值的实际大小
  • 返回值 -1 表示错误(检查 errno

(3) 删除属性

1
2
int removexattr(const char *path, const char *name);
int fremovexattr(int fd, const char *name);

(4) 列出所有属性名

1
2
ssize_t listxattr(const char *path, char *list, size_t size);
ssize_t flistxattr(int fd, char *list, size_t size);
  • 返回的属性名列表以 \0 分隔的字符串

2. 命令行工具

(1) setfattr - 设置/修改属性

1
2
3
4
5
6
7
8
# 设置新属性
setfattr -n user.key_name -v "value" /path/to/file

# 修改已有属性(直接覆盖)
setfattr -n user.key_name -v "new_value" /path/to/file

# 使用十六进制数据
echo -n -e \\x41\\x42 | setfattr -n user.bin_data -v /path/to/file

(2) getfattr - 查看属性

1
2
3
4
5
6
7
8
# 查看所有用户属性
getfattr -d /path/to/file

# 查看特定属性
getfattr -n user.key_name /path/to/file

# 显示属性名和值(包括隐藏字符)
getfattr --dump /path/to/file

(3) **attr**(部分系统)

1
2
attr -s key_name -V "value" /path/to/file  # 设置
attr -g key_name /path/to/file # 获取

关键注意事项

  1. 命名空间

    • user:普通用户可读写(最常用)
    • trusted:需root权限
    • system:内核保留(如ACL)
    • security:安全模块(如SELinux)
  2. 文件系统支持

    • 需文件系统支持xattr(如ext4, XFS, Btrfs)
    • 挂载时启用:mount -o user_xattr /dev/sda1 /mnt
  3. 大小限制

    • 属性名+值通常限制为单个文件系统块大小(如4KB)
    • 通过getfattr -m - /path可查看实际限制
  4. 错误处理

    • 系统调用返回 -1 时检查 errno
      • ENOTSUP:文件系统不支持xattr
      • EACCES:权限不足
      • ENOATTR:属性不存在

使用示例(C语言)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <sys/xattr.h>
#include <stdio.h>

int main() {
const char *file = "test.txt";
const char *attr_name = "user.comment";
char value[] = "Important File";

// 设置属性
if (setxattr(file, attr_name, value, sizeof(value), 0) == -1) {
perror("setxattr failed");
return 1;
}

// 获取属性
char buf[256];
ssize_t len = getxattr(file, attr_name, buf, sizeof(buf));
if (len == -1) {
perror("getxattr failed");
return 1;
}
buf[len] = '\0';
printf("Attribute value: %s\n", buf);

return 0;
}

通过上述接口,您可以灵活管理Linux文件的扩展属性,实现元数据存储、安全标记等高级功能。