什么是网络文件系统?
网络文件系统(Network File System, NFS)实现了一种软件协议,能将远端的文件系统映射到本地,使用者访问网络上的文件就像在使用自己的计算机一样。远端是专属存储系统,通常称为NAS存储。比较出名的网络文件系统的实现包括Sun公司的NFS,微软的CIFS(Common Internet File System)等,网络文件系统的访问示意图如下:
图1 网络文件系统挂载示意图
网络文件系统协议实现了将远端的目录树映射到本机,成为本机目录树种的一颗子树。一个实现合格的网络文件系统,实现了文件操作接口的POSIX(Portable Operating System Interface X)语义,从而使用户操作操作网络文件系统像操作本地文件系统一样,用户不会感知到操作的文件或文件夹实际存储在远端。
网络文件系统的实现也分为,客户端和服务端两部分。其中,客户端实现与本地文件系统的实现类似,其主要差异是访问数据的时候,并不是访问本地磁盘设备,而是遵从一定的协议,通过网络访问F服务端。服务端负责处理客户端的访问请求,将对应的数据和元数据保存在磁盘上。
网络文件系统的关键技术:
(1)远程过程调用,RPC协议
网络文件系统客户端与服务端之间的交互是通过一定的网络协议如NFS协议实现的。网络协议是通过函数调用的方式定义,主要内容包括ID、参数和返回值等。为降低协议封装、解析的复杂性,通常会在文件提业务层与TCP/IP层之间封装一层交互实现,称之为RPC协议。RPC(Remote Procedure Call)是一种远程调用协议,它基于Socket,位于OSI模型中会话层,客户端可以调用远程服务器上的程序或方法,并获取返回结果。
具体地,在客户端调用RPC函数时,会调用RPC库的接口将该函数转化为网络消息转发到服务端,服务端的RPC库对网络包进行解析,调用服务端注册的函数集中的函数来实现功能,然后再将执行的结果返回给客户端。
图2 RPC协议架构示意图
(2)文件系统协议
网络文件系统本质上是一个基于C/S(客户端/服务端)架构的应用,其文件系统功能是通过客户端与服务端的交互来实现的。对于网络文件系统来说,其核心是之一是服务端与客户端的交互语言,文件系统协议。
网络文件系统的协议定义类似于函数调用,包含ID,参数和返回值。
NFS协议,是SUN公司设计的网络文件系统协议,默认是*unix系统之间提供服务。包含3个版本,即1984年的NFSv2、1995年的NFSv3和2000年的NFSv4。它所有的读写都是由内核负责,因此其IO性能比较高。
表1 部分NFSv3协议命令
命令 | ID | API | 说明 |
LOOKUP | 3 | - | 查找文件 |
READ | 6 | read | 读取数据 |
WRITE | 7 | write | 写入数据 |
CREATE | 8 | create/open | 创建一个常规文件 |
MKDIR | 9 | mkdir | 创建一个目录 |
REMOVE | 12 | remove/unlink | 删除一个常规文件 |
RMDIR | 13 | rmdir | 删除一个目录 |
SMB是Server Message Block是微软公司设计的网络系统协议,默认在Windows系统之间提供服务。包括SMB1.0,SMB2.0,SMB3.0版本。
表2 部分SMB2.0协议命令
命令 | ID | 说明 |
CREATE | 0x005 | 创建一个文件 |
CLOSE | 0x006 | 删除一个文件 |
FLUSH | 0x007 | 刷新缓存 |
READ | 0x008 | 读取数据 |
WRITE | 0x009 | 写入数据 |
QUERY_DIRECTORY | 0x00e | 查询目录 |
QUERY_INFO | 0x0010 | 查询文件和命名管道对象 |
由此可见,无论哪种协议,都有一组与文件系统语义对应的协议命令。客户端对文件系统的操作,都会通过网络文件协议封装转发到服务端,实现对文件的操作。
网络文件系统的优势:
如上,对网络文件系统的访问需要通过网络,其时延比本地文件系统大,但网络文件系统也有其优势,适合在一些场景中应用:
1. 适合做数据共享。网络文件系统可以挂载在多个客户端,从而实现在多个客户端之间的数据共享。
2. 存储空间大。网络文件系统服务端往往使用具有大存储空间的存储设备实现,具备海量的存储空间,远远大于本地文件系统。
3. 可靠性高。网络文件系统服务端作为专用的存储系统,以一定的技术手段,如多副本等方式实现了数据的高可靠。