我是FUSE和c和FS的新手,我在libfuse包中给出了passthrough FS示例。任何人都可以在代码中给出一个提示,指示FUSE镜像我的根目录吗?因为我找到了两个基本函数 - * xmp_init()和main() - 非常简洁。
他们是:
static void *xmp_init(struct fuse_conn_info *conn,
struct fuse_config *cfg)
{
(void) conn;
cfg->use_ino = 1;
cfg->entry_timeout = 0;
cfg->attr_timeout = 0;
cfg->negative_timeout = 0;
return NULL;
}
int main(int argc, char *argv[])
{
umask(0);
return fuse_main(argc, argv, &xmp_oper, NULL);
}
其他函数就像libfuse接口的实现一样。我需要制作自己的残缺FS,我需要修改passthrough.c,这样安装的FS就是白纸,我可以利用已实现的功能并管理文件和内容。
提前致谢!
答案 0 :(得分:1)
尝试阅读示例中任何保险丝操作的实现,您将看到它。没有一个地方可以隐藏有关镜像根文件系统的特定细节。
例如,让我们检查getattr
fuse operation,它类似于stat(2)
系统调用,并且应该返回(通过指针)给定文件的统计结构。
当在fuse文件系统中访问某个文件时,首先调用实现gettattr操作的函数,这使得该操作的实现是强制性的。
查看the implementation in the example:
static int xmp_getattr(const char *path, struct stat *stbuf,
struct fuse_file_info *fi)
{
(void) fi;
int res;
res = lstat(path, stbuf);
if (res == -1)
return -errno;
return 0;
}
我们发现所有这些代码都只是使用相同的参数调用lstat(2)
。
所以当您安装此示例文件系统时,这样:
$ ./passthrough /tmp/example
然后尝试在那里列出文件:
$ ls /tmp/example/
fuselib将使用路径xmp_getattr()
调用"/"
,因为您正在访问fuse文件系统的根目录。然后xmp_getattr()
中的代码只会调用普通的系统调用以获得类似的东西,以便根文件系统看起来在/tmp/example
mountpoint中镜像。
答案 1 :(得分:0)
marbu的答案是正确的。我仅说明将路径参数传递给xmp_getattr()
等。相对于安装点,因此/tmp/example/
变成/
。您可以使用passthrough
标志编译-g
,并在挂载gdb
之后将{{1}}附加在其上,以检查参数。