[使用FUSE的目录形式的命名管道

问题描述 投票:2回答:1

我想创建一个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,此代码特定于目录节点类型。我希望它适用于目录或文件。

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

go fuse
1个回答
0
投票

我面临的问题是,当应用程序要写入文件系统内的foo/bar时,它将检查foo是否为目录,然后检查bar是否为文件。不幸的是,我不知道foo应该是文件还是目录。

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

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

您最好的选择似乎是:

  • 将特定于应用程序的硬编码虚拟目录结构放入您的FUSE驱动程序中
  • 在FUSE驱动程序中实现特定于应用程序的试探法
  • 让您的FUSE驱动程序记住getattr请求并通过反复试验构造一个虚拟目录树(并继续重新运行该应用程序,直到它起作用为止)
© www.soinside.com 2019 - 2024. All rights reserved.