Linux NFS的整体架构与核心代码解析
前面文章我们从应用层面对NFS进行了介绍,接下来的文章我们将进入实现层面。本文首先从整体上对Linux的NFS软件架构进行介绍,然后介绍代码与实际业务逻辑介绍一下NFS的处理流程。
NFS文件系统的架构分析
NFS分布式文件系统是一个客户端-服务端架构(CS架构)。其客户端是Linux内核中的一个文件系统,跟Ext4和XFS类似,它是虚拟文件系统下的一个具体实现。与其它本地文件系统(例如Ext4,XFS或者Btrfs等)的差异在于其数据请求不存储在本地磁盘,而是通过网络发送到服务端进行处理。
如图1是是NFS的整体软件架构,其中左侧是客户端,右侧是服务端。客户端我们称为NFS文件系统,其位于VFS之下,再之下是RPC模块,两者都位于Linux内核之中。

图1 NFS协议架构
在服务端的NFS主要是指NFSD,它是一个NFS服务。该服务用于接收服务端的请求,处理后通过RPC将处理结果反馈给客户端。而服务端最终还是要将数据存储起来的,在Linux中的NFS服务还是借助的本地文件系统来存储的。因此,在NFS服务端,其数据相关的业务逻辑也会调用到VFS的接口,然后是经过本地文件系统存储在持久化存储上(如磁盘)。
NFS的通信使用的是RPC协议,该协议也是Sun发明的一种网络通信协议。RPC协议位于TCP/IP协议之上,是一个应用层的协议,可以类比http协议。RPC协议进行通信的流程大致如图2所示。

图2 RPC的通信过程
RPC协议称为远程过程调用,类似本地函数调用。因此,RPC首先是在客户端和服务端都要注册处理函数,这些被注册的函数称为存根。这样,当客户端调用某个函数时,比如写数据,RPC服务就会将该请求通过网络传到服务端,然后调用服务端注册的写数据的接口。也就是客户端与服务端是一一对应的。这样在客户端来说,其函数的调用与本地函数调用并没有太大的差异。
Linux NFS代码解析
为了更加清晰的理解NFS的架构,我们以写数据为例来介绍一下NFS文件系统与服务端通信的过程。由于NFS有很多版本,且Linux内核中对所有版本都有实现。为了便于介绍和学习,我们以NFS v3为例进行介绍。
由于NFS基于VFS,因此不可避免的需要实现一套函数指针,并在挂载的时候进行注册。这主要是保证从VFS下来的请求可以转发到NFS文件系统进行处理。如图5是NFS文件系统实现的函数指针集合。

图3 函数指针实现
以写数据为例(客户端无缓存,非DIRECT模式),其具体实现的函数为nfs_file_write。当用户通过程序调用write函数时,经过VFS的vfs_write函数,最后调用NFS的nfs_file_write函数。该函数与本地文件系统的逻辑类型,它首先将数据写入缓存中(非DIRECT模式),然后调用generic_write_sync实现缓存数据刷写。

