fuse utimensat 问题

2 投票
2 回答
2135 浏览
提问于 2025-04-16 01:58

我正在用Python开发一个文件系统(使用fuse-python库)。我需要实现哪个方法才能让touch命令正常工作?目前我得到的输出是:


$ touch m/My\ files/d3elete1.me 
touch: setting times of `m/My files/d3elete1.me': Invalid argument

文件存在 "d3elete1.me":


$ ls -l m/My\ files/d3elete1.me 
-rw-rw-rw- 1 root root 0 Jul 28 15:28 m/My files/d3elete1.me

我还尝试追踪系统调用:


$ strace touch m/My\ files/d3elete1.me
...
open("m/My files/d3elete1.me", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = 3
dup2(3, 0)                              = 0
close(3)                                = 0
utimensat(0, NULL, NULL, 0)             = -1 EINVAL (Invalid argument)
close(0)                                = 0
...

如你所见,utimensat调用失败了。我尝试实现空的utimensutime,但它们根本没有被调用。

2 个回答

1

你需要实现 utimensgetattr 这两个功能。并不是所有的系统调用都能直接对应到你可能期待的 C 语言调用。很多系统调用是 FUSE 内部用来检查和管理你的文件系统的,具体取决于你设置的 FUSE 选项。

在你的情况下,我认为 FUSE 会先把对 utimesat 的调用转成 utimens,然后再用 getattr 来检查请求的文件是否存在,以及它是否具备预期的属性。

更新0

这真是个巧合。下面有个评论提到这个问题可能是因为 FUSE 不支持 utimensat。但其实并不是这样。我在使用 fuse-python 和 Ubuntu 10.04 时遇到了和你提供的完全相同的错误信息。我稍微查了一下,发现 fuse-python 0.2 的绑定是针对 FUSE 2.6 的,可能是因为某个小改动引入了这个错误(现在 FUSE 已经更新到 2.8 了)。我的解决办法是停止使用 fuse-python(那段代码实在太乱了),然后找到了一个替代的绑定库 fusepy。自从那以后我就没再遇到问题。

我强烈建议你去看看这个库,你的初始化代码会更简洁,而且适应新库只需要做很少的修改。最重要的是,它只有一个模块,阅读起来也很简单。

2

试着用 -f 这个选项来启动 fuse。这样,fuse 就会在前台运行,你可以在控制台看到错误信息。

撰写回答