NFS服务器的工作原理
http://cn.linux.vbird.org/linux_server/0330nfs.php#What_NFS_NFS
1. NFS
NFS是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配远程文件系统。其最大功能是可以通过网络让不同操作系统的计算机可以共享数据,所以也可以将其看做是一台文件服务器。
客户端PC可以挂在NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm 及 df 等与磁盘相关的命令。NFS 有属于自己的协议与使用的端口号,但是在传送资料或者其他相关信息的时候,NFS 服务器 使用一个称为“远程过程调用”(Remote Procedure Call,RPC)的协议来协助 NFS 服务器本身的运行。
2. RPC
- RPC最主要的功能就是指定每个NFS功能所对应的port number, 并且回报给客户端,让客户端可以连接到正确的端口上去。当服务器在启动NFS时会随机取用数个端口,并主动向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC是固定使用port 111来监听客户端的需求并回报客户端正确的端口。
所以你要注意,要启动NFS之前,RPC就要先启动了,否则NFS会无法向RPC注册。另外,RPC若重新启动时,原本注册的数据会不见,因此RPC重新启动后,它管理的所有服务都需要重新启动来重新向RPC注册。
如上图所示,当客户端有NFS档案存取需求时,它会如何向服务器端要求数据呢?
1、客户端会向服务器端的RPC(port 111)发出NFS档案存取功能的询问要求;
2、服务器端找到对应的已注册的NFS daemon端口后,回报给客户端;
3、客户端了解正确的端口后,就可以直接与NFS daemon来联机 。
由于NFS的各项功能都必须要向RPC来注册,如此一来RPC才能了解NFS这个服务的各项功能之port number, PID,NFS在服务器所监听的IP等。而客户端才能够透过RPC的询问找到正确对应的端口。也就是说,NFS必须要有RPC存在时才能成功的提供服务,因此我们称NFS为RPC server的一种。此外,由上图可知,不论是客户端还是服务器端,要使用NFS时,两者都需要启动RPC才行。
3. NFS 启动的RPC daemons
NFS 服务器主要的任务是进行文件系统的分享, 文件系统的分享则与权限有关。所以NFS服务器启动时至少需要两个daemons, 一个管理客户端是否能够登入的问题,一个管理客户端能够取得的权限。如果你还想要管理quota的话,那么NFS还得要再加载其他的RPC程序就是了。我们以较单纯的NFS服务器来说:
(1)rpc.nfsd:
最主要的NFS服务器服务提供商。这个daemon主要的功能就是在管理客户端是否能够使用服务器文件系统挂载信息等,其中还包含这个登入者的ID的判别。
(2)rpc.mountd:
这个daemon主要的功能,则是管理NFS的文件系统。当客户端顺利的通过rpc.nfsd而登入服务器之后,在他可以使用NFS服务器提供的档案之前,还会经过档案权限的认证程序。他会去读NFS的配置文件/etc/exports来比对客户端的权限,当通过这一关后客户端就可以取得使用NFS档案的权限了。
(3)rpc.lockd(非必要)
用在管理档案的锁定用途。既然分享的 NFS 档案可以让客户端使用,那么当多个客户端同时尝试写入某个档案时,就可能对于该档案造成一些问题。这个rpc.lockd可以用来克服这个问题。但rpc.lockd必须要同时在客户端与服务器端都开启才行。
(4)rpc.statd(非必要)
可以用来检查档案的一致性,与 rpc.lockd 有关。若发生因为客户端同时使用同一档案造成档案可能有所损毁时,rpc.statd 可以用来检测并尝试回复该档案。 与rpc.lockd 同样的,这个功能必须要在服务器端与客户端都启动才会生效。
上述这几个RPC所需要的程序,其实都已经写入到两个基本的服务启动脚本中了,那就是nfs以及nfslock,也就是在 /etc/init.d/nfs, /etc/init.d/nfslock, 与服务器有关的写入在nfs服务中,而与客户端的rpc.lockd之类的就设定在nfslock服务中。