图4 写数据流程
在客户端的具体的写动作由nfs_writepages函数完成,该函数进行若干初始化动作,然后通过RPC将数据发送到服务端。对比本地文件系统,本地文件系统是通过该函数将数据写入磁盘。
服务端向RPC注册了各种回调函数,当接收到客户端的请求时会调用具体的回调函数进行处理。本例将调用nfsd3_proc_write函数。该函数最后调用VFS层的写数据函数,而VFS写数据函数则调用具体文件系统(例如Ext4)的函数完成最终的写数据操作。
NFS分布式文件系统的整个架构和逻辑还是比较清晰的,主要是内核中同时支持了NFSv2、NFSv3和NFSv4多个版本,整体比较复杂,但难度并不是非常大。
本文从比较高的层面介绍了NFS的整体架构和RPC的流程,很多细节没有深入。如果大家有疑惑的地方也没有关系,本专栏后面会逐步对客户端和服务端的软件架构分别进行介绍。
相关文章:
Linux NFS的整体架构与核心代码解析
前面文章我们从应用层面对NFS进行了介绍,接下来的文章我们将进入实现层面。本文首先从整体上对Linux的NFS软件架构进行介绍,然后介绍代码与实际业务逻辑介绍一下NFS的处理流程。 NFS文件系统的架构分析 NFS分布式文件系统是一个客户端-服务端架构&#…...
28、Flink 的SQL之DROP 、ALTER 、INSERT 、ANALYZE 语句
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...
正则表达式[总结]
文章目录 1. 为什么要学习正则表达式2. 再提出几个问题?3. 解决之道-正则表达式4. 正则表达式基本介绍5. 正则表达式底层实现(重要)6. 正则表达式语法6.1 基本介绍6.2 元字符(Metacharacter)-转义号 \\\6.3 元字符-字符匹配符6.4 元字符-选择匹配符6.5 元字符-限定符…...
【docker】搭建xxl-job
首先创建数据库,例如我已经有了mysql 在 192.168.20.17上 #首先要有对应的数据库,创建xxl-job所需表CREATE database if NOT EXISTS xxl_job default character set utf8mb4 collate utf8mb4_unicode_ci; use xxl_job;SET NAMES utf8mb4;CREATE TABLE xx…...
k8s-----3、kubernetes集群部署(kubeadm部署)
集群部署 1、kubeadm流程(重新配置)1.1 安装要求1.2 准备环境 1.3. 所有节点安装Docker/kubeadm/kubelet1.3.1 安装Docker1.3.2 添加阿里云YUM软件源1.3.3 安装kubeadm,kubelet和kubectl 1.4 部署Kubernetes Master1.5. 加入Kubernetes Node1…...
党建展馆vr仿真解说员具有高质量的表现力和互动性
随着虚拟数字人应用渐成趋势,以虚拟数字人为核心的营销远比其他更能加速品牌年轻化进程和认识,助力企业在激烈的市场竞争中脱颖而出,那么企业虚拟IP代言人解决了哪些痛点? 解决品牌与代言人之间的风险问题 传统代言人在代言品牌时࿰…...
Webpack 基础以及常用插件使用方法
目录 一、前言二、修改打包入/出口配置步骤 三、常用插件使用html-webpack-plugin打包 CSS 代码提取 CSS 代码优化压缩过程打包 less 代码打包图片文件 一、前言 本质上,Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时…...
ROCESS SPID 代表什么进程
ROCESS 发出sql命令 所在主机的进程 可以不在数据库主机上发出 SPID 对应数据库的服务进程id select a.PROCESS,b.SPID From v$session a , v$process b where a.PADDRb.ADDR and a.USERNAMESYS SQL> !ps -ef|grep sqlplus oracle 385 2792 0 21:01 pts/…...
oracle rac了解
Oracle RAC 是一种高可用性和高性能的数据库解决方案,它允许多台服务器共享同一个数据库。简而言之,Oracle RAC 允许你将多个计算节点连接到一个共享的数据库实例中,从而提供了以下优势: 高可用性:Oracle RAC 提供了故…...
力扣 -- 44. 通配符匹配
解题步骤: 参考代码: class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//为了调整映射关系s s;p p;//多开一行多开一列vector<vector<bool>> dp(m1,vector<bool>(n1,false));//初始化//dp[0…...
电脑msvcp100.dll丢失的解决办法,靠谱的五个解决方法分享
在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“缺少xxx.dll文件”。而msvcp100.dll就是其中之一。那么,msvcp100.dll到底是什么呢?它对我们的计算机有什么作用?本文将从多个方面对msvcp100.dll进行…...
HTML+CSS+JS+Django 实现前后端分离的科学计算器、利率计算器(附全部代码在gitcode链接)
🧮前后端分离计算器 📚git仓库链接和代码规范链接💼PSP表格🎇成品展示🏆🏆科学计算器:1. 默认界面与页面切换2. 四则运算、取余、括号3. 清零Clear 回退Back4. 错误提示 Error5. 读取历史记录Hi…...
VS Code C# 开发工具包正式发布
前言 微软于本月正式发布Visual Studio Code C#开发工具包,此前该开发套件已经以预览版的形式在6月份问世。经过4个月的测试和调整,微软修复了350多个问题,其中大部分是用户反馈导致的问题。此外,微软还对产品进行了300多项有针对…...
【计算机网络】HTTPS 的加密流程
HTTPS (Hypertext Transfer Protocol Secure) 是一种安全的 HTTP 协议,采用了加密通信技术,可以保护客户端与服务器之间的数据传输安全,从而防止中间人攻击、窃听、篡改等恶意操纵。HTTPS 的加密流程包括以下几个步骤: 客户端发送…...
若依和芋道
国外卷技术,国内卷业务,做管理业务通常使用开源框架就可以快速满足,若依和芋道都是开源二开工具较为流行的框架,芋道是基于若依的,基本上是开发人员自己写业务开发框架的天花板,两者的前端都是基于vue-element-admin的,使用Gitee上两者的SpringBoot的最轻量化版本进行对…...
Linux流量监控
yum install -y iptrafiptraf-ng -d ens33...
高流量大并发Linux TCP性能调优
最近在使用jmeter做压测,当jmeter的并发量高的时候发现jmeter服务器一直报错Cannot assign requested address, 查看了一下发现系统中存在大量处于TIME_WAIT状态的tcp端口 netstat -n | awk ‘/^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}’ TIME_W…...
ATT 格式汇编语言语法
GNU 汇编器是 GNU 二进制实用程序 (binutils) 的一部分,也是 GNU 编译器集合的后端。尽管 as 不是编写相当大的汇编程序的首选汇编程序,但它是当代类 Unix 系统的重要组成部分,特别是对于内核级黑客攻击。 经常因其神秘的 AT&T 风格语法而…...
Linux系统编程学习 NO.8 ——make和Makefile、进度条程序
前言 今天是1024程序员节,不知不觉离第一次写博客已经过去了一年了。在此祝各位程序员不写bug,不再秃头。 make和Makefile 什么是make和Makefile? make和Makefile是软件开发时所用到的工具和文件。make是一个指令工具。Makefile是一个当前…...
elementUI 中 date-picker 的使用的坑(vue3)
目录 1. 英文显示2. format 与 value-format 无效3. date-picker 时间范围4. 小结 1. 英文显示 <el-date-pickerv-model"dateValue"type"date"placeholder"选择日期"></el-date-picker>解决方案: 引用 zhCn <script&g…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
