【问题标题】:Implementing symlinks in a virtual file system在虚拟文件系统中实现符号链接
【发布时间】:2010-01-03 02:43:32
【问题描述】:

我正在开发一个不基于磁盘的虚拟文件系统,有点像 /proc。现在我想在其中创建一个符号链接到 ext3 文件系统上的目标。我还没有找到任何关于如何实现这一目标的标准文档。到目前为止,我的猜测是我必须编写一个函数来将symlink 放入struct inode_operations 中。但坦率地说,即使有函数参数,我也不知所措。

如果重要的话,我从 LWN 上的这个教程开始:http://lwn.net/Articles/13325/

编辑:我目前正在使用 libfs,而不是 FUSE

【问题讨论】:

  • 我实际上正在开发一个已经存在的内核模块,该模块使用 libfs 创建虚拟文件系统。我知道如果我使用 FUSE 会更容易,但现在这是不可能的:)

标签: linux symlink vfs


【解决方案1】:

大概你正在使用fuse,如果你不是,请这样做:)

你所要做的就是实现getattr函数告诉内核对象是一个符号链接,然后实现readlink函数并返回链接应该链接到的路径;内核将完成剩下的工作。

【讨论】:

    【解决方案2】:

    我终于能够完成它。这是我所做的(根据文件系统想要实现的目标,一些细节可能会有所不同):

    1. 使用 S_IFLNK 模式创建符号链接的 inode,并将目标添加到 i_private 字段。

    2. 实现 follow_link,因为 generic_readlink 要求它存在

    static void *sample_follow_link (struct dentry *dentry, struct nameidata *nd) { nd->深度= 0; nd_set_link(nd, (char *)dentry->d_inode->i_private); 返回空值; } 静态结构 inode_operations sample_inode_ops = { .readlink = generic_readlink, .follow_link = sample_follow_link, }; ...... //在dentry和inode创建函数中 inode->i_op = sample_inode_ops

    【讨论】:

      【解决方案3】:

      我建议看一下 linux/fs/ext2/ 源代码。文件 symlink.c、inode.c、namei.c 和其他一些文件。您将对需要做什么有所了解。与预期相反,各个文件系统的文件系统代码实际上非常短且易于阅读。

      但也许不是创建新的虚拟文件系统,您可能会问自己另一个问题,在我的情况下融合用户级文件系统还不够吗?他们有更好的文档来创建虚拟文件系统和更多示例。

      【讨论】:

      • 感谢您的建议。我一定会在 ext2 源代码中查看有关实现的一些想法。
      猜你喜欢
      • 2010-11-04
      • 2021-04-21
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2012-11-08
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多