概述

因为工作中使用了 NFS,所以有时需要定位一些和 NFS 相关的问题,但是,对于 NFS 除了简单的使用之外,原理以及组件通信还有 IO 路径这些都不是很清楚,所以在这篇文章中我将总结一下 NFS Server 的通信架构以及 mount 的 IO 路径。

访问 Mount NFS 目录

这里的内容很多都和我以前写过的关于 Linux 文件系统模型 相关,所以可以先了解一下这篇文章再看下面的内容。

当我们通过 mount 挂载了一个 NFS 目录时,在 Linux 的文件系统中,会创建一个 vfsmount 和 superblock,用于记录 NFS 的挂载信息,然后将 vfsmount 对象加入到 VFS 的 mount 树和 Hash Table 中,这样就算是挂载好了。

然后,当访问的时候,首先打开的是文件对象,然后再定位到 vfsmount,再接着就可以访问到 superblock 了,这样就可以通过 NFS 的模块和 Server 进行通信了:

图 1:文件系统访问

NFS 通信原理

图 2:NFS CS 通信原理

NFS 的进程

NFS 客户端挂载过程

  1. 首先服务器端启动 RPC 服务,并开启 111 端口;
  2. 启动 NFS 服务,并向 RPC 注册端口信息;
  3. 客户端启动 RPC 客户端,向服务端的 portmap(111 端口) 服务请求服务端的 NFS 端口信息;
  4. 服务端的 portmap 服务反馈给 Server 的端口信息给客户端;
  5. 客户端通过获取的 NFS 端口和服务端的 NFS 连接并进行数据的传输。

获取源代码

  1. [root@liqiang.io]# git clone git://git.linux-nfs.org/projects/steved/nfs-utils.git

Ref