本文是作者在使用NFS过程中出现了一些问题,经过查询资料、翻译以及自己跟踪代码,写下本片博文。NFS V3和NFS V4都有说明,如果首次使用,建议直接NFS V4。由于作者知识有限,如果有错误或者未提及的地方,请见谅!
章名 | 摘要 |
---|---|
第1章 NFS功能介绍 | 介绍了NFS的定义、优缺点、nfs-utils-1.3.4新增特性以及主要工作原理 |
第2章 NFS源码包介绍 | 介绍了源码包的组成、获取、构建 |
第3章 组件介绍 | 介绍相关命令的作用和语法 |
第4章 NFS应用 | 介绍NFS文件系统的部署和使用 |
第5章 F&Q | 记录使用时出现的问题 |
1、NFS功能介绍
1.1、 定义:
NFS(Network File System)网络文件系统,是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配文件系统。最早由SUN公司开发,目前已成为文件服务的一种标准(RFC1904 RFC1813)。其最大的功能是可以通过网络,让不同操作系统的计算机可以共享数据,所以也可以看作是一个文件服务器。NFS除了SAMBA之外windows与linux及unix与linux之间通信的方法。NFS只是一种文件系统,本身没有传输功能,是基于RPC服务实现的,才能达到两个linux系统之间的文件目录共享。NFS采用C/S模型,提供资源的一端充当服务器,消费资源的一端充当客户端。
在linux系统中,NFS服务端和客户端都需要内核的支持,还需要有用户态程序进行配置和管理。nfs-utils就是用户态NFS配置管理工具包,它提供了一系列服务端和客户端的配置和管理。
1.2、优点:
- 节省本地存储空间,对于大家都经常用到的资源,可以保存到NFS服务器上,大家通过网络去访问,不需要再本地留一份拷贝;
- 节省移动介质设备数量,有了NFS,不需要用移动介质拷贝,只需要将移动设备上的资源放到一些软盘,光盘等这些介质上,从而有效减少移动介质数量;
1.3、缺点:
- NFS在高并发场景和大存储下不适合,需要使用分布式存储MFS、FastDFS、TFS等;
- 客户端的数据都是明文传输,并且没有用户认证机制,安全性一般,所以建议一般在局域网中使用;
- 容易发生单点故障,即server服务宕机所有的客户端都不能访问;
1.4、nfs-utils-1.3.4新增特性
nfs-utils-1.3.4是最新的NFS版本,支持NFS V4。稳定版nfs-utils-1.3.4-2.1,测试版nfs-utils-1.3.4-2.4。由IETF RFC3530描述,基于NFS V2和NFS V3版本,增加了一些新的特性,并且随着版本更新对NFS V4的支持在不断完善。
NFS V4的目标是建立一个快速故障恢复、传输协议独立、操作系统和文件系统独立、简单和分布式文件系统,它有如下新特性:
- 增强的安全特性。支持RPCSEC-GSS和使用身份映射访问远程域。NFS V3的安全性一直是大家诟病的地方,虽然在大量使用,但其安全隐患常常让使用他的人心存顾虑。NFS V4在这方面做了增强,可以通过配置来使用RPCSEC-GSS方式的身份认证,从而提高协议的安全性。另外,NFS V4还提供了Kerberos 5的安全机制。
- 文件加锁功能改为在NFS核心协议中实现。rpc.lockd、rpc.mountd、rpc.statd将不在NFS V4中使用(但是仍然存在于linux 操作系统中,以支持NFS V2和NFS V3),这种实现也将使NFS 服务器配置防火墙更加简单。
- NFS V4只支持TCP协议,UDP不在NFS V4中支持。
- NFS V4支持ACL功能。
- 原子操作的加强。NFS 客户端和服务器是通过RPC服务来进行的,NFS V4支持复合的RPC请求,即一个RPC请求可以携带多个操作,这样,NFS 客户端可以通过一次RPC请求操作完成查找、打开、读/写等。这些操作没有逻辑上的与、或关系,而是由服务端按顺序处理,如果其中一个操作失败,整个RPC请求就返回,使操作的原子性加强。
- 状态机制的引入。NFS V4中客户端对文件操作时,在文件锁中增加了一种状态。这个状态基于时间租用机制。NFS服务器为客户端指定了租赁周期,如果客户端在指定时间内没有更新自己的状态,则服务器会释放这个客户端的所有状态,并默认客户端不可达。在客户端对文件操作时,服务端也会赋予一个状态编号,表明文件正在被哪个客户端进行哪种操作。
- 委派。NFS V3中,客户端通常当做它们已经打开的文件之间存在竞争。客户端通过频繁的向服务端发送请求来查找该文件是否被其他人修改,系统保持了较弱的一致性,这会造成比较高的网络流程并产生一定的延迟。在客户端操作文件时,所有写I/O必须同步,这样会影响客户端性能。
但是在NFS V4中,允许服务端的文件委派给客户端,以便实现更加积极的客户端数据缓存并允许缓存锁定状态。服务器通过委派来放弃对文件的更新和客户端的锁定状态的控制。通过允许客户端在本地进行不同的操作和数据缓存,减少了延迟。目前有读和写两种委派。服务端在存在文件竞争时可以从客户端调回委派。一旦客户端具有委派,它就能在本地缓存数据上进行操作,以避免网络延时并优化I/O。
1.5、工作原理之RPC
NFS支持的功能非常多,而不同的功能都会使用不同的端口来启动,所以我们先介绍下NFS中最重要的一个服务框架—远程过程调用(Remote Procedure Call):
NFS每启动一个功能都会启用一些端口来传输数据,因此NFS这么多功能所用的端口才没有固定,而是采用随机一些小于724的端口来作为传输之用,但如此以来又造成了客户端访问服务器的困扰,因为客户端需要知道服务器的相关端口才能够联机,当NFS的进程启动时都会向RPC注册自己的服务端口,PID以及所监听的IP等信息,所以RPC就知道每个服务与对应的端口等信息,而RPC本身则使用111端口作为监听客户端的请求并回报客户端正确的端口。也就是因为这样,启动NFS服务进程之前,必须要先启动RPC服务,否则NFS无法向RPC注册。另外,重新启动RPC时原本注册的信息会不见,因此RPC重新启动后它管理的所有服务都需要重新启动完成RPC注册。
所谓的Remote Procedure Call,就是在本地调用远程主机上的Procedure,比如在本地cat 命令时,会发起某些系统调用如open,read,close等,并将cat的选项和参数传递给这些函数,于是最终实现了文件的查看功能。在RPC层面理解,上面发起的系统调用就是Procedure,每个Procedure对应上面一个或多个功能
2、NFS源码包介绍
2.1、NFS功能代码分四个部分,nfs-common、rpcbind、nfs-kernel、其他与nfs-utils有关的软件包
- nfs-common:支持nfs用户态server以及client,也就是常见的nfs-utils以及rpcbind源码包,这个包包含lockd, statd, showmount, nfsstat, and mount.nfs.;
- rpcbind:旧版本为portmap,提供RPC通讯服务;
- nfs-kernel-server:NFS内核服务器目前是Linux使用的推荐NFS服务器,具有NFSv3和NFSv4、通过GSS支持Kerberos等功能。它也比用户空间nfs服务器快得多,通常也更可靠。然而,调试比用户空间服务器更困难,并且具有稍微不同的功能集。这个包包含使用NFS内核服务器所需的用户空间支持,包括/usr/sbin/exportfs、/usr/sbin/rpc.mountd、
/usr/sbin/rpc.nfsd组件; - 其他与nfs-utils有关的软件包:编译时候会提示出来,构建架构特定包依赖和构建架构特色包依赖;
2.2、源码获取
nfs-common、nfs-kernel-server可以从这获取,支持多种硬件架构https://packages.qa.debian.org/n/nfs-utils.html
rpcbind,支持多种硬件架构:https://packages.debian.org/jessie/rpcbind
其他与nfs-utils有关的软件包:编译提示缺少什么,就下载对应包
2.3、构建过程
每个下载的包,都有个README文档