Linux网络文件系统的实现与调试

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

Linux网络文件系统的实现与调试

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

Linux网络文件系统的实现与调试

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架构,其结构如下图所示。其中服务端应用程序主要由如下几部分组成:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxysy.html