如何从Linux内核空间添加自定义扩展属性(即从自定义系统调用)

时间:2018-04-07 23:40:23

标签: linux linux-kernel filesystems

如何添加扩展属性(如命令行函数setfattr -n user.custom_attrib -v 99 ex1.txt),但在自定义系统调用中从内核中执行此操作。我看过linux/xattrib.h并且我没有尝试从内核空间设置任何内容。任何时候我使用vfs_setxattr(struct dentry *, const char *, const void *, size_t, int);它重新启动整个VM。最后,我试图将新的整数类型添加为文件的扩展属性,我还需要检索该扩展属性。我需要使用内核空间中允许的函数。

1 个答案:

答案 0 :(得分:2)

我能够获得扩展属性:vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); 主要问题是const void *想要传递char *。该代码看起来像这样:

char * buf = "test\0";
int size = 5;     //number of bytes needed for attribute
int flag = 0;     //0 allows for replacement or creation of attribute
int err;          //gets error code negative error and positive success

err = vfs_setxattr(path_struct.dentry, "user.custom_attrib", buf, size, flag);

我也能够vfs_getxattr(struct dentry *, const char *, const void *, size_t);工作。缓冲区和void *再一次陷入困境。我必须分配一个缓冲区来保存正在传递的扩展属性。所以我的代码看起来像这样:

char buf[1024];
int size_buf = 1024;
int err;

err = vfs_getxattr(path_struct.dentry, "user.custom_attrib",buf, size_buf);

所以现在buf将保存来自dentry的指定文件的值。错误代码非常有助于弄清楚发生了什么。所以使用命令行工具。

安装命令行工具:

sudo apt-get install attr

要从命令行手动设置属性:

setfattr -n user.custom_attrib -v "test_if working" test.txt

要从命令行手动获取属性:

getfattr -n user.custom_attrib test.txt  

我无法弄清楚你是否可以将不同的类型(例如int)传递到扩展的属性中,而且我的试验让我对内核构建进行了多次处理。希望这可以帮助一些人,或者如果有人有任何更正让我知道。