FUSE打开系统调用机制

4
当程序调用open系统调用以在FUSE管理的目录中创建空文件(使用O_WRONLY | O_CREAT | O_TRUNC)时,会执行以下来自我的FUSE文件系统实现的功能:
  1. getattr(返回错误,因为文件不存在)
  2. create
  3. fgetattr
我的问题是:
这些函数调用是否适用于Linux中的所有文件系统(包括原生的ext4),还是只是FUSE的内部行为?
当使用strace跟踪程序时,我只能看到一个open系统调用。
1个回答

6

经过几天的研究,我对Linux内核和FUSE源代码都有了深入的理解。

首先,我必须说在执行“打开”系统调用时,在fgetattr之后的release并没有被执行。因此,我已经编辑了我的问题以删除它。

那么,我的主要问题是strace显示执行了“打开”系统调用,但是我的FUSE程序日志显示执行了三个函数。因此,我提出了关于其他文件系统的问题。

Linux kernel documentation 中,我们可以详细了解内核VFS:

要查找一个inode,需要VFS调用其父目录inode的lookup()方法。该方法由inode所在的具体文件系统实现安装。一旦VFS获得所需的dentry(因此获得了inode),我们就可以完成所有这些无聊的事情,例如打开(2)文件或stat(2)。

在FUSE文件系统中,这意味着低级API中的lookup调用,或高级API中的getattr调用(因为inode-path翻译由libfuse处理)。用户区代码。其他系统调用,如带有O_CREAT标志的mkdiropen也需要进行lookup,在这种情况下需要确认负面目录项才能执行任何操作。第一点已解决。

您收到的目录项不应该有inode(即它应该是负目录项)。

像ext4这样实现在内核中的文件系统也使用其功能来执行lookup。但是你不能从外部使用常见的工具(如strace)看到它们(你需要像kernelshark这样的工具,非常棒)。 请参阅ext4查找函数(我正在运行Linux 3.13内核)
第三点的fgetattr函数调用与libfuse内部更相关。我不知道确切的原因,但在执行像mkdircreate这样的函数后,libfuse会执行lookup。请记住,lookup是高级API中的getattr(对于创建的文件是fgetattr)。我认为这是由于文件/目录属性检查造成的。
您可以在libfuse源代码中看到它的实际应用,如create函数。
奖励:请记住,FUSE使用文件属性(和条目)缓存。如果将-o attr_timeout挂载选项设置为0秒,则某些调用(例如stat)将引发两个getattr到高级API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接