服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Linux NFSD软件架构与代码解析

Linux NFSD软件架构与代码解析

2023-08-21 09:00数据存储张 Linux

在Linux操作系统发行版有一个NFS服务端,该服务端由内核态的模块和用户态的守护进程构成。其中内核态模块负责数据处理,而用户态守护进程则负责内核态的配置管理等功能。由于核心功能在内核态实现,因此与Linux中的本地文件系统有很好的兼容性,性能也比较好。 由于网络锁和挂载等协议与NFS协议不统一,因此都有独立的服务来处理相关的逻辑,这样整个NFS服务略显繁杂。但是到NFSv4之后,NFS协议将网络

在Linux操作系统发行版有一个NFS服务端,该服务端由内核态的模块和用户态的守护进程构成。其中内核态模块负责数据处理,而用户态守护进程则负责内核态的配置管理等功能。由于核心功能在内核态实现,因此与Linux中的本地文件系统有很好的兼容性,性能也比较好。

由于网络锁和挂载等协议与NFS协议不统一,因此都有独立的服务来处理相关的逻辑,这样整个NFS服务略显繁杂。但是到NFSv4之后,NFS协议将网络锁协议和挂载协议都融入其中,因此具体实现也简洁了很多。

在前面文章中我们已经简要的描述了NFS协议在Linux内核中的层次结构。本节我们再进一步详细的介绍一下服务端的软件架构。NFSD的软件架构其实并不复杂,我们可以进一步细化为如图1所示。

Linux NFSD软件架构与代码解析图片

从该图可以看出,当RPC服务收到来自客户端的请求时,它会对请求进行分发,由具体的程序(例如NFS或者NLM)来完成相关请求。其中请求的分发依据是其中的程序ID和例程ID,根据这两个信息就可以找到具体的函数指针。

如果相关请求涉及到文件操作,那么在例程中会直接调用VFS的接口(例如读数据)进行下一步的处理。而VFS则根据导出的目录信息调用本地文件系统(例如Ext4和XFS等)的接口实现具体的操作。

在内核中实现了所有的NFS协议,比如NFS v3、NFS v4、挂载和NLM等。由于从RPC服务到协议程序的流程是一样的,限于篇幅本文并不会对每种协议都做介绍。本节我们主要以NFS v3协议为例,介绍一下从网络收到消息到最终完成协议层处理的整个流程。如果大家熟悉了一个流程,再按照此流程来理解其它流程将非常容易。

1启动流程简析

首先我们分析一下NFSD的启动过程,该过程主要完成函数指针集向RPC服务注册的过程。以处理NFS协议的服务端为例,关键是启动了一个内核线程池。该线程池不断地接收网络消息,然后译码之后调用注册的回调函数进行具体命令的处理。如下代码所示是NFS服务的主函数,函数指针的注册和线程池的创建都在其中实现。

Linux NFSD软件架构与代码解析图片

在该函数中,其中nfsd_create_serv完成函数指针的初始化,主要涉及如下函数指针。

Linux NFSD软件架构与代码解析图片

上述函数指针中,svc_set_num_threads用于创建线程池,而nfsd则是线程函数,负责数据的接收和处理。我们看一下该函数的主体部分,具体如下:

Linux NFSD软件架构与代码解析图片

可以看出该函数主要调用两个函数,svc_recv用于接收消息,svc_process用于处理消息。这两个函数其实都是RPC模块的函数。其中svc_process会解析数据包,然后调用函数指针进行后续的处理。以NFSv3为例,它会调用如下函数指针集中的某个函数。

Linux NFSD软件架构与代码解析图片

2写数据流程示例

以写数据流程为例,当RPC服务接收到数据包后,根据协议格式解析出程序ID和例程的ID等信息,然后从注册的函数指针集就可以找到期望的函数指针进行处理。对于写数据而言,就会调用nfsd中的nfsd3_proc_write函数。

nfsd3_proc_write函数的工作其实并不多,更进一步会调到VFS的接口,具体如下图所示。最后,VFS会调用到具体文件系统的接口。如果我们导出的是Ext4的子目录,那么会调用Ext4的接口来处理写数据的请求。

Linux NFSD软件架构与代码解析图片

总体来看,NFSD的逻辑是比较清晰的,代码也并不复杂。而且各个接口的逻辑一致,因此理解了一个接口后,再理解其它接口也就容易很多了。

延伸 · 阅读

精彩推荐
  • LinuxLinux命令详解之less命令

    Linux命令详解之less命令

    Linux下还有一个与more命令非常类似的命令--less命令,相比于more命令,less命令更加灵活强大一些,今天就给大家介绍下Linux下的less命令。...

    waitig8632021-11-15
  • LinuxLinux使用awk文本处理工具实现多行合并的实例

    Linux使用awk文本处理工具实现多行合并的实例

    在Linux系统中使用awk文本处理工具,有时需要将多行合并,这就需要用到awknext语句了,下面有个不错的示例,需要的朋友可以看看 ...

    Linux教程网4482019-10-17
  • LinuxLinux系统命令中screen命令详解

    Linux系统命令中screen命令详解

    screen是可以在同一个远程登陆会话窗口中创建多个screen会话窗口,当会话暂时可以不需要的时候,可以放至后台运行,虽然LINUX下提供&命令将程序放置后台...

    Wing''s Notes4802021-12-08
  • LinuxLinux多功能转换音频文件工具(SoX)

    Linux多功能转换音频文件工具(SoX)

    我有一些最喜欢的音频转换工具,其中之一就是号称“音频的瑞士军刀” —— SoX。SoX 可以读取和重写音频数据。它是否存储重写的音频数据取决于你。...

    Linux中国6772022-11-16
  • LinuxLinux 使用vi文本编辑器详解

    Linux 使用vi文本编辑器详解

    这篇文章主要介绍了Linux 使用vi文本编辑器详解的相关资料,需要的朋友可以参考下...

    wx6373716e6bc6a9502023-03-06
  • LinuxPHP程序员玩转Linux系列 备份还原MySQL

    PHP程序员玩转Linux系列 备份还原MySQL

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,MySQL备份还原教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    陶士涵5232022-01-07
  • LinuxLinux系统下破解SAM密码

    Linux系统下破解SAM密码

    用linux启动,并挂载Windows的系统分区把c:\windows\system32\config\目录下的SAM和system复制出来 也可以用WINPE,DOS引导盘,都可以的,只要把SAM和system复制出来就...

    Linux教程网4942020-04-06
  • LinuxSSH 上传文件及文件夹到linux服务器的方法

    SSH 上传文件及文件夹到linux服务器的方法

    这篇文章主要介绍了SSH 上传文件及文件夹到linux服务器的方法,需要的朋友可以参考下...

    金振宗4302022-07-11