NFS网络文件共享的安装要点
NFS - Network File System(网络文件系统),是一种基于TCP/IP传输的网络文件系统协议,最早由SUN公司研发,通过使用NFS协议,客户机可以像访问本地目录一样,访问远程服务器中的共享资源。
NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。
概述
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。
可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。
目前最新版本是 NFS 4.X,但3.X版本仍然很普遍。
启用NFS服务器,只需要安装两个软件包nfs-utils
和rpcbind
(前身为portmap
软件包,任务是提供RPC服务)。
由于nfs-utils
软件包依赖rpcbind
软件,所以使用yum安装时只需要yum install -y nfs-utils
就搞定了。
从NFS服务端的角度看,包含2个核心后台进程:
nfsd
:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;rpc.mountd
:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports
来对比客户端权限。
当客户端尝试使用RPC Server所提供的服务时,由于Client需要取得一个可以连接的端口(port)才能够使用RPC Server所提供的服务,因此,客户端首先去请求rpcbind,然后,rpcbind将自己管理的端口映射告知客户端,好让客户端可以连接上服务,因此启动NFS之前,一定要先启动rpcbind。
RPC后台服务占用网络端口111,
/etc/services
中描述为sunrpc
,并有TCP和UDP两种模式。
NFS的常用目录
- /etc/exports:NFS服务的主要配置文件
- /usr/sbin/exportfs:NFS服务的管理命令
- /usr/sbin/showmount:客户端的查看命令
- /var/lib/nfs/etab:记录NFS分享出来的目录的完整权限设定值
- /var/lib/nfs/xtab:记录曾经登录过的客户端信息
NFS Server 安装方法
1. Server软件安装
安装nfs-utils
软件包,并设置系统启动服务rpcbind
和nfs
。
1 | yum install -y nfs-utils |
注意:如果启用了防火墙,需要打开 rpc-bind 和 nfs 的服务
2. Server服务配置
为加载NFS服务,需要创建一个共享目录。
1 | mkdir /data |
根据这个加载点,在/etc/exports
配置导出目录,添加如下行:
1 | /data/ 192.168.0.0/24(rw,sync,no_root_squash,no_all_squash) |
主要的配置参数包括:
/data
: 共享目录位置。192.168.0.0/24
: 客户端 IP 范围,* 代表所有,即没有限制。rw
: 权限设置,可读可写。sync|async
:=sync,数据同步写入到内存与硬盘当中;=async,数据会先暂存于内存当中,而非直接写入硬盘no_root_squash|root_squash
: =no_root_squash,如果Client的登录用户是root,则对于这个分享目录的Server来说,他就具有root的权限,也就是不压缩权限!;否则。。。all_squash|no_all_squash
: =all_squash,不论Client的使用者是什么身份,都会被压缩成匿名使用者;否则。。。anonuid= & anonnid=
:当Client登录到分享目录中,在Server其身份是uid:gid。注意,必须在/etc/passwd和/etc/group中存在该ID。
squash:这里是动词 “压缩、压扁”的意思,还有的含义是名词“南瓜、壁球”
3. Server启动服务
1 | systemctl enable rpcbind --now |
这样,服务端就配置好了,接下来配置客户端,连接服务端,使用共享目录。
NFS Client 安装方法
1. Client软件安装
软件包的名称是nfs-utils
,系统服务的名称是rpcbind
。
客户端不需要打开防火墙,因为客户端时发出请求方,网络能连接到服务端即可。
客户端也不需要开启 NFS 服务,因为不共享目录。
1 | yum install -y nfs-utils |
2. Client服务配置
使用showmount
命令,查看NFS服务器资源。
使用mount
命令,手工挂载NFS资源。
1 | [root@yum ~]# showmount -e 192.168.0.139 |
其中,可以看到NFS的全部默认参数,包括:hard模式,软件版本v3,网络报文大小64K,
3. Client启动服务
编辑/etc/fstab
文件,设置系统启动时自动加载
1 | [root@yum ~]# more /etc/fstab |
注意:需要重启systemd服务已更新目录配置!!!
1 | systemctl daemon-reload |
经验之一:如何处理NFS服务延迟加载问题
NFS服务位于独立的WDCLOUD,客户端位于192.168.0.148,全部重启时由于NFS Server尚未完成启动,Client自动加载失败。
分析fstab的配置参数:
fg/bg=fg
: 设置挂载失败后mount命令的行为
默认为fg,表示挂载失败时将直接报错退出。
如果是bg,挂载失败后会创建一个子进程不断在后台挂载,而父进程mount自身则立即退出并返回0状态码。timeo=600
: NFS客户端等待下一次重发NFS请求的时间间隔
单位为十分之一秒。默认值=600(60秒)hard/soft=hard
: 设置NFS客户端当NFS请求超时时的恢复行为方式
如果是hard,将无限重新发送NFS请求。例如在客户端使用df -h
查看文件系统时就会不断等待。
如果是soft,当retrans次数耗尽时,NFS客户端将认为NFS请求失败,从而返回一个错误给调用它的程序。retrans=3
: NFS客户端最多发送的请求次数
NFS客户端最多发送次数耗尽后将报错表示连接失败。如果hard挂载选项生效,则会进一步尝试恢复连接。rsize,wsize=131072
:一次读出(rsize)和写入(wsize)的区块大小。
单位为字节,必须为1024的倍数,且最大只能设置为1M。
Centos 5默认1024,Cenots 6以上默认131072
如果网络带宽大,这两个值设置大一点能提升传输能力。最好设置到带宽的临界值。
解决办法是:在/etc/fstab
中,设置nfs目录的属性为bg
,即后台启动。
1 | 192.168.0.139:/mnt/HD/HD_a2/NFS /data nfs defaults,_netdev,bg 0 0 |