本文引用部分为从原书中摘抄或者整理改写的部分
NFS(Network File System)顾名思义,就是网络文件系统,最大的功能就是可以通过网络,在不同的机器,不同的操作系统共享彼此的文件。
在使用上,可以将远程服务器上的目录挂载到客户端的文件系统中,在使用上像一个本地磁盘,非常方便。
可以用一张图比较直白的说明
- 客户端向服务器的portmap(RPC服务)进程询问端口号,portmap维护一张进程与端口号的对应关系表,而portmap的端口号111是已知的(NFS的端口号默认为2049,所以其实这部有时候可以跳过portmap直接连接NFS)
- 客户端尝试连接NFS进程判断是否能够成功连接(没有被防火墙拦截,确保NFS服务已经启动)
- 客户端再次询问portmap,询问mount进程的端口号(mount进程端口号比较随机,所以改步询问不能跳过)
- 客户端尝试连接mount进程判断是否能够成功连接(没有被防火墙拦截,确保mount进程已经启动)
- 挂载目录。挂载成功后,服务器将该目录的file handle告诉客户端
- 再次测试NFS进程(这一步是否有必要?从询问mount到挂载目录NFS是否有挂掉的可能?)
- 客户端获得了该文件系统的大小和使用率等属性
- 客户端校验是否能进入某目录,服务器同意请求
- 客户端请求获取文件以及File Handle,服务器返回客户端需要的信息(NFS操作文件用的是file handle)
- 客户端请求服务器获取目标文件属性
- 客户端请求打开打开文件,重复发起多个READ Call(等上一个READ Call收到回复后发送),直到读完整个文件。
在高性能环境下需要手动指定每次READ Call发送的数据大小
mount -o rsize=num server:path
- 客户端校验是否能进入某目录,服务器同意请求
- 校验文件是否存在,如果存在会询问是否覆盖源文件
- 客户端请求创建文件,服务器创建完返回file Handle
- 开始多次写入
async写入时,在WRITE Call之后就会回复WRITE Reply,实际上存盘操作未完成,只有在commit操作时才会有
sync写入,WRITE Call与WRITE Replay交替出现,必须等到WRITE Call收到Replay之后才会发送下一个
wsize限制发送的长度- commit操作,询问服务器是否已经保存
- 客户端申请查看文件属性
使用noac参数发现了明显的性能下降问题,在RFC中有说明,noac让客户端不缓存文件属性,并没有进一步的说明。经过抓包可以分析出原因。