一、NFS服务的简介
NFS 是 Network File System 的缩写,是Sun公司于1984开发的一种分布式文件系统协议。它的核心功能就是可以通过网络,让不同的客户端,可以彼此访问共同的文件系统,来实现文件的共享。像许多其他的协议,建立在开放的网络计算的远程过程调用(RPC)之上。NFS是在RFC中定义的开放标准,允许任何人实现该协议。
NFS 服务器可以让客户端将网络远程的 NFS 服务器分享的目录,直接挂载到本地端的机器当中。本地端的机器通过直接读写挂载的目录,就可以同步到NFS服务器之上。
版本更迭
- NFS V2
2是NFS最早实现的版本之一,基于UDP协议实现了一个无状态的服务器版本。仅仅支持32位的系统,且不大于2GB的文件。 - NFS V3
3的版本在2的基础之上做了大量的改进。支持了大于2GB的文件读写,使用了TCP协议来进行数据交互,支持了客户端的异步读写来提高文件系统的性能(同时也会产生我们头疼的一致性问题) - NFS V4
4的版本提高了安全性,通过TCP协议实现了一个有状态的服务器版本,通过锁租约的机制来实现多客户端的读写同步。在4.1版本引入了pNFS,通过类似于一个HDFS架构来提供并行的一个分布式文件系统。
二、系统环境
系统平台: Ubuntu 14.04
NFS Server IP: 192.168.1.2
iptables关闭: Firewall is disable.(NFS端口使用在默认情况下是不固定,所以若配置NFS服务器需要搭配防火墙使用的话,请配置固定端口)
SELINUX=disabled
三、NFS服务器的安装
NFS的安装只需要安装rpcbind与nfs-server就可以对外提供服务了。
- rpcbind
NFS 服务都是通过 RPC 来具体实现的,所以要正常使用NFS服务,需要启动 rpcbind来实现端口的映射工作 。执行如下命令,安装并启动rpcbind
sudo apt-get install rpcbind
- nfs-kernel-server
提供nfs服务器的软件,提供文件系统的完整功能。这里要提醒一下,NFS服务器会直接使用到内核的模块,所以内核必须要支持 NFS 才行。如果操作系统的版本是自行编译的内核的话,需要注意编译NFS的内核支持。
sudo apt-get install nfs-kernel-server
四、NFS服务器的配置
NFS服务器的主要配置文件就是:/etc/exports
。不过这个配置文件不一定会存在,可能需要使用 vim 主动新建这个文件。
/etc/exports
文件由以下选项构成:
共享的目录 主机名或IP(参数1,参数2...参数N)
每一行最前面是要分享出来的目录,目录可以依照不同的权限分享给不同的主机。若权限参数不止一个时,则以逗号 (,) 分开。且主机名与小括号是连在一起的喔!其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay
,当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
下面是一些NFS共享的常用参数:
- 访问权限选项
设置输出目录只读:ro
设置输出目录读写:rw - 用户映射选项
all_squash
:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);no_all_squash
:与all_squash取反(默认设置);root_squash
:将root用户及所属组都映射为匿名用户或用户组(默认设置);no_root_squash
:与rootsquash取反;anonuid=xxx
:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);anongid=xxx
:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx); - 其它选项
secure
:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);insecure
:允许客户端从大于1024的tcp/ip端口连接服务器;sync
:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;async
:将数据先保存在内存缓冲区中,必要时才写入磁盘;wdelay
:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);no_wdelay
:若有写操作则立即执行,应与sync配合使用;subtree
:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);no_subtree
:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
这里我们使用了NFS v3的配置,如下图所示:
配置并启动服务之后,出现如下问题:
mount.nfs: access denied by server while mounting
解决方案直接修改/etc/exports
,如下图:
接着,重启服务即可:
sudo service nfs-kernel-server restart
五、NFS服务器的启动
首先,查看下是否配置成功,通过showmount命令,有输出共享列表则说明配置成功。
配置完/etc/exports之后,接下来就可以启动NFS服务器了。
为了使NFS服务器能正常工作,需要启动rpcbind和nfs-kernel-server两个服务,并且rpcbind一定要先于nfs-kernel-server启动。
sudo service rpcbind start
sudo service nfs-kernel-server start
若要开机自启动nfs服务,可以通过sysv-rc-conf配置自启动服务。
sudo sysv-rc-conf --level 35 rpcbind on
sudo sysv-rc-conf --level 35 nfs-kernel-server on
六、NFS客户端的挂载
客户端的挂载很简单,先建立一个挂载目录
sudo mkdir /mnt/nfs
sudo mount -t nfs 192.168.1.2:/tmp /mnt/nfs
之后客户端对应的文件目录便挂载上对应的文件系统了。
七、启动自动挂载NFS文件系统
客户端可以通过命令配置开机自启动挂载NFS的文件系统。
修改fstab文件
sudo vi /ets/fstab
在文件末尾增加一句:
192.168.1.2:/tmp /mnt/nfs nfs defaults 0 0
如下图: