NFS (网络文件系统)

https://www.cnblogs.com/wahaha02/p/9559345.html

Linux网络文件系统的实现与调试
NFS协议
NFS (网络文件系统)不是传统意义上的文件系统,而是访问远程文件系统的网络协议。整个NFS服务的TCP/IP协议栈如下图所示,NFS是应用层协议,表示层是XDR,会话层是RPC,传输层同时支持UDP和TCP,网络层是IP协议。NFS/XDR/RPC等协议规范细节在《TCP/IP详解 卷1:协议》第29章有详细的描述,这里不再赘述。

经过多年的演进,NFS协议有多个版本,每个版本都有相应的RFC规范,如RFC1813。每个NFS的版本对比如下所示。

NFS通过NFS过程来对外提供服务。如下是RFC1813中定义的一组NFS过程。

null() 返回():不执行任何操作,有两个作用:相当于到服务器的ping,以及检测客户端和服务器间的RTT(Round Trip Time)。
lookup(dirfh, name) 返回(fh, attr):返回目录中一个指定文件的fhandle和属性信息。
create(dirfh, name, attr) 返回(newfh, attr):创建一个新文件并且返回它的fhandle和属性信息。
remove(dirfh, name) 返回(status):从指定目录中删除文件。
getattr(fh) 返回(attr):返回文件属性信息。这个调用类似于一个stat调用。
setattr(fh, attr) 返回(attr):设置一个文件的mode,uid,gid,size,access time,modify time属性。将文件大小设置为0相当于对文件调用truncate。
read(fh, offset, count) 返回(attr, data):从文件的offset偏移处开始,返回最多count个字节的数据。read操作也返回文件的属性信息。
write(fh, fh, offset, count, data) 返回(attr):向文件offset偏移处开始,写入count字节的数据,返回写操作完成后的文件属性信息。
rename(dirfh, name, tofh, toname) 返回(status):将dirfh目录中名为name的文件,重命名为tofh目录中名为toname的文件。
link(dirfh, name, tofh, toname) 返回(status):在tofh目录中创建名为toname的链接,指向dirfh目录中的name文件。
symlink(dirfh, name, string) 返回(status):在dirfh目录中创建一个名为name的符号链接。服务器不解释string的具体内容,而只是简单将其保存起来并且与符号链接文件相关联。
mkdir(dirfh, name, attr) 返回(fh, newattr):在dirfh目录中创建名为name的目录,并返回其fhandle和属性信息。
rmdir(dirfh, name) 返回(status):从dirfh中删除名为name的空目录。
readdir(dirfh, cookie, count) 返回(entries):从dirfh目录返回组多count字节的目录项信息。每个目录项信息包含了一个文件名,文件id,和一个由服务器解释的指向下一个目录项的指针cookie。cookie的作用是在后续readdir操作中从一个指定的位置返回目录项信息。cookie为0的readdir调用从目录的第一个目录项开始返回。
statfs(fh) 返回(fsstats):返回块大小、空闲块数等文件系统的信息。
NFS特性对比
NFSv3特性对比
V2支持的最大的文件大小为2GB(32bit),V3则更大(64bit)。
V2将每个READ和WRITE 过程可以读写的数据限制为8192个字节,V3则取消了限制。RPC的读写字节数只受TCP/IP限制。
V3引入新的NFS过程COMMIT,支持异步写,提高写性能。
V3引入新的NFS过程ACCESS,支持服务侧ACL访问权限检查。
V3引入新的NFS过程READDIRPLUS,其返回file handle和属性,这样可以减少LOOKUP的调用次数。
V3对RPC命令进行优化,每个影响文件属性的RPC都返回新的属性,这样可以减少GETATTR的调用次数。
NFSv4特性对比
V3是无状态的,V4开始支持状态。改善文件系统的异常恢复能力。
V4支持file delegation(客户端可以工作在本地副本,直到其他客户端请求同一个文件),改善文件系统一致性问题。
V4引入新的NFS过程COMPOUND,支持一个COMPOUND请求包含多个NFS过程。提高请求的表达能力,减少RPC请求的调用次数。
V4强制支持RPCSEC/GSS,改善文件系统的安全问题。
V4支持加密ACL,改善文件访问权限管理。
V4服务端为客户端支持统一的伪文件系统视图。服务端所有export目录都必须在一个伪文件系统root export目录下。
V3客户端的IP是自动适配的,V4客户端支持mount clientaddr参数,可以指定客户端特定的IP地址。
NFSv4.1特性对比
客户端可以并行访问存储设备。
支持多个服务端。
支持文件系统的元数据和数据分离。
delegation功能支持目录。
支持会话机制(session),改善断链、崩溃等异常恢复能力。
Linux NFS实现与实例
LInux NFS架构是典型的CS架构,其结构如下图所示。其中服务端应用程序主要由如下几部分组成:

portmap:端口映射器,主要功能是进行RPC程序的端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
rpc.mountd:NFS挂载守护进程,主要功能是实现NFS MOUNT协议,负责挂载/卸载NFS文件系统和权限管理。它会读取NFS的配置文件/etc/exports来对比客户端访问权限。挂载成功后,客户获得服务器文件系统的一个文件句柄(fh)。
rpc.nfsd:NFS服务端守护进程,是NFS服务的用户态部分,负责创建nfsd内核进程。需要提出的是,NFS服务的大部分功能都由nfsd内核进程处理。
可以看出NFS服务的大部分功能都是由内核模块实现的,除了图中所示的内核模块,内核还提供了几个内核守护进程:

nfsd:主要作用是处理NFS的RPC请求。
nfsiod:主要作用是为NFS客户端提供高效的缓冲机制,如预读、延时写等,从而改善NFS文件系统的性能。
rpciod:主要作用是作为RPC(远过程调用服务)的守护进程,用于从客户端启动I/O服务。

下图是一个NFS协议消息流图实例(点击见大图),包含了一些典型的网络文件系统操作场景,如:

服务注册过程
NFS挂载:mount 168.0.155.1:/datadisk0 /tmp
改变工作目录:cd /tmp
查看目录下文件:ls
读文件:more tail bootcfg.ini

Linux NFS调试
NFS应用程序调试
打开应用程序调试功能:

/usr/sbin/portmap -d
/usr/sbin/rpc.mountd -d all
/usr/sbin/rpc.nfsd -d -s

查看NFS配置与记录日志:

cat /etc/exports
cat /var/lib/nfs/rmtab
cat /var/lib/nfs/etab
cat /var/lib/nfs/xtab
cat /var/lib/nfs/state
tail /var/log/messages

NFS内核模块调试
打开NFS模块调试功能:

sysctl -w sunrpc.nfs_debug=2147483647
sysctl -w sunrpc.nfsd_debug=2147483647

查看NFS相关统计和日志:

cat /proc/slabinfo | grep nfs
/proc/fs/nfsfs/
nfsstat
dmesg

TCP/IP模块调试
打开RPC模块调试功能:

sysctl -w sunrpc.rpc_debug=2147483647

查看RPC相关统计和日志:

cat /var/run/portmap_mapping
cat /proc/net/rpc/nfs
cat /proc/net/rpc/nfsd

查看TCP/IP相关统计和配置:

ping // 查看网络情况
netstat -tpwn | grep 2049 // 查看NFS TCP链接
cat /proc/sys/net/ipv4/... // 查看网络配置,如tcp_retries2等
cat /proc/net/rpc/nfs
cat /proc/net/rpc/nfsd // deciles等字段
cat /proc/net/snmp // IP: ReasmFails等字段

网络抓包:

tcpdump -s 9000 -w /tmp/dump.out port 2049

其他
nfs-utils移植
./configure
CC=XX-gcc
--build=$(./config.guess)
--host=mips64-unknown-linux-gnu
LDFLAGS="-L/usr/local/lib"
CPPFLAGS="-I/usr/local/include"
--disable-tirpc --disable-gss --disable-uuid --without-tcp-wrappers --with-gnu-ld

make

make install

文件系统导出条件
由NFS导出的文件系统由配置文件/etc/exports配置,可以导出的文件系统需要满足如下2个条件:

文件系统必须有一个设备号(需要有FS_REQUIRES_DEV,即存储设备)或FSID号(需要有NFSEXP_FSID 或 ->uuid)。
文件系统必须支持s_export_op接口。而支持s_export_op接口的文件系统都是存储设备文件系统,如ext3/4、ubifs等。其他文件系统如rootfs、ramfs、sysfs等是不支持的。

