您的位置:首页 > 其它

分布式文件系统:NFS(3)

2016-05-14 21:10 162 查看
四、NFS

NFS(Sun Network File System)最初为SUN(不知道有这个公司?上百度或google查查看)提供,后移植到Linux等其他平台。其接口都已经标准化,如NFS version 3接口由RC1813定义,NFS version 4接口由 RFC3530定义。

NFS的主要特性有:1)竭力兼容Unix文件系统接口;大部分用户在操作文件的时候,可以不用关心目标文件是位于NFS远端服务器上,还是本地磁盘上。2)文件存储载体对用户透明;当客户端机器完成对服务器输出文件目录的导入之后,远端文件夹就表现的跟本地文件夹基本一样。3)服务器不维护关于客户端的状态信息。每一种客户端文件操作,并不受上次文件操作的影响。举例来说,在stdio库中,FILE数据结构保存有打开的文件句柄,记录当前读写文件位置。在NFS服务器端,并没有类似的设施。

1 架构

下图是NFS原始架构图。在LINUX实现中,大体依旧如此。先解释一下图中的几个术语:

VFS(虚拟文件系统):LINUX支持多种文件系统,它们都通过VFS层向上提供统一的文件系统调用。

RPC(远程过程调用):接口实现(如文件内容存储、读取、磁盘空间管理等)在远端服务器上。服务器通过某种网络协议向用户(可以在另一台机器上)暴露所实现的接口。RPC执行过程简述如下:用户程序调用某RPC接口,本地RPC运行时库负责解析、打包RPC接口名,参数类型及参数值;并将打包封装好的数据包通过网络传送到远端服务器。服务器端的RPC运行时库接受并解析数据包,调用服务器端的RPC接口实现。调用结果按照相反的方向返回给用户程序。



假设用户针对一个NFS文件发起文件操作如read或write,相应的系统调用会通过VFS层传到NFS底层实现。NFS底层会将该文件操作通过RPC输送至远端NFS文件服务器。NFS文件服务器负责处理这个文件操作,并向用户返回操作结果。

2 客户端

客户端需要挂载服务器公布的文件目录,并获得在这些文件目录中的文件操作权限。例如

mount server1.mydomain.com:/exported/directory /mnt/srv1dir


兹后,此客户端上的应用程序就可以如同访问本地文件一样访问服务器公布的文件夹。

3 服务器

NFS文件保存在服务器的本地文件系统中。从服务器看,这些文件都是普通的本地文件。服务器通过exportfs命令来对外公布一个文件目录,客户端在引入这个目录后,就可以集在该目录下面进行文件操作。

exportfs通常读取一个配置文件,并据此确定公布的目录,以及用户文件操作的权限。下面就是一个配置文件的例子。在这个例子中,服务器公布的目录为/exported/directory,客户端可以是client1.mydomain.com;

/exported/directory client1.mydomain.com(rw, sync)


在服务器上,几个后台进程会启动起来,执行不同的任务。例如nfsd负责处理客户端发送过来文件操作;mountd会处理客户端的mount命令。

4. 文件锁

如前所述,NFS服务器端并不维护文件读写状态;而文件是否上锁以及锁类型就是一类文件读写状态。这样NFS必须提供额外的服务,来提供文件锁功能。这是由服务器的后台进程lockd来实现的。flock操作最终由lockd来处理,在服务器端对文件实现锁操作。

这种实现方式有一个潜在的问题,如果服务器出现故障,如崩溃后重启,客户端所请求的文件锁都将失去,并且客户端没有办法知道它的文件锁已经丢失这个事实。为了使服务器与客户端能够在文件锁信息方面取得一致,服务器端和客户端均有statd这样一个后台进程。在客户端statd会记录用户获取的文件锁。当服务器重启后,服务器上的statd会与客户端上的statd通信,取得客户端所获取的文件锁。这样客户端就可以重新获得这些文件锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: