FUSE lib passthrough.c示例。它在哪里反映我/确切?

时间:2017-12-19 21:25:54

标签: c linux filesystems fuse

我是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就是白纸,我可以利用已实现的功能并管理文件和内容。

提前致谢!

2 个答案:

答案 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}}附加在其上,以检查参数。