NFS (网络文件系统)的更多相关文章

  1. Linux系统NFS网络文件系统

    Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...

  2. NFS 网络文件系统挂载在A8板子上

    我承认自己是菜鸟,没什么网络知识就来搞挂载nfs网络文件系统,花费了5天的时间才把nfs网络文件系统成功挂载在A8板子上,实现了A8板子和虚拟机的文件共享.分享一下个人经验: 以下是基于nfs已经完成 ...

  3. [学习嵌入式开发板]iTOP-4412实现NFS网络文件系统

    本文转自迅为:http://www.topeetboard.com 学习平台:iTOP-4412开发板 本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统. 我们使用的软硬件环境是 ...

  4. NFS(网络文件系统的搭建)

    关于NFS的原理,我在这就不概诉了,其实非常简答的理解就是一个网络磁盘,你需要把它挂载到你的磁盘上使用而已.那接下来谈谈如和搭建NFS网络文件系统. 需要使用2台机器作此实验,我分别配置IP为192. ...

  5. 三者互ping,PC,虚拟机,uboot,nfs网络文件系统搭建

    要想实现三者互ping,韦老师虽然专门出了视频说明,但是在自己配置过程还是出现了问题,这里记录一下解决办法,虽然我也不知道原因,但是解决了出现的问题也实现了三者互ping. 首先,我的硬件设备是PC通 ...

  6. Linux系统——NFS网络文件系统

    在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资 ...

  7. NFS网络文件系统的配置

    NFS网络文件系统的配置 NFS网络文件系统 NFS(network file system)网络文件系统.一种使用于分散式文件协定,有SUN公司开发.功能是通过网络让不同的机器.不同的操作系统能够分 ...

  8. Linux基础学习-NFS网络文件系统实时文件共享

    NFS网络文件系统 如果大家觉得Samba服务程序的配置太麻烦了,那么你共享文件的主机都是Linux系统,那么推荐大家在客户端部署nfs服务来共享文件.nfs(网络文件系统)服务可以将远程Linux系 ...

  9. Centos6.6 安装nfs网络文件系统

    一.介绍 nfs网络文件系统的,大部分用在内网文件共享,比如,对集群上传文件做共享,经常用在图片部分,当然数据量大了还是要做分离,做为专门的接口比较好,介绍一下基本安装环境: 1)Cnetos6.6 ...

  10. linux初学者-NFS网络文件系统篇

    linux初学者-NFS网络文件系统篇 在上一篇的SAMBA篇中介绍了linux系统和windows系统之间共用的网络文件系统CIFS,主要用于客户端是windows的情况.在linux系统之间,所用 ...

随机推荐

  1. (5)ASP.NET Core 中的静态文件

    1.前言 当我们创建Core项目的时候,Web根目录下会有个wwwroot文件目录,wwwroot文件目录里面默认有HTML.CSS.IMG.JavaScript等文件,而这些文件都是Core提供给客 ...

  2. ACM用到的算法。先做个笔记,记一下

    ACM 所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 ...

  3. Centos7 下安装 RabbitMQ

    安装 erlang 1.下载erlang 官网地址 http://www.erlang.org/download 挑选合适的版本 然后 wget 比如目前最新版本 19.3 运行命令 wget htt ...

  4. 【gradle】mac上安装gradle

    根据gradle官网指导,一步一步安装即可 https://gradle.org/install/ 或者,如果你没有办法墙出去,或者本地使用命令下载gradle比较慢的话,可以采用下面的方式 ==== ...

  5. Blazor——Asp.net core的新前端框架

    原文:Blazor--Asp.net core的新前端框架 Blazor是微软在Asp.net core 3.0中推出的一个前端MVVM模型,它可以利用Razor页面引擎和C#作为脚本语言来构建WEB ...

  6. C++与Java语法上的不同

    最近学习算法和刷题基本都是用C++写的程序,在这个过程中,发现C++和Java在语法上有很多相同点,但也有很多不同点,而这些不同点对于已经掌握Java的程序员来说,理解C++代码可能会有些吃力甚至困难 ...

  7. poj 1694 An Old Stone Game 树形dp

    //poj 1694 //sep9 #include <iostream> #include <algorithm> using namespace std; const in ...

  8. Effective C++ 条款九、十 绝不在构造和析构过程中调用virtual函数|令operator=返回一个reference to *this

      1.当在一个子类当中调用构造函数,其父类构造函数肯定先被调用.如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始 ...

  9. spinlock,mutex,semaphore,critical section的作用与差别

    某年深信服的笔试题,考的就是多线程的同步.简单的解释下方便记忆: 1.spinlock:自旋锁.是专为防止多处理器并发而引入的一种锁. 2.mutex:相互排斥量. 仅仅有拥有相互排斥对象的线程才有訪 ...

  10. poj 3105 Expectation 按位统计

    题意: 给n,求sum(i^j)/(n^2),0<=i,j<n.n<10^9 分析: 暴力n^2算法肯定超时.这是logn按位统计算法:按位先算出0出现的个数x,则1出现的个数为n- ...