fuse utimensat 问题
我正在用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调用失败了。我尝试实现空的utimens和utime,但它们根本没有被调用。
2 个回答
1
你需要实现 utimens
和 getattr
这两个功能。并不是所有的系统调用都能直接对应到你可能期待的 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 就会在前台运行,你可以在控制台看到错误信息。