使用 FUSE 的目录形式的命名管道
Named pipe in form of a directory using FUSE
我想创建一个 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
,此代码特定于目录节点类型。我希望它适用于目录或文件。
有没有办法实现我想要的?
The problem that I'm facing is that when an application wants to write to foo/bar
inside my file system, it checks whether foo
is a directory, then whether bar
is a file. Unfortunately, I can't know upfront whether foo
should be a file or a directory.
鉴于这些限制,解决您的问题是不可能的。
文件系统节点可以是文件也可以是目录;有时两者都不是,但绝不会同时发生。因为您的 FUSE 驱动程序无法提前知道执行 getattr
请求的应用程序是否意味着在节点内部递归直到它实际尝试这样做,所以您无法知道它应该伪装成文件还是目录。
您的最佳选择似乎是:
- 将特定于应用程序的虚拟目录结构硬编码到您的 FUSE 驱动程序中
- 在您的 FUSE 驱动程序中实施特定于应用程序的启发式算法
- 让你的 FUSE 驱动程序记住
getattr
请求并通过反复试验构建虚拟目录树(并保持重新运行 应用程序直到它工作)
我想创建一个 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
,此代码特定于目录节点类型。我希望它适用于目录或文件。
有没有办法实现我想要的?
The problem that I'm facing is that when an application wants to write to
foo/bar
inside my file system, it checks whetherfoo
is a directory, then whetherbar
is a file. Unfortunately, I can't know upfront whetherfoo
should be a file or a directory.
鉴于这些限制,解决您的问题是不可能的。
文件系统节点可以是文件也可以是目录;有时两者都不是,但绝不会同时发生。因为您的 FUSE 驱动程序无法提前知道执行 getattr
请求的应用程序是否意味着在节点内部递归直到它实际尝试这样做,所以您无法知道它应该伪装成文件还是目录。
您的最佳选择似乎是:
- 将特定于应用程序的虚拟目录结构硬编码到您的 FUSE 驱动程序中
- 在您的 FUSE 驱动程序中实施特定于应用程序的启发式算法
- 让你的 FUSE 驱动程序记住
getattr
请求并通过反复试验构建虚拟目录树(并保持重新运行 应用程序直到它工作)