FUSE lib passthrough.c 示例。它在哪里准确地反映了我的/?

Sop*_*our 5 c linux filesystems fuse

我是 FUSE、c 和 FS 的新手,我正在弄乱libfuse 包中给出的直通 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);
}
Run Code Online (Sandbox Code Playgroud)

其他函数只是 libfuse 接口的实现...之类的东西。我需要制作自己的残缺文件系统,我需要修改 passthrough.c,以便安装的文件系统将是一张白纸,我可以利用已实现的功能并管理文件和其他内容。

mar*_*rbu 4

尝试阅读示例中任何熔断操作的实现,您将会看到它。没有一个地方可以隐藏有关根文件系统镜像的特定细节。

例如,让我们检查getattr熔断操作,它类似于stat(2)系统调用,并且期望返回(通过指针)给定文件的 stat 结构。

当在fuse文件系统中访问某个文件时,首先调用实现gettattr操作的函数,这使得必须执行该操作。

查看示例中的实现

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;
}
Run Code Online (Sandbox Code Playgroud)

我们看到这段代码所做的只是lstat(2)使用相同的参数进行调用。

因此,当您像这样挂载此示例文件系统时:

$ ./passthrough /tmp/example
Run Code Online (Sandbox Code Playgroud)

然后尝试在那里列出文件:

$ ls /tmp/example/
Run Code Online (Sandbox Code Playgroud)

fusionlib 将xmp_getattr()使用路径进行调用"/",因为您正在访问 fusion 文件系统的根目录。然后,中的代码xmp_getattr()将仅调用普通的系统调用来执行类似的操作,以便根文件系统在/tmp/example挂载点中看起来是镜像的。