Linux 在虚拟文件系统中实现符号链接

Linux 在虚拟文件系统中实现符号链接,linux,symlink,vfs,Linux,Symlink,Vfs,我正在开发一个虚拟文件系统,它不是基于磁盘的,有点像/proc。现在我想在其中创建一个符号链接,链接到ext3文件系统上的目标。我还没有找到任何关于如何实现这一点的标准文档。到目前为止,我猜测我必须在struct inode_operations中为symlink编写一个函数。但坦率地说,即使有函数参数,我也不知所措 如果有必要的话,我从关于LWN的本教程开始: 编辑:我现在使用的是libfs,而不是FUSE,我建议您看看linux/fs/ext2/源代码。文件symlink.c、inode.c

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

如果有必要的话,我从关于LWN的本教程开始:


编辑:我现在使用的是libfs,而不是FUSE,我建议您看看linux/fs/ext2/源代码。文件symlink.c、inode.c、namei.c和其他可能很少的文件。你会知道需要做什么。和预期相反,单个文件系统的文件系统代码实际上非常简短且易于阅读

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

假设您正在使用,如果您没有,请执行:)


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

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

  • 使用S_iLink模式创建符号链接的inode,并将目标添加到i_private字段

  • 实现follow\u link,因为generic\u readlink要求它存在

  • 静态void*sample\u follow\u链接(struct dentry*dentry,struct nameidata*nd) { nd->depth=0; nd_设置链接(nd,(char*)dentry->d_inode->i_private); 返回NULL; } 静态结构索引节点操作示例索引节点操作={ .readlink=generic\u readlink, .follow\u link=示例\u follow\u link, }; ..... //在用于创建dentry和inode的函数中 索引节点->索引节点操作=样本索引节点操作
    我实际上正在开发一个已经存在的内核模块,它使用libfs创建虚拟文件系统。我知道如果我使用FUSE会更容易,但现在这是不可能的:)谢谢你的建议。我肯定会在ext2源代码中寻找一些关于实现的想法。 static void *sample_follow_link (struct dentry *dentry, struct nameidata *nd) { nd->depth = 0; nd_set_link(nd, (char *)dentry->d_inode->i_private); return NULL; } static struct inode_operations sample_inode_ops = { .readlink = generic_readlink, .follow_link = sample_follow_link, }; ..... //in the function for the dentry and inode creation inode->i_op = sample_inode_ops