基于fuse的文件系统导出NFS的问题

本文介绍了FUSE(用户态文件系统)的工作原理,以及在基于FUSE开发的文件系统如GlusterFS中遇到的Stale file handle问题。问题源于NFS客户端和服务端的文件句柄缓存不同步,导致在访问文件或目录时可能出现错误。文章深入分析了内核中struct export_operations结构的作用,并展示了FUSE内核模块及libfuse的实现细节,指出了解决Stale file handle问题的关键在于正确处理文件句柄缓存和通信协议。
摘要由CSDN通过智能技术生成

FUSE(The Filesystem in Userspace)介绍:

       像ext4,xfs等本地文件系统都是在linux内核代码中,并且运行在内核态,如果要在内核中定制化开发一个文件系统,对程序员的能力要求是比较高的。fuse为用户态文件系统提供了与VFS交互的通道,fuse分为内核态fuse模块,用户态libfuse和fusemount工具。其中内核态fuse模块是其最核心的功能,主要是转发VFS的operations到用户态,实现export文件系统(NFS)接口;可以基于用户态的libfuse进行开发,如mcachefs等,也可以根据fuse的协议自己编写通信模块,如GlusterFS。

       基于fuse开发的用户态文件系统一般只支持POSIX接口,在某些不能通过POSIX方式mount的时候,一般会采用上层再套一层NAS系统来提供对外服务。如下图:

在上述用法中,使用nfs客户端的程序在访问文件或者目录的时候可能会收到Stale file handle(errno: ESTALE)的报错,如GlusterFS就有这个问题,其原因我们下面逐步分析。

Stale file handle问题分析:

nfs客户端和服务端(如:nfsd,nfs-ganesha等)之间通过RPC协议进行通信,与其他文件系统以inode表示其中的一个文件或目录类似,nfs客户端和服务端都通过fh(file handle)来表示,且各自独立cache fh(问题所在),实现exportfs的文件系统都需要实例化struct export_operations结构中的操作 (详细参照内核代码:include/linux/exportfs.h)

/**
 * struct export_operations - for nfsd to communicate with file systems
 * @encode_fh:      encode a file handle fragment from a dentry
 * @fh_to_dentry:   find the implied object and get a dentry for it
 * @fh_to_parent:   find the implied object's parent and get a dentry for it
 * @get_name:       find the name for a given inode in a given directory
 * @get_parent:     find the parent of a given directory
 * @commit_metadata: commit metadata changes to stable storage
 */
struct export_operations {
    int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len, struct in

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值