为了账号安全,请及时绑定邮箱和手机立即绑定

使用 FUSE 以目录形式命名管道

使用 FUSE 以目录形式命名管道

Go
ITMISS 2023-07-26 19:29:28
我想创建一个 FUSE 文件系统,它接受对文件系统内任何路径的任何类型的写入操作。有点像命名管道,但采用目录的形式。echo test > bar         # consumes "test"echo test > bar/foo     # consumes "test", even though the directory "bar" hasn't been createdecho 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. 我希望这适用于目录或文件。有办法实现我想要的吗?去保险丝
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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

考虑到这些限制,解决您的问题是不可能的。

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

您最好的选择似乎是:

  • 将特定于应用程序的虚拟目录结构硬编码到您的 FUSE 驱动程序中

  • 在 FUSE 驱动程序中实施特定于应用程序的启发式方法

  • 让您的 FUSE 驱动程序记住getattr请求并通过反复试验构建虚拟目录树(并不断重新运行应用程序直到它起作用)


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信