【问题标题】:Named pipe in form of a directory using FUSE使用 FUSE 的目录形式的命名管道
【发布时间】:2020-02-01 19:32:31
【问题描述】:

我想创建一个 FUSE 文件系统,它接受对文件系统内任何路径的任何类型的写入操作。有点像命名管道,但是以目录的形式。

echo test > bar         # consumes "test"
echo test > bar/foo     # consumes "test", even though the directory "bar" hasn't been created
echo test > x/y/z/test  # consumes "test", even though the directories "x/y/z" haven't been created

我使用bazil.org/fuse 来实现。我面临的问题是,当应用程序想要写入我的文件系统中的foo/bar 时,它会检查foo 是否是一个目录,然后检查bar 是否是一个文件。不幸的是,我无法预先知道foo 应该是文件还是目录。

我的Attr 函数如下所示:

func (d *Dir) Attr(ctx context.Context, a *fuse.Attr) error {
        a.Inode = 1
        a.Mode = os.ModeDir | 0755
}

由于os.ModeDir,此代码特定于目录节点类型。我希望这适用于目录或文件。

有没有办法实现我想要的?

【问题讨论】:

  • 您对以下写入序列有何期望:echo test > foo/bar; echo test > foo?
  • 反过来呢:echo test > foo; echo test > foo/bar?
  • @Leon:这两个命令都应该正常执行,在这两种情况下,FUSE 文件系统都应该接受对一个名为 foo 或 foo/bar 的文件的写操作。
  • 这意味着在您的用例中,您只会发出写入请求而不会回读。对吗?
  • @Leon:完全正确。文件系统在内部消耗所有写入请求,但不需要读取任何内容。

标签: go fuse


【解决方案1】:

我面临的问题是,当应用程序想要写入我的文件系统中的foo/bar 时,它会检查foo 是否是一个目录,然后检查bar 是否是一个文件。不幸的是,我无法预先知道foo 应该是文件还是目录。

鉴于这些限制,解决您的问题是不可能的。

文件系统节点可以是文件也可以是目录;有时两者都不是,但绝不会同时发生。因为您的 FUSE 驱动程序在实际尝试之前无法提前知道执行getattr 请求的应用程序是否意味着在节点内部递归,所以您无法知道它应该伪装成文件还是目录。

您的最佳选择似乎是:

  • 将特定于应用程序的虚拟目录结构硬编码到您的 FUSE 驱动程序中
  • 在您的 FUSE 驱动程序中实现特定于应用程序的启发式方法
  • 让您的 FUSE 驱动程序记住 getattr 请求并通过反复试验构建一个虚拟目录树(并不断重新运行应用程序直到它工作)

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2011-10-24
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2011-07-04
    • 2021-01-26
    相关资源
    最近更新 更多