NFS(Network Files system)是网络文件系统,它能够在不同的 Linux/UNIX系统上使用,以达到文件的共享。本章将介绍有关网络文件系统 NFS 的知识。
NFS:实现类unix之间的通信(linux<——>linux、linux<——>unix、unix<——>unix)

NFS版本及差别
NFS协议从诞生到现在为止,已经有多个版本,如NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010)。
V3相对V2的主要区别:
1、文件尺寸
V2最大只支持32BIT的文件大小(4G),而NFS V3新增加了支持64BIT文件大小的技术。
2、文件传输尺寸
V3没有限定传输尺寸,V2最多只能设定为8k,可以使用-rsize and -wsize 来进行设定。
3、完整的信息返回
V3增加和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处。
4、增加了对TCP传输协议的支持
V2只提供了对UDP协议的支持,在一些高要求的网络环境中有很大限制,V3增加了对TCP协议的支持
5、异步写入特性
6、改进了SERVER的mount性能
7、有更好的I/O WRITES 性能。
9、更强网络运行效能,使得网络运作更为有效。
10、更强的灾难恢复功能。

 

异步写入特性(v3新增加)介绍:
NFS V3 能否使用异步写入,这是可选择的一种特性。NFS V3客户端发发送一个异步写入请求到服务器,在给客户端答复之前服务器并不是必须要将数据写入到存储器中(稳定的)。服务器能确定何时去写入数据或者将多个写入请求聚合到一起并加以处理,然后写入。客户端能保持一个数据的copy以防万一服务器不能完整的将数据写入。当客户端希望释放这个copy的时候,它会向服务器通过这个操作过程,以确保每个操作步骤的完整。异步写入能够使服务器去确定最好的同步数据的策略。使数据能尽可能的同步的提交何到达。与V2比较来看,这样的机制能更好的实现数据缓冲和更多的平行(平衡)。而NFS V2的SERVER在将数据写入存储器之前不能再相应任何的写入请求。

V4相对V3的改进:
1:改进了INTERNET上的存取和执行效能
2:在协议中增强了安全方面的特性
3:增强的跨平台特性

同步I/O和异步I/O(应用支持)
在同步IO中,进程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后继续执行。
而异步IO方式中,进程发送一个IO请求到内核,然后继续处理其他的事情,内核完成IO请求后,将会通知进程IO操作完成了。

RPC(远程进程调用):NFS调用RPC进程端口号实现通信

NFS需要启动的DAEMONs:
rpc.nfsd:登录权限检测
rpc.mountd:负责NFS的文件系统,当client端通过rpc.nfsd登录SERVER后,对client存取server的文件进行一系列的管理
NFS SERVER在REDHAT LINUX平台下需要两个套件:nfs—utils和portmap
nfs-utils:提供rpc.nfsd及rpc.mountd这两个NFS DAEMONS的套件
portmap:NFS其实可以看作是一个RPC SERVER POROGRAM,而要启动一个RPC SERVER PROGRAM,都要做好port的对应工作,而且这样的任务是portmap完成的。通俗的说portmap就是用来做PORT的mapping的

 
 
NFS 的工作原理
1 NFS 服务共享目录,目录的权限检查
2 NFS 服务器使用 RPC 协议进行数据的传输
3 、服务器上启动一堆 RPC 的服务、进程、端口
4 portmap 启动一个 111 端口,客户端连接服务器的时候需要连接 111 端口
5 portmap 会把访问 111 端口的数据发送给 RPC 服务对应的端口
6 、因此只需要把 111 端口和 portmap 进程共享出去
 
 
NFS 配置文件 /etc/exports
 
/etc/exports这个文件,设定格式如下:
欲分享出去的目录 主机名称1或者IP1(参数1,参数2) 主机名称2或者IP2(参数3,参数4) 
 
上面这个格式表示,同一个目录分享给两个不同的主机,但提供给这两台主机的权限和参数是不同的,所以分别设定两个主机得到的权限。
 
Exports文件中可以设定的参数主要有以下这些: 
参数                                                说明
 
r o                            该主机对该共享目录有只读权限
r w                            该主机对该共享目录有读写权限
r oot_squash            客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
n o_root_squash       客户机用root访问该共享文件夹时,不映射root用户
a ll_squash                客户机上的任何用户访问该共享目录时都映射成匿名用户
a nonuid                    将客户机上的用户映射成指定的本地用户ID的用户
a nongid                    将客户机上的用户映射成属于指定的本地用户组ID
s ync                         资料同步写入到内存与硬盘中
a sync                       资料会先暂存于内存中,而非直接写入硬盘
i nsecure                   允许从这台机器过来的非授权访问
 
主机可以使用以下格式。  
1 )单个机器:一个全限定域名(能够被服务器解析)、主机名(能够被服务器解析)或 IP 地址。  

2)使用通配符来指定的机器系列,使用 * ?字符来指定一个字符串匹配。IP地址中不使用通配符。如果反向DNS查询失败,它们可能会碰巧有用。在完整域名中指定通配符时,点(.)不包括在通配符中。例如,*.example.com包括one.example.com,但不包括one.two.example.com. 

3 IP 网络:使用 a.b.c.d/z a.b.c.d 是网络, z 是子网掩码中的位数(如 192.168.0.0/24 )。另一种可以接受的格式是 a.b.c.d/netmask a.b.c.d 是网络, netmask 是子网掩码(如 192.168.70.8/255.255.255.0 )。
 
exportfs 命令:  
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下: 

exportfs [-aruv] 

-a :全部mount或者unmount /etc/exports中的内容 
-r :重新mount /etc/exports中分享出来的目录 
-u :umount 目录 
-v    在export的时候,将详细的信息输出到屏幕上 
具体例子: 
[root @test root]# exportfs -rv <==全部重新 export 一次! 
exporting 192.168.1.2:/root/share 
exporting *.test.com:/home/ylw
exporting *.test.com:/home/share
reexporting 192.168.1.100:/home/test to kernel 
exportfs -au <==全部都卸载了。