1.1 概述

类似ext家族、xfs格式的当三步跳件系统,它们都以透过单个文件名称空间(name
space)来含有众多文书,并提供基本的文件管理和空中分配功用。而文件是存放在在文件系统中(上述名称空间内)的单个命名对象,每一个文件都含有了文件实际数据和属性数据。不过,那么些品种的文件系统和其内文件都以存放在地点主机上的。

事实上,还有网络文件系统。顾名思义,就是跨网络的文件系统,将远程主机上的文件系统(或目录)存放在地头主机上,就好像它自个儿便是当三步跳件系统一样。在Windows情况下有cifs协议得以达成的网络文件系统,在Unix景况下,最闻明是由NFS协议得以落成的NFS文件系统。

NFS即network file
system的缩写,nfs是属于用起来万分轻便,钻探起来卓绝难的事物。相信,使用过它或学过它的人都不会感觉它的接纳有其余困难,只需将远程主机上要共享给客户端的目录导出(export),然后在客户端上挂载就可以像当和姑件系统同样。到近期结束,nfs已经有五个本子,NFSv壹是未公布出来的本子,v2和v三版本方今来讲基本已经淘汰,v4版本是时下选拔最多的本子,nfsv4.一是现阶段最新的版本。

第2章 NFS基本选拔,第一章NFS应用


正文目录:

1.1 概述

1.二 RPC不可不知的规律

1.2.1 RPC原理

一.二.二 奥迪Q7CP工具介绍

1.3 启动NFS

一.4 配置导出目录和挂载使用

壹.四.1 配置NFS导出目录

壹.四.二 挂载NFS文件系统

一.四.叁 NFS伪文件系统

1.5 showmount命令

一.陆 NFS身份映射

一.七 使用exportfs命令导出目录

1.8 深入NFS的方向


CentOS 6.7 安装配置nfs 服务

NFS是Network File
System的缩写,即互连网文件系统。它功用是因此互联网让分裂的机械、差别的操作系统能够相互分享各自的数目,让应用程序在客户端通过互联网访问位于服务器磁盘中的数据。

NFS在文书传送或新闻传送进度中依据于RPC商谈。RPC:远程进程调用(Remote
Procedure
Call)是能使客户端实施别的系统中等射程序的一种体制。NFS自身是不曾提供新闻传输的协商和作用的,但NFS却能让我们通过网络开始展览资料的分享,那是因为NFS使用了有的别样的传导协议。而那些传输协议用到这么些RPC功效的。能够说NFS本人正是使用RPC的三个程序。也许说NFS也是1个RPC
SE中华VVESportage。所以就算使用NFS的地点都要开动RPC服务,不论是NFS SELANDVE福特Explorer大概NFS
CLIENT。那样SE凯雷德VECRUISER和CLIENT本事因而RPC来得以完毕PROGRAM
PORT的附和。可以那样精晓RPC和NFS的涉及:NFS是3个文件系统,而RPC是承受音信的传输。

因此,大家须求设置多少个软件包:nfs-utils和rpcbind,在centOS
5中rpcbind叫portmap,功用都以如出壹辙的,名字差异而已。

设置格局:yum安装

nfs服务端:balichvm(192.168.171.51)

客户端:balichos(192.168.171.50)

设置步骤:

1)、在balichvm上安装nfs-utils和rpcbind,使用yum安装,如下:

[[email protected]
~]# yum install –y nfs-utilsrpcbind

二)、在balichvm建设构造须求分享的目录和编写制定配置文件/etc/exports(那几个文件私下认可未有)

[[email protected]【澳门金沙国际】NFS基本采纳,安装配置nfs。
~]# mkdir –p /data/nfsdata

[[email protected]
~]#vim /etc/exports

/data/nfsdata/ 192.168.171.0/24 (rw,sync,root_squash)

此地的布署是共享目录/data/nfsdata/;网段1玖贰.16八.171.0的主机能够有读写权限、限制root权限、同步到磁盘)

/etc/exports配置文件的格式和挑选有:

格式:共享的目录共享给这几个网段的主机共享的权柄

分选:(共享的权限)

ro:——只读;

rw:——读写;

sync:——同步情势,内部存款和储蓄器中数量随时写入磁盘;

async:——不一样台,把内部存款和储蓄器中数据定时写入磁盘中;

no_root_squash:——加上那么些选项后,root用户就能够对共享的目录具备至高的权位调控,就像对本机的目录操作同样。不安全,不提出选拔;

root_squash:——和地点的挑3拣肆对应,root用户对共享目录的权位不高,唯有普通用户的权限,即限制了root;

all_squash:——不管选取NFS的用户是什么人,他的地位都会被限制成为贰个钦赐的普通用户身份;

anonuid/anongid:——要和root_squash以及all_squash一起使用,用于钦命使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中设有那么些uid和gid。

3)、在balichvm配置防火墙规则,编辑/etc/sysconfig/nfs,固定服务的端口,暗中认可是注释的,需求开采。

# Port rpc.mountd should listen on.

MOUNTD_PORT=892 #把前边的#号去掉

# Port rquotad should listen on.

RQUOTAD_PORT=875 #把前边的#号去掉

# TCP port rpc.lockd should listen on.

LOCKD_TCPPORT=32803 #把后面包车型地铁#号去掉

# UDP port rpc.lockd should listen on.

LOCKD_UDPPORT=32769 #把前边的#号去掉

这几个端口是铺排文件暗中认可的,是能够活动修改增添内需的端口号,然后保留配置文件。

接下来运行rpdbind和nfs服务:

/etc/init.d/rpcbind restart

/etc/init.d/nfs restart

服务运营后,使用rpcinfo –p查看启用的端口。

[[email protected]
~]# rpcinfo -p

program vers proto port service

100000 4 tcp111 portmapper

100000 3 tcp111 portmapper

100000 2 tcp111 portmapper

100000 4 udp111 portmapper

100000 3 udp111 portmapper

100000 2 udp111 portmapper

100005 1 udp892 mountd

100005 1 tcp892 mountd

100005 2 udp892 mountd

100005 2 tcp892 mountd

100005 3 udp892 mountd

100005 3 tcp892 mountd

100003 2 tcp2049 nfs

100003 3 tcp2049 nfs

100003 4 tcp2049 nfs

100227 2tcp 2049 nfs_acl

100227 3 tcp2049 nfs_acl

100003 2 udp2049 nfs

100003 3 udp2049 nfs

100003 4 udp2049 nfs

100227 2 udp2049 nfs_acl

100227 3 udp2049 nfs_acl

100021 1 udp32769 nlockmgr

100021 3 udp32769 nlockmgr

100021 4 udp32769 nlockmgr

100021 1 tcp32803 nlockmgr

100021 3 tcp32803 nlockmgr

100021 4 tcp32803 nlockmgr

[[email protected]
~]#

将这个启用的端口(tcp和udp)写到iptables防火墙里面(vim
/etc/sysconfig/iptables),允许通过,如下:

-A INPUT -m state –state NEW -m tcp -p tcp–dport 111 -j ACCEPT

-A INPUT -m state –state NEW -m tcp -p tcp–dport 892 -j ACCEPT

-A INPUT -m state –state NEW -m tcp -p tcp–dport 2049 -j ACCEPT

-A INPUT -m state –state NEW -m tcp -p tcp–dport 32769 -j ACCEPT

-A INPUT -m state –state NEW -m tcp -p tcp–dport 32803 -j ACCEPT

-A INPUT -m state –state NEW -m udp -p udp–dport 111 -j ACCEPT

-A INPUT -m state –state NEW -m udp -p udp–dport 892 -j ACCEPT

-A INPUT -m state –state NEW -m udp -p udp–dport 2049 -j ACCEPT

-A INPUT -m state –state NEW -m udp -p udp–dport 32769 -j ACCEPT

-A INPUT -m state –state NEW -m udp -p udp–dport 32803 -j ACCEPT

接下来重启iptables服务:/etc/init.d/iptables restart

四)、在客户端balichos上,安装nfs-utils,并且挂载balichvm共享的nfsdata目录,查看某台主机共享的nfs使用命令showmount–e
ip(主机名)。

[[email protected]
~]# yum install –y nfs-utils

[[email protected]
~]# showmount -e192.168.171.51 ##查阅共享的nfs

Export list for 192.168.171.51:

/data/nfsdata 192.168.171.0/24

[[email protected]
~]#

[[email protected]
~]# mount -t nfs192.168.171.51:/data/nfsdata/ /mnt/

[[email protected]
~]# df -h

Filesystem Size Used Avail Use% Mountedon

/dev/sda3 18G 5.9G 11G 36% /

tmpfs 495M 0 495M 0% /dev/shm

/dev/sda1 190M 36M 145M 20% /boot

192.168.171.51:/data/nfsdata/ 18G 3.8G 13G 24% /mnt

近年来就曾经挂载了一个文件系统,可是出于在balichvm上/data/nfsdata的权杖是75五,别的用户不享有写的权力,而在nfs配置文件/etc/exports上又限定了root用户权限,暗中认可是选用其他的用户的登陆,全部不能写入数据,唯有读取的权限。

假诺急需有写入的权柄,能够修改权限。

澳门金沙国际 , 陆.七 安装配备nfs 服务 NFS是Network File
System的缩写,即网络文件系统。它成效是透过网络让不相同的机械、区别的操作系统能够相互分享各…

一.二 RPC不可不知的法则

要介绍NFS,必然要先介绍RPC。RPC是remote procedure
call的简写,人们都将其译为”远程进度调用”,它是1种框架,那种框架在巨型公司利用尤其多。而NFS正是里面一种,其余NIS、hadoop也是运用rpc框架完成的。

1.1 概述

类似ext家族、xfs格式的本土文件系统,它们都以经过单个文件名称空间(name
space)来含有众多文本,并提供基本的公文管理和空间分配作用。而文件是存放在文件系统中(上述名称空间内)的单个命名对象,每一种文件都带有了文本实际数目和属性数据。不过,那一个类别的文件系统和其内文件都以存放在在该地主机上的。

实质上,还有网络文件系统。顾名思义,便是跨互连网的文件系统,将远程主机上的文件系统(或目录)存放在地方主机上,就像是它自己就是当三步跳件系统同样。在Windows景况下有cifs协议得以落成的网络文件系统,在Unix情况下,最盛名是由NFS协议落到实处的NFS文件系统。

NFS即network file
system的缩写,nfs是属于用起来10分轻松,琢磨起来十三分难的事物。相信,使用过它或学过它的人都不会以为它的运用有其它困难,只需将远程主机上要共享给客户端的目录导出(export),然后在客户端上挂载就可以像当三步跳件系统同样。到近期截止,nfs已经有伍个本子,NFSv壹是未公布出来的本子,v二和v三版本脚下来说基本已经淘汰,v4版本是当前应用最多的本子,nfsv四.1是目前风行的版本。

1.2.1 RPC原理

所谓的remote procedure
call,便是在本地调用远程主机上的procedure。以本地施行”cat -n
~/abc.txt”命令为例,在该地施行cat命令时,会发起有些系统调用(如open()、read()、close()等),并将cat的抉择和参数传递给那一个函数,于是最终完结了文件的查阅功用。在RPC层面上知道,上边发起的种类调用就是procedure,每种procedure对应三个或三个职能。而rpc的全名remote
procedure
call所代表的正是兑现长途procedure调用,让远道主机去调用对应的procedure。

地点的cat命令只是本地实行的命令,如何得以达成远程cat,以至其余中长途命令?平时有三种恐怕落成的法子:

(1).使用ssh类的工具,就要实践的指令传递到长途主机上并实施。但ssh不可能间接调用远程主机上cat所提倡的这些系统调用(如open()、read()、close()等)。

(2).使用互联网socket的主意,告诉远程服务进度要调用的函数。但诸如此类的主机间进度通讯形式相似都是daemon类服务,daemon类的客户端(即服务的消费方)每调用三个劳动的效用,都亟需编写制定一批达成网络通讯相关的代码。不唯有轻巧出错,还比较复杂。

而rpc是最佳的消除办法。rpc是一种框架,在此框架中曾经济合作并了互联网通讯代码和封包、解包格局(编码、解码)。以下是rpc整个经过,以cat
NFS文件系统中的a.sh文件为例。

 澳门金沙国际 1 
 澳门金沙国际 2

nfs客户端实践cat
a.sh,由于a.sh是NFS文件系统内的文本,所以cat会发起一些procedure调用(如open/read/close),这么些procedure和对应的参数会发送给rpc
client(大概是单个procedure,也或然是八个procedure组合在协同叁次性发送给rpc
client,在NFSv肆上是后者),rpc
client会将那一个多少开始展览编码封装(封装和解封装作用由stub代码完成),然后将包裹后的数据通过互连网发送给rpc
server,rpc
server会对包裹的数量开始展览解封,于是就获得了要调用的procedures和对应的参数,然后将它们交给NFS服务进度,最后进展procedure的调用。NFS服务发起procedure调用后,会获得数码(恐怕是数据小编,也许是意况消息等),于是交给rpc
server,rpc server会将那个多少封装并由此互联网发送给rpc client,rpc
client解封于是获得终极的回到结果。

从地方的经过能够领悟,rpc的效益是数量封装,rpc
client封装待调用的procedure及其参数,rpc server封装再次回到的数码。

所以在意,rpc的中距离procedure调用的定义不是在本土向远程主机发起procedure的调用,而是就要试行的procedure包装后通过rpc发送出去,让长途主机上的相应程序自个儿去推行procedure并回到数据。也正是说rpc的功效是包裹和发送,而不是发起调用。

举个更简便的事例,使用google搜索时,达成寻觅效果的procedure和要研究的剧情就是rpc
client封装的目的,也是rpc server要解封的靶子,寻觅的结果则是rpc
server封装的对象,也是rpc
client要解封的对象。解封后的末梢结出即为google寻觅的结果。

一.二 RPC不可不知的法则

要介绍NFS,必然要先介绍RPC。RPC是remote procedure
call的简写,人们都将其译为”远程进程调用”,它是一种框架,那种框架在巨型公司采纳尤其多。而NFS就是在那之中一种,其余NIS、hadoop也是选取rpc框架贯彻的。

1.二.二 RPC工具介绍

在CentOS 6/7上,rpc server由rpcbind程序落成,该程序由rpcbind包提供。

[root@xuexi ~]# yum -y install rpcbind

[root@xuexi ~]# rpm -ql rpcbind | grep bin/
/usr/sbin/rpcbind
/usr/sbin/rpcinfo

在这之中rpcbind是rpc主程序,在rpc服务端该程序必须处于已运维情状,其私下认可监听在11一端口。rpcinfo是rpc相关消息查询工具。

对于rpc来讲,其所平素保管的是programs,programs由2个或八个procedure组成。这几个program称为RPC
program或RPC service。

一般来讲图,当中NFS、NIS、hadoop等誉为网络服务,它们由多少个进程或程序(program)组成。比如NFS包涵rpc.nfsd、rpc.mountd、rpc.statd和rpc.idmapd等programs,当中每一个program都饱含了二个或八个procedure,比方rpc.nfsd这么些顺序包罗了如OPEN、CLOSE、READ、COMPOUND、GETATT猎豹CS陆等procedure,rpc.mountd也根本有MNT和UMNT多少个procedure。

澳门金沙国际 3

对于RPC来说,它是不明了NFS/NIS/hadoop那1层的,它一向保管programs。每个program运营时都须要找111端口的rpc服务登记注册,然后RPC服务会为该program映射贰个program
number以及分配二个端口号。在那之中每一个program都有三个唯一与之对应的program
number,它们的投射关系定义在/etc/rpc文件中。未来rpc server将使用program
number来推断要调用的是哪个program中的procedure并将解包后的数目传递给该program。

比方只运行rpcbind时。

[root@xuexi ~]# systemctl start rpcbind.service

[root@xuexi ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

其间第1列正是program
number,第一列vers表示对应program的版本号,最终1列为RPC管理的RPC
service名,其实正是各program对应的称之为。

当客户端获取到rpc所管理的service的端口后,就能够与该端口举行通讯了。但只顾,即使客户端已经收获了端口号,客户端仍会借助rpc做为中间人实行通讯。也正是说,无论曾几何时,客户端和rpc所管理的劳务的通讯都必须透过rpc来变成。之所以那样,是因为唯有rpc本事封装和解封装数据。

既然如此客户端不能够间接拿着端口号和rpc
service通讯,那还提供端口号干嘛?那么些端口号是为rpc server提供的,rpc
server解包数据后,会将数据经过此端口交给对应的rpc service。

1.2.1 RPC原理

所谓的remote procedure
call,正是在本地调用远程主机上的procedure。以本土推行”cat -n
~/abc.txt”命令为例,在本地试行cat命令时,会发起某个系统调用(如open()、read()、close()等),并将cat的挑选和参数字传送递给这么些函数,于是最终促成了文本的查看功效。在RPC层面上知道,上边发起的种类调用就是procedure,各个procedure对应三个或三个职能。而rpc的全名remote
procedure
call所表示的正是贯彻长途procedure调用,让长途主机去调用对应的procedure。

上面包车型客车cat命令只是本地施行的命令,怎么样落到实区长途cat,以致其余中长途命令?日常有二种可能完成的方式:

(壹).使用ssh类的工具,将在试行的命令传递到长途主机上并推行。但ssh不可能直接调用远程主机上cat所提倡的那么些系统调用(如open()、read()、close()等)。

(2).使用互联网socket的办法,告诉远程服务进度要调用的函数。但如此的主机间进度通讯方式一般都以daemon类服务,daemon类的客户端(即服务的消费方)每调用叁个劳动的功效,都亟需编写制定一群完成网络通讯相关的代码。不只有轻便失误,还比较复杂。

而rpc是最棒的减轻方法。rpc是1种框架,在此框架中曾经济合营并了网络通讯代码和封包、解包情势(编码、解码)。以下是rpc整个进程,以cat
NFS文件系统中的a.sh文件为例。

 澳门金沙国际 4 
 澳门金沙国际 5

nfs客户端实践cat
a.sh,由于a.sh是NFS文件系统内的文书,所以cat会发起一些procedure调用(如open/read/close),这么些procedure和对应的参数会发送给rpc
client(也许是单个procedure,也大概是多少个procedure组合在联合三次性发送给rpc
client,在NFSv4上是继任者),rpc
client会将那个数据进行编码封装(封装和解封装作用由stub代码落成),然后将包装后的数量经过网络发送给rpc
server,rpc
server会对包裹的数目实行解封,于是就获得了要调用的procedures和相应的参数,然后将它们交给NFS服务进度,最后进展procedure的调用。NFS服务发起procedure调用后,会收获数码(恐怕是数码自个儿,大概是情景消息等),于是交给rpc
server,rpc server会将那个数量封装并通过互联网发送给rpc client,rpc
client解封于是获得终极的回来结果。

从上面的进程能够领悟,rpc的功效是多少封装,rpc
client封装待调用的procedure及其参数,rpc server封装再次来到的多少。

所以只顾,rpc的远程procedure调用的定义不是在该地向远程主机发起procedure的调用,而是就要施行的procedure包装后通过rpc发送出去,让远道主机上的相应程序自个儿去实施procedure并赶回数据。相当于说rpc的效益是包裹和出殡和埋葬,而不是倡议调用。

举个更简便的事例,使用google找寻时,落成寻觅成效的procedure和要搜求的剧情正是rpc
client封装的靶子,也是rpc server要解封的靶子,寻找的结果则是rpc
server封装的对象,也是rpc
client要解封的目标。解封后的末段结出即为google寻觅的结果。

1.3 启动NFS

NFS自己是很复杂的,它由众多进度组成。那么些经过的运营程序由nfs-utils包提供。由于nfs是接纳RPC框架落成的,所以需求先安装好rpcbind。然则安装nfs-utils时会自动安装rpcbind。

[root@xuexi ~]# yum -y install nfs-utils

[root@xuexi ~]# rpm -ql nfs-utils | grep /usr/sbin
/usr/sbin/blkmapd
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsdcltrack
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd

其间以”rpc.”起首的程序都以rpc
service,分别落成差别的作用,运转它们时每一个都急需向rpcbind实行登记注册。

[root@xuexi ~]# systemctl start nfs.service

[root@xuexi ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  56229  status
    100024    1   tcp  57226  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  48609  nlockmgr
    100021    3   udp  48609  nlockmgr
    100021    4   udp  48609  nlockmgr
    100021    1   tcp  50915  nlockmgr
    100021    3   tcp  50915  nlockmgr
    100021    4   tcp  50915  nlockmgr

能够看来,每种program都运维了区别版本的魔法。个中nfs
program为rpc.nfsd对应的program,为nfs服务的主进程,端口号为204玖。mountd对应的program为rpc.mountd,它为客户端的mount和umount命令提供劳务,即挂载和卸载NFS文件系统时会联系mountd服务,由mountd维护相关挂载音信。nlockmgr对应的program为rpc.statd,用于保证文件锁和文书委托有关职能,在NFSv四在此以前,称之为NSM(network
status
manager)。nfs_acl和status,由此可见是访问调控列表和气象新闻维护的program。

再看看运行的相关进度音讯。

[root@xuexi ~]# ps aux | grep -E "[n]fs|[r]pc"
root        748  0.0  0.0      0     0 ?        S<   Jul26   0:00 [rpciod]
rpc        6127  0.0  0.0  64908  1448 ?        Ss   Jul26   0:00 /sbin/rpcbind -w
rpcuser    6128  0.0  0.0  46608  1836 ?        Ss   Jul26   0:00 /usr/sbin/rpc.statd --no-notify
root       6242  0.0  0.0      0     0 ?        S<   Jul26   0:00 [nfsiod]
root       6248  0.0  0.0      0     0 ?        S    Jul26   0:00 [nfsv4.0-svc]
root      17128  0.0  0.0  44860   976 ?        Ss   02:49   0:00 /usr/sbin/rpc.mountd
root      17129  0.0  0.0  21372   420 ?        Ss   02:49   0:00 /usr/sbin/rpc.idmapd
root      17134  0.0  0.0      0     0 ?        S<   02:49   0:00 [nfsd4]
root      17135  0.0  0.0      0     0 ?        S<   02:49   0:00 [nfsd4_callbacks]
root      17141  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17142  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17143  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17144  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17145  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17146  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17147  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17148  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]

中间有1项/usr/sbin/rpc.idmapd进程,该进程是提供服务端的uid/gid
<==> username/groupname的照射翻译服务。客户端的uid/gid <==>
username/groupname的投射翻译服务则由”nfsidmap”工具达成,详细表明见下文。

1.二.二 RPC工具介绍

在CentOS 6/七上,rpc server由rpcbind程序达成,该程序由rpcbind包提供。

[[email protected] ~]# yum -y install rpcbind

[[email protected] ~]# rpm -ql rpcbind | grep bin/
/usr/sbin/rpcbind
/usr/sbin/rpcinfo

内部rpcbind是rpc主程序,在rpc服务端该程序必须处于已运市价况,其默许监听在11一端口。rpcinfo是rpc相关音讯查询工具。

对此rpc来讲,其所平昔管理的是programs,programs由一个或四个procedure组成。那么些program称为RPC
program或RPC service。

正如图,个中NFS、NIS、hadoop等誉为互联网服务,它们由多个经过或程序(program)组成。例如NFS包括rpc.nfsd、rpc.mountd、rpc.statd和rpc.idmapd等programs,当中每一种program都蕴含了一个或多个procedure,举例rpc.nfsd那么些程序包括了如OPEN、CLOSE、READ、COMPOUND、GETATT揽胜等procedure,rpc.mountd也至关主要有MNT和UMNT四个procedure。

对此RPC来讲,它是不驾驭NFS/NIS/hadoop这一层的,它直接管理programs。各种program运行时都亟需找11一端口的rpc服务登记注册,然后RPC服务会为该program映射一个program
number以及分配贰个端口号。当中各类program都有三个唯壹与之对应的program
number,它们的投射关系定义在/etc/rpc文件中。现在rpc server将运用program
number来判别要调用的是哪个program中的procedure并将解包后的数据传递给该program。

譬如只运维rpcbind时。

[[email protected] ~]# systemctl start rpcbind.service

[[email protected] ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

在这之中第三列正是program
number,第三列vers表示对应program的版本号,最终一名列RPC管理的RPC
service名,其实正是各program对应的号称。

当客户端获取到rpc所管理的service的端口后,就能够与该端口举行通讯了。但只顾,尽管客户端已经收获了端口号,客户端仍会借助rpc做为中间人开始展览通讯。也正是说,无论什么时候,客户端和rpc所管理的劳务的通讯都必须透过rpc来完毕。之所以那样,是因为只有rpc才具封装和平解决封装数据。

既然如此客户端无法一向拿着端口号和rpc
service通讯,那还提供端口号干嘛?这几个端口号是为rpc server提供的,rpc
server解包数据后,会将数据经过此端口交给对应的rpc service。

一.4 配置导出目录和挂载使用

1.3 启动NFS

NFS自己是很复杂的,它由大多进程组成。那个经过的起步程序由nfs-utils包提供。由于nfs是运用RPC框架得以达成的,所以要求先安装好rpcbind。可是安装nfs-utils时会自动安装rpcbind。

[[email protected] ~]# yum -y install nfs-utils

[[email protected] ~]# rpm -ql nfs-utils | grep /usr/sbin
/usr/sbin/blkmapd
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsdcltrack
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd

其间以”rpc.”开端的程序都以rpc
service,分别落成区别的意义,运行它们时每一个都亟需向rpcbind实行登记注册。

[[email protected] ~]# systemctl start nfs.service

[[email protected] ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  56229  status
    100024    1   tcp  57226  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  48609  nlockmgr
    100021    3   udp  48609  nlockmgr
    100021    4   udp  48609  nlockmgr
    100021    1   tcp  50915  nlockmgr
    100021    3   tcp  50915  nlockmgr
    100021    4   tcp  50915  nlockmgr

能够看来,每个program都运转了分化版本的效用。个中nfs
program为rpc.nfsd对应的program,为nfs服务的主进程,端口号为204九。mountd对应的program为rpc.mountd,它为客户端的mount和umount命令提供服务,即挂载和卸载NFS文件系统时会联系mountd服务,由mountd维护相关挂载音信。nlockmgr对应的program为rpc.statd,用于掩护文件锁和文件委托相关作用,在NFSv四从前,称之为NSM(network
status
manager)。nfs_acl和status,由此可见是访问调节列表和情景新闻保证的program。

再看看运行的连锁进程音讯。

[[email protected] ~]# ps aux | grep -E "[n]fs|[r]pc"
root        748  0.0  0.0      0     0 ?        S<   Jul26   0:00 [rpciod]
rpc        6127  0.0  0.0  64908  1448 ?        Ss   Jul26   0:00 /sbin/rpcbind -w
rpcuser    6128  0.0  0.0  46608  1836 ?        Ss   Jul26   0:00 /usr/sbin/rpc.statd --no-notify
root       6242  0.0  0.0      0     0 ?        S<   Jul26   0:00 [nfsiod]
root       6248  0.0  0.0      0     0 ?        S    Jul26   0:00 [nfsv4.0-svc]
root      17128  0.0  0.0  44860   976 ?        Ss   02:49   0:00 /usr/sbin/rpc.mountd
root      17129  0.0  0.0  21372   420 ?        Ss   02:49   0:00 /usr/sbin/rpc.idmapd
root      17134  0.0  0.0      0     0 ?        S<   02:49   0:00 [nfsd4]
root      17135  0.0  0.0      0     0 ?        S<   02:49   0:00 [nfsd4_callbacks]
root      17141  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17142  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17143  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17144  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17145  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17146  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17147  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]
root      17148  0.0  0.0      0     0 ?        S    02:49   0:00 [nfsd]

中间有1项/usr/sbin/rpc.idmapd进程,该进度是提供服务端的uid/gid
<==> username/groupname的光彩夺目翻译服务。客户端的uid/gid <==>
username/groupname的照射翻译服务则由”nfsidmap”工具达成,详细表达见下文。

一.4.壹 配置nfs导出目录

在将服务端的目录共享(share)只怕说导出(export)给客户端从前,需求先安顿好要导出的目录。例如哪个人可访问该目录,该目录是不是可写,以何人身份走访导出目录等。

安顿导出目录的布置文件为/etc/exports或/etc/exports.d/*.exports文件,在nfs服务运行时,会自动加载这一个铺排文件中的所有导出项。以下是导出示例:

/www    172.16.0.0/16(rw,async,no_root_squash)

当中/www是导出目录,即共享给客户端的目录;17二.1六.0.0/16是访问调节列表ACL,唯有该网段的客户端主机技艺访问该导出目录,即挂载该导出目录;紧跟在主机列表后的括号及括号中的内容定义的是该导出目录对该主机的导出选项,举个例子(rw,async,no_root_squash)表示客户端挂载/www后,该目录可读写、异步、可保留root用户的权限,具体的导出选项稍后列出。

以下是可抽取的二种导出形式:

/www1    (rw,async,no_root_squash)  # 导出给所有主机,此时称为导出给world
/www2    172.16.1.1(rw,async)       # 仅导出给单台主机172.16.1.1
/www3    172.16.0.0/16(rw,async) 192.168.10.3(rw,no_root_squash)   # 导出给网段172.16.0.0/16,还导出给单台
                                                                   # 主机192.168.10.3,且它们的导出选项不同
/www4    www.a.com(rw,async)        # 导出给单台主机www.a.com主机,但要求能解析该主机名
/www     *.b.com(rw,async)          # 导出给b.com下的所有主机,要求能解析对应主机名

以下是常用的某些导出选项表明,越来越多的导出选项见man
exports:常见的暗中同意项是:ro,sync,root_squash,no_all_squash,wdelay。

导出选项

(加粗标红为默认)

选项说明

rw、ro

导出目录可读写还是只读(read-only)。

sync、async

同步共享还是异步共享。异步时,客户端提交要写入的数据到服务端,服务端接收数据后直接响应客户端,但此时数据并不一定已经写入磁盘中,而同步则是必须等待服务端已将数据写入磁盘后才响应客户端。也就是说,给定异步导出选项时,虽然能提升一些性能,但在服务端突然故障或重启时有丢失一部分数据的风险。

当然,对于只读(ro)的导出目录,设置sync或async是没有任何差别的。

anonuid

anongid

此为匿名用户(anonymous)的uid和gid值,默认都为65534,在/etc/passwd和/etc/shadow中它们对应的用户名为nfsnobody。该选项指定的值用于身份映射被压缩时。

root_squash

no_root_squash

是否将发起请求(即客户端进行访问时)的uid/gid=0的root用户映射为anonymous用户。即是否压缩root用户的权限。

all_squash

no_all_squash

是否将发起请求(即客户端进行访问时)的所有用户都映射为anonymous用户,即是否压缩所有用户的权限。

对于root用户,将取(no_)root_squash和(no_)all_squash的交集。例如,no_root_squash和all_squash同时设置时,root仍被削减,root_squash和no_all_squash同时设置时,root也被减去。

些微导出选项必要匹配别的装置。比如,导出选项设置为rw,但倘若目录本人并未有w权限,只怕mount时钦点了ro挂载选项,则没有差距于不允许写操作。

关于其他导出选项,基本不须求去关切。

在布局文件写好要导出的目录后,直接重启nfs服务就可以,它会读取那几个布置文件。随后就足以在客户端施行mount命令举行挂载。

举个例子,exports文件内容如下:

/vol/vol0       *(rw,no_root_squash)
/vol/vol2       *(rw,no_root_squash)
/backup/archive *(rw,no_root_squash)

一.四 配置导出目录和挂载使用

1.四.二 挂载nfs文件系统

接下来去客户端上挂载它们。

[root@xuexi ~]# mount -t nfs 172.16.10.5:/vol/vol0 /mp1
[root@xuexi ~]# mount 172.16.10.5:/vol/vol2 /mp2
[root@xuexi ~]# mount 172.16.10.5:/backup/archive /mp3

挂载时”-t
nfs”能够回顾,因为对于mount来说,只有挂载nfs文件系统才会写成host:/path格式。当然,除了mount命令,nfs-utils包还提供了独自的mount.nfs命令,它实际和”mount
-t nfs”命令是千篇一律的。

mount挂载时得以钦点挂载选项,其中包含mount通用挂载选项,如rw/ro,atime/noatime,async/sync,auto/noauto等,也席卷针对nfs文件系统的挂载选项。以下列出多少个科学普及的,越来越多的源委查看man
nfs和man mount。

选项

参数意义

默认值

suid

nosuid

如果挂载的文件系统上有设置了suid的二进制程序,

使用nosuid可以取消它的suid

suid

rw

ro

尽管服务端提供了rw权限,但是挂载时设定ro,则还是ro权限

权限取交集

rw

exec/noexec

是否可执行挂载的文件系统里的二进制文件

exec

user

nouser

是否运行普通用户进行档案的挂载和卸载

nouser

auto

noauto

auto等价于mount -a,意思是将/etc/fstab里设定的全部重挂一遍

auto

sync

nosync

同步挂载还是异步挂载

async

atime

noatime

是否修改atime,对于nfs而言,该选项是无效的,理由见下文

 

diratime

nodiratime

是否修改目录atime,对于nfs而言,该挂载选项是无效的,理由见下文

 

remount

重新挂载

 

以下是指向nfs文件系统的挂载选项。个中未有交到关于缓存选项(ac/noac、cto/nocto、lookupcache)的注明,它们能够直接使用私下认可值,如若想要领悟缓存相关内容,能够查看man
nfs。

选项

功能

默认值

fg/bg

挂载失败后mount命令的行为。默认为fg,表示挂载失败时将直接报错退出,如果是bg,

挂载失败后会创建一个子进程不断在后台挂载,而父进程mount自身则立即退出并返回0状态码。

fg

timeo

NFS客户端等待下一次重发NFS请求的时间间隔,单位为十分之一秒。

基于TCP的NFS的默认timeo的值为600(60秒)。

 

hard/soft

决定NFS客户端当NFS请求超时时的恢复行为方式。如果是hard,将无限重新发送NFS请求。

例如在客户端使用df -h查看文件系统时就会不断等待。

设置soft,当retrans次数耗尽时,NFS客户端将认为NFS请求失败,从而使得NFS客户端

返回一个错误给调用它的程序。

hard

retrans

NFS客户端最多发送的请求次数,次数耗尽后将报错表示连接失败。如果hard挂载选项生效,

则会进一步尝试恢复连接。

3

rsize

wsize

一次读出(rsize)和写入(wsize)的区块大小。如果网络带宽大,这两个值设置大一点能提升传

输能力。最好设置到带宽的临界值。

单位为字节,大小只能为1024的倍数,且最大只能设置为1M。

 

留神三点:

(一).所谓的soft在特定的条件下超时后会导致静态数据中断。因而,仅当客户端响应速度比数据完整性更要紧时才使用soft选项。动用基于TCP的NFS(除非展现钦命使用UDP,不然今后总是暗许使用TCP)或充实retrans重试次数可以下落利用soft选项带来的高危害。

(2).由于nfs的客户端挂载后会缓存文件的性格新闻,当中囊括种种文件时间戳,所以mount指定时期相关的挂载选项是未曾意思的,它们不会有任何效果,包含atime/noatime,diratime/nodiratime,relatime/norelatime以及strictatime/nostrictatime等。具体可知man
nfs中”DATA AND METADATA COHERENCE”段的”File timestamp
maintainence”表明,恐怕见本文末尾的翻译。

(三).假诺是要开机挂载NFS文件系统,形式自然是写入到/etc/fstab文件或将mount命令放入rc.local文件中。假使是将/etc/fstab中,那么在系统情状早先化(exec
/etc/rc.d/rc.sysinit)的时候会加载fstab中的内容,若是挂载fstab中的文件系统出错,则会导致系统情况开端化失利,结果是系统开机战败。所以,要开机挂载nfs文件系统,则须求在/etc/fstab中参加3个挂载选项“_rnetdev”或”_netdev”(centos
7中一度未有”_rnetdev”)
,防止不可能联系nfs服务端时导致开机运转失利。举个例子:

172.16.10.5:/www    /mnt    nfs    defaults,_rnetdev    0    0

当导出目录后,将要/var/lib/nfs/etab文件中写入一条对应的导出记录,那是nfs维护的导出表,该表的剧情会交到rpc.mountd进程,并在供给的时候(mountd接受到客户端的mount请求时),将此导出表中的内容加载到根本中,内核也单身维护一张艺谋(Zhang Yimou)出表。

一.4.壹 配置nfs导出目录

在将服务端的目录共享(share)大概说导出(export)给客户端从前,需求先配备好要导出的目录。比方什么人可访问该目录,该目录是还是不是可写,以什么人身份访问导出目录等。

部署导出目录的配置文件为/etc/exports或/etc/exports.d/*.exports文件,在nfs服务运转时,会活动加载那一个配置文件中的所有导出项。以下是导出示例:

/www    172.16.0.0/16(rw,async,no_root_squash)

其间/www是导出目录,即共享给客户端的目录;17二.16.0.0/1陆是访问调节列表ACL,只有该网段的客户端主机技艺访问该导出目录,即挂载该导出目录;紧跟在主机列表后的括号及括号中的内容定义的是该导出目录对该主机的导出选项,举个例子(rw,async,no_root_squash)表示客户端挂载/www后,该目录可读写、异步、可保留root用户的权杖,具体的导出选项稍后列出。

以下是可接受的三种导出方式:

/www1    (rw,async,no_root_squash)  # 导出给所有主机,此时称为导出给world
/www2    172.16.1.1(rw,async)       # 仅导出给单台主机172.16.1.1
/www3    172.16.0.0/16(rw,async) 192.168.10.3(rw,no_root_squash)   # 导出给网段172.16.0.0/16,还导出给单台
                                                                   # 主机192.168.10.3,且它们的导出选项不同
/www4    www.a.com(rw,async)        # 导出给单台主机www.a.com主机,但要求能解析该主机名
/www     *.b.com(rw,async)          # 导出给b.com下的所有主机,要求能解析对应主机名

以下是常用的1对导出选项表达,更加多的导出选项见man
exports:常见的默许项是:ro,sync,root_squash,no_all_squash,wdelay。

导出选项

(加粗标红为默认)

选项说明

rw、ro

导出目录可读写还是只读(read-only)。

sync、async

同步共享还是异步共享。异步时,客户端提交要写入的数据到服务端,服务端接收数据后直接响应客户端,但此时数据并不一定已经写入磁盘中,而同步则是必须等待服务端已将数据写入磁盘后才响应客户端。也就是说,给定异步导出选项时,虽然能提升一些性能,但在服务端突然故障或重启时有丢失一部分数据的风险。

当然,对于只读(ro)的导出目录,设置sync或async是没有任何差别的。

anonuid

anongid

此为匿名用户(anonymous)的uid和gid值,默认都为65534,在/etc/passwd和/etc/shadow中它们对应的用户名为nfsnobody。该选项指定的值用于身份映射被压缩时。

root_squash

no_root_squash

是否将发起请求(即客户端进行访问时)的uid/gid=0的root用户映射为anonymous用户。即是否压缩root用户的权限。

all_squash

no_all_squash

是否将发起请求(即客户端进行访问时)的所有用户都映射为anonymous用户,即是否压缩所有用户的权限。

对于root用户,将取(no_)root_squash和(no_)all_squash的交集。例如,no_root_squash和all_squash同时安装时,root仍被减少,root_squash和no_all_squash同时设置时,root也被缩减。

稍微导出选项要求卓殊别的设置。举个例子,导出选项设置为rw,但即便目录本人未有w权限,只怕mount时钦点了ro挂载选项,则一律不容许写操作。

有关别的导出选项,基本没有须要去关爱。

在安顿文件写好要导出的目录后,直接重启nfs服务就可以,它会读取这个配置文件。随后就足以在客户端施行mount命令举办挂载。

譬如,exports文件内容如下:

/vol/vol0       *(rw,no_root_squash)
/vol/vol2       *(rw,no_root_squash)
/backup/archive *(rw,no_root_squash)

一.4.三 nfs伪文件系统

服务端导出/vol/vol0、/vol/vol二和/backup/archive后,当中vol0和vol一是连在2个目录下的,但它们和archive目录没有连在一齐,nfs选取伪文件系统的主意来桥接那么些不总是的导出目录。桥接的秘诀是创立这1个未导出的接连目录,如伪vol目录,伪backup目录以及一流的伪根,如下图所示。

澳门金沙国际 6

当客户端挂载后,每一遍访问导出目录时,其实都以透过找到伪文件系统(文件系统都有id,在nfs上伪文件系统的id称为fsid)并平素到导出目录的。

1.四.二 挂载nfs文件系统

接下来去客户端上挂载它们。

[[email protected] ~]# mount -t nfs 172.16.10.5:/vol/vol0 /mp1
[[email protected] ~]# mount 172.16.10.5:/vol/vol2 /mp2
[[email protected] ~]# mount 172.16.10.5:/backup/archive /mp3

挂载时”-t
nfs”能够总结,因为对于mount来讲,唯有挂载nfs文件系统才会写成host:/path格式。当然,除了mount命令,nfs-utils包还提供了独立的mount.nfs命令,它实际上和”mount
-t nfs”命令是同样的。

mount挂载时方可钦命挂载选项,在这之中囊括mount通用挂载选项,如rw/ro,atime/noatime,async/sync,auto/noauto等,也包括针对nfs文件系统的挂载选项。以下列出几个大规模的,更多的内容查看man
nfs和man mount。

选项

参数意义

默认值

suid

nosuid

如果挂载的文件系统上有设置了suid的二进制程序,

使用nosuid可以取消它的suid

suid

rw

ro

尽管服务端提供了rw权限,但是挂载时设定ro,则还是ro权限

权限取交集

rw

exec/noexec

是否可执行挂载的文件系统里的二进制文件

exec

user

nouser

是否运行普通用户进行档案的挂载和卸载

nouser

auto

noauto

auto等价于mount -a,意思是将/etc/fstab里设定的全部重挂一遍

auto

sync

nosync

同步挂载还是异步挂载

async

atime

noatime

是否修改atime,对于nfs而言,该选项是无效的,理由见下文

 

diratime

nodiratime

是否修改目录atime,对于nfs而言,该挂载选项是无效的,理由见下文

 

remount

重新挂载

 

以下是指向nfs文件系统的挂载选项。个中并未有交给关于缓存选项(ac/noac、cto/nocto、lookupcache)的求证,它们得以向来利用默许值,假设想要掌握缓存相关内容,能够查阅man
nfs。

选项

功能

默认值

fg/bg

挂载失败后mount命令的行为。默认为fg,表示挂载失败时将直接报错退出,如果是bg,

挂载失败后会创建一个子进程不断在后台挂载,而父进程mount自身则立即退出并返回0状态码。

fg

timeo

NFS客户端等待下一次重发NFS请求的时间间隔,单位为十分之一秒。

基于TCP的NFS的默认timeo的值为600(60秒)。

 

hard/soft

决定NFS客户端当NFS请求超时时的恢复行为方式。如果是hard,将无限重新发送NFS请求。

例如在客户端使用df -h查看文件系统时就会不断等待。

设置soft,当retrans次数耗尽时,NFS客户端将认为NFS请求失败,从而使得NFS客户端

返回一个错误给调用它的程序。

hard

retrans

NFS客户端最多发送的请求次数,次数耗尽后将报错表示连接失败。如果hard挂载选项生效,

则会进一步尝试恢复连接。

3

rsize

wsize

一次读出(rsize)和写入(wsize)的区块大小。如果网络带宽大,这两个值设置大一点能提升传

输能力。最好设置到带宽的临界值。

单位为字节,大小只能为1024的倍数,且最大只能设置为1M。

 

小心三点:

(一).所谓的soft在一定的景况下超时后会导致静态数据中断。因而,仅当客户端响应速度比数据完整性更要紧时才使用soft选项。行使基于TCP的NFS(除非展现内定使用UDP,不然以往连年暗许使用TCP)或充实retrans重试次数能够减低利用soft选项带来的风险。

(2).由于nfs的客户端挂载后会缓存文件的本性音信,在那之中包罗各个文件时间戳,所以mount指定期间相关的挂载选项是未有意义的,它们不会有其余作用,包含atime/noatime,diratime/nodiratime,relatime/norelatime以及strictatime/nostrictatime等。具体可见man
nfs中”DATA AND METADATA COHERENCE”段的”File timestamp
maintainence”表达,可能见本文末尾的翻译。

(三).就算是要开机挂载NFS文件系统,格局自然是写入到/etc/fstab文件或将mount命令放入rc.local文件中。假如是将/etc/fstab中,那么在系统意况开端化(exec
/etc/rc.d/rc.sysinit)的时候会加载fstab中的内容,假设挂载fstab中的文件系统出错,则会导致系统境遇初步化战败,结果是系统开机战败。所以,要开机挂载nfs文件系统,则必要在/etc/fstab中进入2个挂载选项“_rnetdev”,幸免不能沟通nfs服务端时促成开机运维退步。举例:

172.16.10.5:/www    /mnt    nfs    defaults,_rnetdev    0    0

当导出目录后,就要/var/lib/nfs/etab文件中写入一条对应的导出记录,那是nfs维护的导出表,该表的源委会交到rpc.mountd进度,并在供给的时候(mountd接受到客户端的mount请求时),将此导出表中的内容加载到基本中,内核也单身维护一张艺谋先生出表。

1.5 showmount命令

行使showmount命令能够查阅某1台主机的导出目录景况。因为涉嫌到rpc请求,所以只要rpc出难题,showmount同样会傻傻地守候。

主要有3个选项。

showmount [ -ade]  host
-a:以host:dir格式列出客户端名称/IP以及所挂载的目录。但注意该选项是读取NFS服务端/var/lib/nfs/rmtab文件,
  :而该文件很多时候并不准确,所以showmount -a的输出信息很可能并非准确无误的
-e:显示NFS服务端所有导出列表。
-d:仅列出已被客户端挂载的导出目录。

别的showmount的结果是排序过的,所以和实在的导出目录顺序也许并差异等。

例如:

[root@xuexi ~]# showmount -e 172.16.10.5
Export list for 172.16.10.5:
/backup/archive *
/vol/vol2       *
/vol/vol0       *
/www            172.16.10.4

[root@xuexi ~]# showmount -d 172.16.10.5
Directories on 172.16.10.5:
/backup/archive
/vol/vol0
/vol/vol2

一.4.叁 nfs伪文件系统

服务端导出/vol/vol0、/vol/vol2和/backup/archive后,当中vol0和vol一是连在1个目录下的,但它们和archive目录没有连在一同,nfs接纳伪文件系统的方法来桥接这几个不接二连三的导出目录。桥接的法子是开创那个未导出的连日目录,如伪vol目录,伪backup目录以及拔尖的伪根,如下图所示。

当客户端挂载后,每一遍访问导出目录时,其实都以透过找到伪文件系统(文件系统都有id,在nfs上伪文件系统的id称为fsid)并固定到导出目录的。

1.陆 nfs身份映射

NFS的目标是导出目录给各客户端,因而导出目录中的文件在服务端和客户端上自然有两套属性、权限集。

比方,服务端导出目录中某a文件的全数者和所属组都为A,但在客户端上不存在A,那么在客户端上什么展现a文件的主人等天性。再举个例子说,在客户端上,以用户B在导出目录中开创了叁个文件b,假使服务端上未曾用户B,在服务端上该怎么支配文件b的主人等本性。

因此,NFS选择uid/gid <==>
username/groupname映射的法子消除客户端和服务端两套属性难点。由于服务端只好调控它协和壹端的身份映射,所以客户端也因循古板须要身份映射组件。也正是说,服务端和客户端两端都需求对导出的富有文件的持有者和所属组举办映射。

但要注意,服务端的身价映射组件为rpc.idmapd,它以守护进程格局行事。而客户端选拔nfsidmap工具实行身份映射。

劳务端映射时以uid/gid为尺度,代表客户端以身份B(若是对应uid=Xb,gid=Yb)成立的文件或涂改了文本的主人属性时,在服务端将从/etc/passwd(此处不记挂别的用户验证措施)文件中寻找uid=Xb,gid=Yb的用户,如若能检索到,则设置该公文的主人和所属组为此uid/gid对应的username/groupname,假设寻觅不到,则文件全部者和所属组直接彰显为uid/gid的值。

客户端映射时以username/groupname为原则,代表服务端上文件全部者为A时,则在客户端上寻找A用户名,倘诺找寻到,则文件全体者展现为A,不然都将显得为nobody。注意,客户端不涉及任何uid/gid调换翻译过程,尽管客户端上A用户的uid和服务端上A用户的uid差异,也仍显得为用户A。也正是说,客户端上文件全部者唯有三种结果,要么和服务端用户同名,要么呈现为nobody。

之所以思索1种独特意况,客户端上以用户B(其uid=B一)创制文件,假设服务端上并未有uid=B1的用户,那么创制文件时提交给服务端后,在服务端上该公文全数者将显得为B一(注意它是一个数值)。再再次回到到客户端上看,客户端映射时只简轻巧单映射username,不关乎uid的调换,由此它感觉该文件的全体者为B一(不是uid,而是username),但客户端上明确未有用户名称叫B一的用户(即使有uid=B1对应的用户B),因此在客户端,此文件全数者将离奇地将呈现为nobody,其奇异之处在于,客户端上以身份B创立的公文,结果在客户端上却显示为nobody。

综上思量,强烈提议客户端和服务端的用户地方要统壹,且尽量让各uid、gid能对应上。

1.5 showmount命令

利用showmount命令可以查看某壹台主机的导出目录景况。因为关乎到rpc请求,所以如若rpc出难点,showmount同样会傻傻地守候。

主要有3个选项。

showmount [ -ade]  host
-a:以host:dir格式列出客户端名称/IP以及所挂载的目录。但注意该选项是读取NFS服务端/var/lib/nfs/rmtab文件,
  :而该文件很多时候并不准确,所以showmount -a的输出信息很可能并非准确无误的
-e:显示NFS服务端所有导出列表。
-d:仅列出已被客户端挂载的导出目录。

除此以外showmount的结果是排序过的,所以和实际的导出目录顺序大概并不一样样。

例如:

[[email protected] ~]# showmount -e 172.16.10.5
Export list for 172.16.10.5:
/backup/archive *
/vol/vol2       *
/vol/vol0       *
/www            172.16.10.4

[[email protected] ~]# showmount -d 172.16.10.5
Directories on 172.16.10.5:
/backup/archive
/vol/vol0
/vol/vol2

一.7 使用exportfs命令导出目录

除此而外运转nfs服务加载配置文件/etc/exports来导出目录,使用exportfs命令也足以素来导出目录,它不需求加载配置文件/etc/exports,当然exportfs也能够加载/etc/exports文件来导出目录。实际上,nfs服务运营脚本中正是使用exportfs命令来导出/etc/exports中内容的。

譬如说,CentOS 陆上/etc/init.d/nfs文件中,导出和卸载导出目录的下令为:

[root@xuexi ~]# grep exportfs /etc/init.d/nfs  
        [ -x /usr/sbin/exportfs ] || exit 5
        action $"Starting NFS services: " /usr/sbin/exportfs -r
        cnt=`/usr/sbin/exportfs -v | /usr/bin/wc -l`
                action $"Shutting down NFS services: " /usr/sbin/exportfs -au
        /usr/sbin/exportfs -r

在CentOS 七上则如下:

[root@xuexi ~]# grep exportfs /usr/lib/systemd/system/nfs.service      
ExecStartPre=-/usr/sbin/exportfs -r
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f
ExecReload=-/usr/sbin/exportfs -r

当然,无论如何,nfsd等医生和护师进度是必须已经运维好的。

以下是CentOS 七上exportfs命令的用法。注意, CentOS 7比CentOS
陆多片段选取。

-a     导出或卸载所有目录。
-o options,...
       指定一系列导出选项(如rw,async,root_squash),这些导出选项在exports(5)的man文档中有记录。
-i     忽略/etc/exports和/etc/exports.d目录下文件。此时只有命令行中给定选项和默认选项会生效。
-r     重新导出所有目录,并同步修改/var/lib/nfs/etab文件中关于/etc/exports和/etc/exports.d/
       *.exports的信息(即还会重新导出/etc/exports和/etc/exports.d/*等导出配置文件中的项)。该
       选项会移除/var/lib/nfs/etab中已经被删除和无效的导出项。
-u     卸载(即不再导出)一个或多个导出目录。
-f     如果/prof/fs/nfsd或/proc/fs/nfs已被挂载,即工作在新模式下,该选项将清空内核中导出表中
       的所有导出项。客户端下一次请求挂载导出项时会通过rpc.mountd将其添加到内核的导出表中。
-v     输出详细信息。
-s     显示适用于/etc/exports的当前导出目录列表。

例如:

(1).导出/www目录给客户端172.16.10.6。

exportfs 172.16.10.6:/www

(二).导出/www目录给全部人,并钦定导出选项。

exportfs :/www -o rw,no_root_squash

(三).导出exports文件中的内容。

exportfs -a

(4).重新导出全体已导出的目录。蕴含exports文件杏月exportfs单独导出的目录。

exportfs -ar

(5).卸载全数已导出的目录,包蕴exports文件中的内容和exportfs单独导出的开始和结果。即其本质为清空内核维护的导出表。

exportfs -au

(陆).只卸载某多个导出目录。

exportfs -u 172.16.10.6:/www

一.六 nfs身份映射

NFS的目标是导出目录给各客户端,因而导出目录中的文件在服务端和客户端上必然有两套属性、权限集。

譬如说,服务端导出目录中某a文件的主人和所属组都为A,但在客户端上不存在A,那么在客户端上怎么展现a文件的持有者等品质。再举个例子,在客户端上,以用户B在导出目录中创立了一个文件b,如若服务端上尚无用户B,在服务端上该怎么调节文件b的持有者等质量。

据此,NFS采取uid/gid <==>
username/groupname映射的措施减轻客户端和服务端两套属性难题。由于服务端只好调控它本身1端的身份映射,所以客户端也同样供给身份映射组件。约等于说,服务端和客户端两端都亟需对导出的有着文件的全部者和所属组实行映射。

但要注意,服务端的身价映射组件为rpc.idmapd,它以守护进度格局行事。而客户端采取nfsidmap工具举办身份映射。

劳动端映射时以uid/gid为标准,意味着客户端以身份B(借使对应uid=Xb,gid=Yb)创立的文件或退换了文本的全体者属性时,在服务端将从/etc/passwd(此处不思虑其余用户验证格局)文件中寻觅uid=Xb,gid=Yb的用户,若是能寻觅到,则设置该文件的全体者和所属组为此uid/gid对应的username/groupname,如若寻觅不到,则文件全体者和所属组直接展现为uid/gid的值。

客户端映射时以username/groupname为基准,意味着服务端上文件全数者为A时,则在客户端上寻觅A用户名,假诺寻找到,则文件全体者展现为A,不然都将呈现为nobody。注意,客户端不涉及任何uid/gid调换翻译进程,就算客户端上A用户的uid和服务端上A用户的uid区别,也仍展现为用户A。也正是说,客户端上文件所有者只有三种结果,要么和服务端用户同名,要么突显为nobody。

由此思虑1种特有情状,客户端上以用户B(其uid=B一)创立文件,假若服务端上未曾uid=B壹的用户,那么创建文件时提交给服务端后,在服务端上该文件全部者将展示为B一(注意它是叁个数值)。再重返到客户端上看,客户端映射时只简轻易单映射username,不关乎uid的调换,因此它认为该文件的持有者为B一(不是uid,而是username),但客户端上自然未有用户名称为B一的用户(即使有uid=B一对应的用户B),因而在客户端,此文件全部者将古怪地将彰显为nobody,其离奇之处在于,客户端上以身份B创立的公文,结果在客户端上却展现为nobody。

综上思虑,强烈建议客户端和服务端的用户身份要统1,且尽量让各uid、gid能对应上。

1.八 RPC的调整工具rpcdebug

在重重时候NFS客户端或然服务端出现万分,举个例子连接不上、锁状态丢失、连接相当慢等等难点,都能够对NFS举办调理来开掘难题出在哪些环节。NFS有多数种经营过都足以间接辅助调节和测试选项,但最直白的调理方式是调度rpc,因为NFS的各样请求和响应都会通过RPC去封装。但强烈,调节和测试RPC比一贯调节和测试NFS时更难分析出难点所在。以下只介绍怎么着调度RPC。

rpc单独提供3个调度工具rpcdebug。

[root@xuexi ~]# rpcdebug -vh
usage: rpcdebug [-v] [-h] [-m module] [-s flags...|-c flags...]
       set or cancel debug flags.

Module     Valid flags
rpc        xprt call debug nfs auth bind sched trans svcsock svcdsp misc cache all
nfs        vfs dircache lookupcache pagecache proc xdr file root callback client mount fscache pnfs pnfs_ld state all
nfsd       sock fh export svc proc fileop auth repcache xdr lockd all
nlm        svc client clntlock svclock monitor clntsubs svcsubs hostcache xdr all

其中:

-v:显示更详细信息
-h:显示帮助信息
-m:指定调试模块,有rpc/nfs/nfsd/nlm共4个模块可调试。
  :顾名思义,调试rpc模块就是直接调试rpc的问题,将记录rpc相关的日志信息;
  :调试nfs是调试nfs客户端的问题,将记录nfs客户端随之产生的日志信息;
  :nfsd是调试nfs服务端问题,将记录nfsd随之产生的日志信息;
  :nlm是调试nfs锁管理器相关问题,将只记录锁相关信息
-s:指定调试的修饰符,每个模块都有不同的修饰符,见上面的usage中"Valid flags"列的信息
-c:清除或清空已设置的调试flage

比如设置调节和测试nfs客户端的讯息。

rpcdebug -m nfs -s all

当有音信出现时,将记录到syslog中。比方以下是客户端挂载nfs导出目录发生的音讯,存放在/var/log/messages中,十二分多,所以排除和化解难题时索要有耐心。

Jul 29 11:24:04 xuexi kernel: NFS: nfs mount opts='vers=4,addr=172.16.10.9,clientaddr=172.16.10.3'
Jul 29 11:24:04 xuexi kernel: NFS:   parsing nfs mount option 'vers=4'
Jul 29 11:24:04 xuexi kernel: NFS:   parsing nfs mount option 'addr=172.16.10.9'
Jul 29 11:24:04 xuexi kernel: NFS:   parsing nfs mount option 'clientaddr=172.16.10.3'
Jul 29 11:24:04 xuexi kernel: NFS: MNTPATH: '/tmp/testdir'
Jul 29 11:24:04 xuexi kernel: --> nfs4_try_mount()
Jul 29 11:24:04 xuexi kernel: --> nfs4_create_server()
Jul 29 11:24:04 xuexi kernel: --> nfs4_init_server()
Jul 29 11:24:04 xuexi kernel: --> nfs4_set_client()
Jul 29 11:24:04 xuexi kernel: --> nfs_get_client(172.16.10.9,v4)
Jul 29 11:24:04 xuexi kernel: NFS: get client cookie (0xffff88004c561800/0xffff8800364cd2c0)
Jul 29 11:24:04 xuexi kernel: nfs_create_rpc_client: cannot create RPC client. Error = -22
Jul 29 11:24:04 xuexi kernel: --> nfs4_realloc_slot_table: max_reqs=1024, tbl->max_slots 0
Jul 29 11:24:04 xuexi kernel: nfs4_realloc_slot_table: tbl=ffff88004b715c00 slots=ffff880063f32280 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_realloc_slot_table: return 0
Jul 29 11:24:04 xuexi kernel: NFS: nfs4_discover_server_trunking: testing '172.16.10.9'
Jul 29 11:24:04 xuexi kernel: NFS call  setclientid auth=UNIX, 'Linux NFSv4.0 172.16.10.3/172.16.10.9 tcp'
Jul 29 11:24:04 xuexi kernel: NFS reply setclientid: 0
Jul 29 11:24:04 xuexi kernel: NFS call  setclientid_confirm auth=UNIX, (client ID 578d865901000000)
Jul 29 11:24:04 xuexi kernel: NFS reply setclientid_confirm: 0
Jul 29 11:24:04 xuexi kernel: NFS: <-- nfs40_walk_client_list using nfs_client = ffff88004c561800 ({2})
Jul 29 11:24:04 xuexi kernel: NFS: <-- nfs40_walk_client_list status = 0
Jul 29 11:24:04 xuexi kernel: nfs4_schedule_state_renewal: requeueing work. Lease period = 5
Jul 29 11:24:04 xuexi kernel: NFS: nfs4_discover_server_trunking: status = 0
Jul 29 11:24:04 xuexi kernel: --> nfs_put_client({2})
Jul 29 11:24:04 xuexi kernel: <-- nfs4_set_client() = 0 [new ffff88004c561800]
Jul 29 11:24:04 xuexi kernel: <-- nfs4_init_server() = 0
Jul 29 11:24:04 xuexi kernel: --> nfs4_get_rootfh()
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=040000
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=4651240235397459983
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0x0/0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=2
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=0555
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=23
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=1501990255
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501989952
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501989952
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=1
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_supported: bitmask=fdffbfff:00f9be3e:00000000
Jul 29 11:24:04 xuexi kernel: decode_attr_fh_expire_type: expire type=0x0
Jul 29 11:24:04 xuexi kernel: decode_attr_link_support: link support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_symlink_support: symlink support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_aclsupport: ACLs supported=3
Jul 29 11:24:04 xuexi kernel: decode_server_caps: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_lease_time: file size=90
Jul 29 11:24:04 xuexi kernel: decode_attr_maxfilesize: maxfilesize=18446744073709551615
Jul 29 11:24:04 xuexi kernel: decode_attr_maxread: maxread=131072
Jul 29 11:24:04 xuexi kernel: decode_attr_maxwrite: maxwrite=131072
Jul 29 11:24:04 xuexi kernel: decode_attr_time_delta: time_delta=1 0
Jul 29 11:24:04 xuexi kernel: decode_attr_pnfstype: bitmap is 0
Jul 29 11:24:04 xuexi kernel: decode_attr_layout_blksize: bitmap is 0
Jul 29 11:24:04 xuexi kernel: decode_fsinfo: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: <-- nfs4_get_rootfh() = 0
Jul 29 11:24:04 xuexi kernel: Server FSID: 0:0
Jul 29 11:24:04 xuexi kernel: Pseudo-fs root FH at ffff880064c4ad80 is 8 bytes, crc: 0x62d40c52:
Jul 29 11:24:04 xuexi kernel: 01000100 00000000
Jul 29 11:24:04 xuexi kernel: --> nfs_probe_fsinfo()
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_supported: bitmask=fdffbfff:00f9be3e:00000000
Jul 29 11:24:04 xuexi kernel: decode_attr_fh_expire_type: expire type=0x0
Jul 29 11:24:04 xuexi kernel: decode_attr_link_support: link support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_symlink_support: symlink support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_aclsupport: ACLs supported=3
Jul 29 11:24:04 xuexi kernel: decode_server_caps: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_lease_time: file size=90
Jul 29 11:24:04 xuexi kernel: decode_attr_maxfilesize: maxfilesize=18446744073709551615
Jul 29 11:24:04 xuexi kernel: decode_attr_maxread: maxread=131072
Jul 29 11:24:04 xuexi kernel: decode_attr_maxwrite: maxwrite=131072
Jul 29 11:24:04 xuexi kernel: decode_attr_time_delta: time_delta=1 0
Jul 29 11:24:04 xuexi kernel: decode_attr_pnfstype: bitmap is 0
Jul 29 11:24:04 xuexi kernel: decode_attr_layout_blksize: bitmap is 0
Jul 29 11:24:04 xuexi kernel: decode_fsinfo: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: set_pnfs_layoutdriver: Using NFSv4 I/O
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_maxlink: maxlink=255
Jul 29 11:24:04 xuexi kernel: decode_attr_maxname: maxname=255
Jul 29 11:24:04 xuexi kernel: decode_pathconf: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: <-- nfs_probe_fsinfo() = 0
Jul 29 11:24:04 xuexi kernel: <-- nfs4_create_server() = ffff88007746a800
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_supported: bitmask=fdffbfff:00f9be3e:00000000
Jul 29 11:24:04 xuexi kernel: decode_attr_fh_expire_type: expire type=0x0
Jul 29 11:24:04 xuexi kernel: decode_attr_link_support: link support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_symlink_support: symlink support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_aclsupport: ACLs supported=3
Jul 29 11:24:04 xuexi kernel: decode_server_caps: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=040000
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=4651240235397459983
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0x0/0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=2
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=0555
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=23
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=1501990255
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501989952
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501989952
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=1
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS: nfs_fhget(0:38/2 fh_crc=0x62d40c52 ct=1)
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=00
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=4651240235397459983
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0x0/0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=00
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=1
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=-2
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=-2
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=0
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=0
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501989952
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501989952
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS: nfs_update_inode(0:38/2 fh_crc=0x62d40c52 ct=2 info=0x26040)
Jul 29 11:24:04 xuexi kernel: NFS: permission(0:38/2), mask=0x1, res=0
Jul 29 11:24:04 xuexi kernel: NFS: permission(0:38/2), mask=0x81, res=0
Jul 29 11:24:04 xuexi kernel: NFS: lookup(/tmp)
Jul 29 11:24:04 xuexi kernel: NFS call  lookup tmp
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=040000
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=16540743250786234113
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0xf199fcb4fb064bf5/0xa1b7a15af0f7cb47)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=391681
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=01777
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=5
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=1501990260
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=391681
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS reply lookup: 0
Jul 29 11:24:04 xuexi kernel: NFS: nfs_fhget(0:38/391681 fh_crc=0xb4775a3f ct=1)
Jul 29 11:24:04 xuexi kernel: --> nfs_d_automount()
Jul 29 11:24:04 xuexi kernel: nfs_d_automount: enter
Jul 29 11:24:04 xuexi kernel: NFS call  lookup tmp
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=040000
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=16540743250786234113
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0xf199fcb4fb064bf5/0xa1b7a15af0f7cb47)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=391681
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=01777
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=5
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=1501990260
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=391681
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS reply lookup: 0
Jul 29 11:24:04 xuexi kernel: --> nfs_do_submount()
Jul 29 11:24:04 xuexi kernel: nfs_do_submount: submounting on /tmp
Jul 29 11:24:04 xuexi kernel: --> nfs_xdev_mount()
Jul 29 11:24:04 xuexi kernel: --> nfs_clone_server(,f199fcb4fb064bf5:a1b7a15af0f7cb47,)
Jul 29 11:24:04 xuexi kernel: --> nfs_probe_fsinfo()
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_supported: bitmask=fdffbfff:00f9be3e:00000000
Jul 29 11:24:04 xuexi kernel: decode_attr_fh_expire_type: expire type=0x0
Jul 29 11:24:04 xuexi kernel: decode_attr_link_support: link support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_symlink_support: symlink support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_aclsupport: ACLs supported=3
Jul 29 11:24:04 xuexi kernel: decode_server_caps: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_lease_time: file size=90
Jul 29 11:24:04 xuexi kernel: decode_attr_maxfilesize: maxfilesize=18446744073709551615
Jul 29 11:24:04 xuexi kernel: decode_attr_maxread: maxread=131072
Jul 29 11:24:04 xuexi kernel: decode_attr_maxwrite: maxwrite=131072
Jul 29 11:24:04 xuexi kernel: decode_attr_time_delta: time_delta=1 0
Jul 29 11:24:04 xuexi kernel: decode_attr_pnfstype: bitmap is 0
Jul 29 11:24:04 xuexi kernel: decode_attr_layout_blksize: bitmap is 0
Jul 29 11:24:04 xuexi kernel: decode_fsinfo: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: set_pnfs_layoutdriver: Using NFSv4 I/O
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_maxlink: maxlink=255
Jul 29 11:24:04 xuexi kernel: decode_attr_maxname: maxname=255
Jul 29 11:24:04 xuexi kernel: decode_pathconf: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: <-- nfs_probe_fsinfo() = 0
Jul 29 11:24:04 xuexi kernel: Cloned FSID: f199fcb4fb064bf5:a1b7a15af0f7cb47
Jul 29 11:24:04 xuexi kernel: <-- nfs_clone_server() = ffff88006f407000
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_supported: bitmask=fdffbfff:00f9be3e:00000000
Jul 29 11:24:04 xuexi kernel: decode_attr_fh_expire_type: expire type=0x0
Jul 29 11:24:04 xuexi kernel: decode_attr_link_support: link support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_symlink_support: symlink support=true
Jul 29 11:24:04 xuexi kernel: decode_attr_aclsupport: ACLs supported=3
Jul 29 11:24:04 xuexi kernel: decode_server_caps: xdr returned 0!
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=040000
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=16540743250786234113
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0xf199fcb4fb064bf5/0xa1b7a15af0f7cb47)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=391681
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=01777
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=5
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=1501990260
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=391681
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS: nfs_fhget(0:40/391681 fh_crc=0xb4775a3f ct=1)
Jul 29 11:24:04 xuexi kernel: <-- nfs_xdev_mount() = 0
Jul 29 11:24:04 xuexi kernel: nfs_do_submount: done
Jul 29 11:24:04 xuexi kernel: <-- nfs_do_submount() = ffff880064fdfb20
Jul 29 11:24:04 xuexi kernel: nfs_d_automount: done, success
Jul 29 11:24:04 xuexi kernel: <-- nfs_d_automount() = ffff880064fdfb20
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=00
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=16540743250786234113
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0x0/0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=00
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=1
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=-2
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=-2
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=0
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=0
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1501990117
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS: nfs_update_inode(0:40/391681 fh_crc=0xb4775a3f ct=2 info=0x26040)
Jul 29 11:24:04 xuexi kernel: NFS: permission(0:40/391681), mask=0x1, res=0
Jul 29 11:24:04 xuexi kernel: NFS: lookup(/testdir)
Jul 29 11:24:04 xuexi kernel: NFS call  lookup testdir
Jul 29 11:24:04 xuexi kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=1024
Jul 29 11:24:04 xuexi kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_type: type=040000
Jul 29 11:24:04 xuexi kernel: decode_attr_change: change attribute=7393570666420598027
Jul 29 11:24:04 xuexi kernel: decode_attr_size: file size=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_fsid: fsid=(0xf199fcb4fb064bf5/0xa1b7a15af0f7cb47)
Jul 29 11:24:04 xuexi kernel: decode_attr_fileid: fileid=391682
Jul 29 11:24:04 xuexi kernel: decode_attr_fs_locations: fs_locations done, error = 0
Jul 29 11:24:04 xuexi kernel: decode_attr_mode: file mode=0754
Jul 29 11:24:04 xuexi kernel: decode_attr_nlink: nlink=3
Jul 29 11:24:04 xuexi kernel: decode_attr_owner: uid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_group: gid=0
Jul 29 11:24:04 xuexi kernel: decode_attr_rdev: rdev=(0x0:0x0)
Jul 29 11:24:04 xuexi kernel: decode_attr_space_used: space used=4096
Jul 29 11:24:04 xuexi kernel: decode_attr_time_access: atime=1501990266
Jul 29 11:24:04 xuexi kernel: decode_attr_time_metadata: ctime=1497209702
Jul 29 11:24:04 xuexi kernel: decode_attr_time_modify: mtime=1496802409
Jul 29 11:24:04 xuexi kernel: decode_attr_mounted_on_fileid: fileid=391682
Jul 29 11:24:04 xuexi kernel: decode_getfattr_attrs: xdr returned 0
Jul 29 11:24:04 xuexi kernel: decode_getfattr_generic: xdr returned 0
Jul 29 11:24:04 xuexi kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Jul 29 11:24:04 xuexi kernel: NFS reply lookup: 0
Jul 29 11:24:04 xuexi kernel: NFS: nfs_fhget(0:40/391682 fh_crc=0xec69f317 ct=1)
Jul 29 11:24:04 xuexi kernel: NFS: dentry_delete(/tmp, 202008c)
Jul 29 11:24:04 xuexi kernel: NFS: clear cookie (0xffff88005eaf4620/0x          (null))
Jul 29 11:24:04 xuexi kernel: NFS: clear cookie (0xffff88005eaf4a40/0x          (null))
Jul 29 11:24:04 xuexi kernel: NFS: releasing superblock cookie (0xffff88007746a800/0x          (null))
Jul 29 11:24:04 xuexi kernel: --> nfs_free_server()
Jul 29 11:24:04 xuexi kernel: --> nfs_put_client({2})
Jul 29 11:24:04 xuexi kernel: <-- nfs_free_server()
Jul 29 11:24:04 xuexi kernel: <-- nfs4_try_mount() = 0

1.7 使用exportfs命令导出目录

除此而外运转nfs服务加载配置文件/etc/exports来导出目录,使用exportfs命令也能够直接导出目录,它没有须要加载配置文件/etc/exports,当然exportfs也足以加在/etc/exports文件来导出目录。实际上,nfs服务运营脚本中便是使用exportfs命令来导出/etc/exports中剧情的。

例如说,CentOS 陆上/etc/init.d/nfs文件中,导出和卸载导出目录的一声令下为:

[[email protected] ~]# grep exportfs /etc/init.d/nfs  
        [ -x /usr/sbin/exportfs ] || exit 5
        action $"Starting NFS services: " /usr/sbin/exportfs -r
        cnt=`/usr/sbin/exportfs -v | /usr/bin/wc -l`
                action $"Shutting down NFS services: " /usr/sbin/exportfs -au
        /usr/sbin/exportfs -r

在CentOS 七上则如下:

[[email protected] ~]# grep exportfs /usr/lib/systemd/system/nfs.service      
ExecStartPre=-/usr/sbin/exportfs -r
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f
ExecReload=-/usr/sbin/exportfs -r

道理当然是那样的,无论怎样,nfsd等医生和医护人员进程是必须已经运维好的。

以下是CentOS 七上exportfs命令的用法。注意, CentOS 柒比CentOS
陆多某个挑选。

-a     导出或卸载所有目录。
-o options,...
       指定一系列导出选项(如rw,async,root_squash),这些导出选项在exports(5)的man文档中有记录。
-i     忽略/etc/exports和/etc/exports.d目录下文件。此时只有命令行中给定选项和默认选项会生效。
-r     重新导出所有目录,并同步修改/var/lib/nfs/etab文件中关于/etc/exports和/etc/exports.d/
       *.exports的信息(即还会重新导出/etc/exports和/etc/exports.d/*等导出配置文件中的项)。该
       选项会移除/var/lib/nfs/etab中已经被删除和无效的导出项。
-u     卸载(即不再导出)一个或多个导出目录。
-f     如果/prof/fs/nfsd或/proc/fs/nfs已被挂载,即工作在新模式下,该选项将清空内核中导出表中
       的所有导出项。客户端下一次请求挂载导出项时会通过rpc.mountd将其添加到内核的导出表中。
-v     输出详细信息。
-s     显示适用于/etc/exports的当前导出目录列表。

例如:

(一).导出/www目录给客户端172.1六.10.陆。

exportfs 172.16.10.6:/www

(二).导出/www目录给全体人,并内定导出选项。

exportfs :/www -o rw,no_root_squash

(三).导出exports文件中的内容。

exportfs -a

(四).重新导出装有已导出的目录。包涵exports文件花月exportfs单独导出的目录。

exportfs -ar

(伍).卸载全部已导出的目录,包蕴exports文件中的内容和exportfs单独导出的内容。即其本质为清空内核维护的导出表。

exportfs -au

(6).只卸载某3个导出目录。

exportfs -u 172.16.10.6:/www

1.9 深入NFS的方向

本文仅简介了部分NFS的主旨选拔方法,但NFS本人其实是很复杂的,想浓厚也不是1件轻易的事。举个例子,以下列出了几个NFS在促成上应有要消除的主题素材。

(一).多台湾游客户端挂载同三个导出的目录后,要同时编写制定当中同二个文件时,应该怎么管理?这是共享文件更新难题,通用的缓慢解决方法是利用文件锁。

(2).客户端上对文件内容做出修改后是不是要立马联合到服务端上?那是共享文件的数额缓存难题,体现的不二等秘书技是文本数量是或不是要在各客户端上保证一致性。和率先个难点结合起来,便是布满式(集群)文件数量一致性难点。

(三).客户端或服务端实行了重启,恐怕它们出现了故障,亦只怕它们中间的网络出现故障后,它们的对端怎么样明白它已经出现了故障?那是故障布告或重启通知难题。

(4).出现故障后,不奇怪重启成功了,那么怎样回复到故障前情形?那是故障苏醒难题。

(伍).假若服务端故障后平昔不可能复苏,客户端是还是不是能自动故障转移到另1台寻常干活的NFS服务节点?这是高可用难点。(NFS版本四(后文将简写为NFSv4)能够从自个儿达成故障转移,当然使用高可用工具如heartbeat也一致能落成)

小结起来就多少个主要词:锁、缓存、数据和缓存壹致性、文告和故障复苏。从这个根本字中,很当然地会联想到了集群和分布式文件系统,其实NFS也是一种简易的布满式文件系统,但从没像集群或布满式文件系统那样达成大致一应俱全的锁、缓存一致性等作用。而且NFSv4为了反映其特点和个性,在有的通用难题上应用了与集群、遍及式文件系统差别的法子,如运用了文件委托(服务端将文件委托给客户端,由此完毕类似锁的功用)、锁或委托的租约等(就如DHCP的IP租约一样,在租约期内,锁和寄托以及缓存是行得通的,租约过期后那些内容都没用)。

因此知,深切NFS其实就是在深刻布满式文件系统,由于网络对NFS深刻介绍的文章大致平素不,所以想深切它不用1件轻松的事。假如有深深学习的主张,能够翻阅NFSv4的RFC3530文档的前九章。以下是本人的一部分man文书档案翻译。

 

翻译:man rpcbind(rpcbind中文手册)
翻译:man nfsd(rpc.nfsd中文手册)
翻译:man mountd(rpc.mountd中文手册)
翻译:man statd(rpc.statd中文手册)
翻译:man sm-notify(sm-notify命令中文手册)
翻译:man exportfs(exportfs命令中文手册)

以下是man nfs中关于传输方法和缓存相关内容的翻译。

TRANSPORT METHODS
       NFS客户端是通过RPC向NFS服务端发送请求的。RPC客户端会自动发现远程服务端点,处理每请求(per-request)的
       身份验证,调整当客户端和服务端之间出现不同字节字节序(byte endianness)时的请求参数,并且当请求在网络
       上丢失或被服务端丢弃时重传请求。rpc请求和响应数据包是通过网络传输的。

       在大多数情形下,mount(8)命令、NFS客户端和NFS服务端可以为挂载点自动协商合适的传输方式以及数据传输时
       的大小。但在某些情况下,需要使用mount选项显式指定这些设置。

       对于的传统NFS,NFS客户端只使用UDP传输请求给服务端。尽管实现方式很简单,但基于UDP的NFS有许多限制,在
       一些通用部署环境下,这些限制项会限制平滑运行的能力,还会限制性能。即使是UDP丢包率极小的情况,也将
       导致整个NFS请求丢失;因此,重传的超时时间一般都是亚秒级的,这样可以让客户端从请求丢失中快速恢复,但
       即使如此,这可能会导致无关的网络阻塞以及服务端负载加重。

       但是在专门设置了网络MTU值是相对于NFS的输出传输大小时(例如在网络环境下启用了巨型以太网帧)(注:相对的
       意思,例如它们成比例关系),UDP是非常高效的。在这种环境下,建议修剪rsize和wsize,以便让每个NFS的读或
       写请求都能容纳在几个网络帧(甚至单个帧)中。这会降低由于单个MTU大小的网络帧丢失而导致整个读或写请求丢
       失的概率。

       (译者注:UDP是NFSv2和NFSv3所支持的,NFSv4使用TCP,所以以上两段不用考虑)

       现代NFS都默认采用TCP传输协议。在几乎所有可想到的网络环境下,TCP都表现良好,且提供了非常好的保证,防
       止因为网络不可靠而引起数据损坏。但使用TCP传输协议,基本上都会考虑设置相关防火墙。

       在正常环境下,网络丢包的频率比NFS服务丢包的频率要高的多。因此,没有必要为基于TCP的NFS设置极短的重传
       超时时间。一般基于TCP的NFS的超时时间设置在1分钟和10分钟之间。当客户端耗尽了重传次数(选项retrans的值),
       它将假定发生了网络分裂,并尝试以新的套接字重新连接服务端。由于TCP自身使得网络传输的数据是可靠的,所
       以,可以安全地使用处在默认值和客户端服务端同时支持的最大值之间的rszie和wsize,而不再依赖于网络MTU大小。

DATA AND METADATA COHERENCE
       现在有些集群文件系统为客户端之间提供了非常完美的缓存一致性功能,但对于NFS客户端来说,实现完美的缓
       存一致性是非常昂贵的,特别是大型局域网络环境。因此,NFS提供了稍微薄弱一点的缓存一致性功能,以满足
       大多数文件共享需求。

   Close-to-open cache consistency
       一般情况下,文件共享是完全序列化的。首先客户端A打开一个文件,写入一些数据,然后关闭文件然后客户端B
       打开同一个文件,并读取到这些修改后的数据。

       当应用程序打开一个存储在NFSv3服务端上的文件时,NFS客户端检查文件在服务端上是否存在,并通过是否发送
       GETATTR或ACCESS请求判断文件是否允许被打开。NFS客户端发送这些请求时,不会考虑已缓存文件属性是否是新
       鲜有效的。

       当应用程序关闭文件,NFS客户端立即将已做的修改写入到文件中,以便下一个打开者可以看到所做的改变。这
       也给了NFS客户端一个机会,使得它可以通过文件关闭时的返回状态码向应用程序报告错误。

       在打开文件时以及关闭文件刷入数据时的检查行为被称为close-to-open缓存一致性,或简称为CTO。可以通过使
       用nocto选项来禁用整个挂载点的CTO。

       (译者注:NFS关闭文件时,客户端会将所做的修改刷入到文件中,然后发送GETATTR请求以确保该文件的属性缓存
       已被更新。之后其他的打开者打开文件时会发送GETATTR请求,根据文件的属性缓存可以判断文件是否被打开并做
       了修改。这可以避免缓存无效)

   Weak cache consistency
       客户端的数据缓存仍有几乎包含过期数据。NFSv3协议引入了"weak cache consistency"(WCC),它提供了一种在单
       个文件被请求之前和之后有效地检查文件属性的方式。这有助于客户端识别出由其他客户端对此文件做出的改变。

       当某客户端使用了并发操作,使得同一文件在同一时间做出了多次更新(例如,后台异步写入),它仍将难以判断
       是该客户端的更新操作修改了此文件还是其他客户端的更新操作修改了文件。

   Attribute caching
       使用noac挂载选项可以让多客户端之间实现属性缓存一致性。几乎每个文件系统的操作都会检查文件的属性信息。
       客户端自身会保留属性缓存一段时间以减少网络和服务端的负载。当noac生效时,客户端的文件属性缓存就会被
       禁用,因此每个会检查文件属性的操作都被强制返回到服务端上来操作文件,这表示客户端以牺牲网络资源为代
       价来快速查看文件发生的变化。

       不要混淆noac选项和"no data caching"。noac挂载选项阻止客户端缓存文件的元数据,但仍然可能会缓存非元数
       据的其他数据。

       NFS协议设计的目的不是为了支持真正完美的集群文件系统缓存一致性。如果要达到客户端之间缓存数据的绝对
       一致,那么应该使用文件锁的方式。

   File timestamp maintainence
       NFS服务端负责管理文件和目录的时间戳(atime,ctime,mtime)。当服务端文件被访问或被更新,文件的时间戳也会
       像本地文件系统那样改变。

       NFS客户端缓存的文件属性中包括了时间戳属性。当NFS客户端检索NFS服务端文件属性时,客户端文件的时间戳会
       更新。因此,在NFS服务端的时间戳更新后显示在NFS客户端之前可能会有一些延迟。

       为了遵守POSIX文件系统标准,Linux NFS客户端需要依赖于NFS服务端来保持文件的mtime和ctime时间戳最新状态。
       实现方式是先让客户端将改变的数据刷入到服务端,然后再输出文件的mtime。

       然而,Linux客户端可以很轻松地处理atime的更新。NFS客户端可以通过缓存数据来保持良好的性能,但这意味着
       客户端应用程序读取文件(会更新atime)时,不会反映到服务端,但实际上服务端的atime已经修改了。

       由于文件属性缓存行为,Linux NFS客户端mount时不支持一般的atime相关的挂载选项。

       特别是mount时指定了atime/noatime,diratime/nodiratime,relatime/norelatime以及strictatime/nostrictatime
       挂载选项,实际上它们没有任何效果。

   Directory entry caching
       Linux NFS客户端缓存所有NFS LOOKUP请求的结果。如果所请求目录项在服务端上存在,则查询的结果称为正查询
       结果。如果请求的目录在服务端上不存在(服务端将返回ENOENT),则查询的结果称为负查询结果。

       为了探测目录项是否添加到NFS服务端或从其上移除了,Linux NFS客户端会监控目录的mtime。如果客户端监测到
       目录的mtime发生了改变,客户端将丢弃该目录相关的所有LOOKUP缓存结果。由于目录的mtime是一种缓存属性,因
       此服务端目录mtime发生改变后,客户端可能需要等一段时间才能监测到它的改变。

       缓存目录提高了不与其他客户端上的应用程序共享文件的应用程序的性能。但使用目录缓存可能会干扰在多个客户
       端上同时运行的应用程序,并且需要快速检测文件的创建或删除。lookupcache挂载选项允许对目录缓存行为进行一
       些调整。

       如果客户端禁用目录缓存,则每次LOOKUP操作都需要与服务端进行验证,那么该客户端可以立即探测到其他客户端
       创建或删除的目录。可以使用lookupcache=none来禁用目录缓存。如果禁用了目录缓存,由于需要额外的NFS请求,
       这会损失一些性能,但禁用目录缓存比使用noac损失的性能要少,且对NFS客户端缓存文件属性没有任何影响。

   The sync mount option
       NFS客户端对待sync挂载选项的方式和挂载其他文件系统不同。如果即不指定sync也不指定async,则默认为async。
       async表示异步写入,除了发生下面几种特殊情况,NFS客户端会延迟发送写操作到服务端:

              ● 内存压力迫使回收系统内存资源。
              ● 客户端应用程序显式使用了sync类的系统调用,如sync(2),msync(2)或fsync(3)。
              ● 关闭文件时。
              ● 文件被锁/解锁。

       换句话说,在正常环境下,应用程序写的数据不会立即保存到服务端。(当然,关闭文件时是立即同步的)

       如果在挂载点上指定sync选项,任何将数据写入挂载点上文件的系统调用都会先把数据刷到服务端上,然后系统调
       用才把控制权返回给用户空间。这提供了客户端之间更好的数据缓存一致性,但消耗了大量性能。

       在未使用sync挂载选项时,应用程序可以使用O_SYNC修饰符强制立即把单个文件的数据刷入到服务端。

   Using file locks with NFS
       网络锁管理器(Network Lock Manager,NLM)协议是一个独立的协议,用于管理NFSv2和NFSv3的文件锁。为了让客户端
       或服务端在重启后能恢复锁,需要使用另一个网络状态管理器(Network Status Manager,NSM)协议。在NFSv4中,NFS
       直协议自身接支持文件锁相关功能,所以NLM和NSM就不再使用了。

       在大多数情况下,NLM和NSM服务是自动启动的,并且不需要额外的任何配置。但需要配置NFS客户端使用的是fqdn名
       称,以保证NFS服务端可以找到客户端并通知它们服务端的重启动作。

       NLS仅支持advisory文件锁。要锁定NFS文件,可以使用待F_GETLK和F_SETLK的fcntl(2)命令。NFS客户端会转换通过
       flock(2)获取到的锁为advisory文件锁。

       当服务端不支持NLM协议,或者当NFS服务端是通过防火墙但阻塞了NLM服务端口时,则需要指定nolock挂载选项。
       当客户端挂载导出的/var目录时,必须使用nolock禁用NLM锁,因为/var目录中包含了NLM锁相关的信息。
       (注,因为NLM仅在nfsv2和nfsv3中支持,所以NFSv4不支持nolock选项)

       当仅有一个客户端时,使用nolock选项可以提高一定的性能。

   NFS version 4 caching features
       NFSv4上的数据和元数据缓存行为和之前的版本相似。但是NFSv4添加了两种特性来提升缓存行为:change attributes
       以及delegation。(注:nfsv4中取消了weak cache consistency)

       change attribute是一种新的被跟踪的文件/目录元数据信息。它替代了使用文件mtime和ctime作为客户端验证缓存内
       容的方式。但注意,change attributes和客户端/服务端文件的时间戳的改变无关。

       文件委托(file delegation)是NFSv4的客户端和NFSv4服务端之前的一种合约,它允许客户端临时处理文件,就像没有
       其他客户端正在访问该文件一样。当有其他客户端尝试访问被委托文件时,服务端一定会通知服务端(通过callback请
       求)。一旦文件被委托给某客户端,客户端可以尽可能大地缓存该文件的数据和元数据,而不需要联系服务端。

       文件委托有两种方式:read和write。读委托意味着当其他客户端尝试向委托文件写入数据时,服务端通知客户端。而
       写委托意味着其他客户端无论是尝试读还是写,服务端都会通知客户端。

       NFSv4上当文件被打开的时候,服务端会授权文件委托,并且当其他客户端想要访问该文件但和已授权的委托冲突时,
       服务端可以在任意时间点重调(recall)委托关系。不支持对目录的委托。
       (译者注:只有读委托和读委托不会冲突)

       为了支持委托回调(delegation callback),在客户端初始联系服务端时,服务端会检查网络并返回路径给客户端。如果
       和客户端的联系无法建立,服务端将不会授权任何委托给客户端。

1.8 深入NFS的方向

本文仅简要介绍了一部分NFS的骨干采取格局,但NFS自个儿其实是很复杂的,想深切也不是壹件轻易的事。比方,以下列出了多少个NFS在落成上应当要缓慢解决的难题。

(壹).多台湾游客户端挂载同3个导出的目录后,要同时编写制定个中同1个文件时,应该什么管理?那是共享文件更新难题,通用的化解方法是运用文件锁。

(2).客户端上对文件内容做出修改后是或不是要马上联合到服务端上?那是共享文件的多少缓存难点,呈现的点子是文本数量是还是不是要在各客户端上确认保障1致性。和率先个难点结合起来,便是遍及式(集群)文件数量1致性难题。

(三).客户端或服务端实行了重启,或然它们出现了故障,亦可能它们中间的互联网出现故障后,它们的对端怎么样晓得它早已面世了故障?那是故障通报或重启通告难题。

(四).出现故障后,符合规律重启成功了,那么如何恢复生机到故障前意况?那是故障恢复难题。

(五).假若服务端故障后直接不能恢复生机,客户端是或不是能自行故障转移到另1台符合规律工作的NFS服务节点?那是高可用难点。(NFS版本四(后文将简写为NFSv四)能够从自己落成故障转移,当然使用高可用工具如heartbeat也1致能促成)

总括起来就多少个重大词:锁、缓存、数据和缓存1致性、通告和故障恢复生机。从那一个关键字中,很自然地会联想到了集群和分布式文件系统,其实NFS也是一种轻便的分布式文件系统,但未曾像集群或布满式文件系统那样完结差不离全盘的锁、缓存1致性等功用。而且NFSv四为了反映其性情和属性,在局地通用难点上应用了与集群、布满式文件系统分歧的主意,如接纳了文本委托(服务端将文件委托给客户端,因而落成类似锁的功用)、锁或委托的租约等(就像是DHCP的IP租约一样,在租约期内,锁和信托以及缓存是有效的,租约过期后那些剧情都行不通)。

由此知,深远NFS其实便是在深入遍及式文件系统,由于网络对NFS深入介绍的稿子大致一直不,所以想深远它不用一件轻松的事。借使有深刻学习的主张,能够翻阅NFSv四的安德拉FC3530文书档案的前玖章。以下是本身的一对man文书档案翻译。

 

翻译:man rpcbind(rpcbind中文手册)
翻译:man nfsd(rpc.nfsd中文手册)
翻译:man mountd(rpc.mountd中文手册)
翻译:man statd(rpc.statd中文手册)
翻译:man sm-notify(sm-notify命令中文手册)
翻译:man exportfs(exportfs命令中文手册)

以下是man nfs中有关传输方法和缓存相关内容的翻译。

TRANSPORT METHODS
       NFS客户端是通过RPC向NFS服务端发送请求的。RPC客户端会自动发现远程服务端点,处理每请求(per-request)的
       身份验证,调整当客户端和服务端之间出现不同字节字节序(byte endianness)时的请求参数,并且当请求在网络
       上丢失或被服务端丢弃时重传请求。rpc请求和响应数据包是通过网络传输的。

       在大多数情形下,mount(8)命令、NFS客户端和NFS服务端可以为挂载点自动协商合适的传输方式以及数据传输时
       的大小。但在某些情况下,需要使用mount选项显式指定这些设置。

       对于的传统NFS,NFS客户端只使用UDP传输请求给服务端。尽管实现方式很简单,但基于UDP的NFS有许多限制,在
       一些通用部署环境下,这些限制项会限制平滑运行的能力,还会限制性能。即使是UDP丢包率极小的情况,也将
       导致整个NFS请求丢失;因此,重传的超时时间一般都是亚秒级的,这样可以让客户端从请求丢失中快速恢复,但
       即使如此,这可能会导致无关的网络阻塞以及服务端负载加重。

       但是在专门设置了网络MTU值是相对于NFS的输出传输大小时(例如在网络环境下启用了巨型以太网帧)(注:相对的
       意思,例如它们成比例关系),UDP是非常高效的。在这种环境下,建议修剪rsize和wsize,以便让每个NFS的读或
       写请求都能容纳在几个网络帧(甚至单个帧)中。这会降低由于单个MTU大小的网络帧丢失而导致整个读或写请求丢
       失的概率。

       (译者注:UDP是NFSv2和NFSv3所支持的,NFSv4使用TCP,所以以上两段不用考虑)

       现代NFS都默认采用TCP传输协议。在几乎所有可想到的网络环境下,TCP都表现良好,且提供了非常好的保证,防
       止因为网络不可靠而引起数据损坏。但使用TCP传输协议,基本上都会考虑设置相关防火墙。

       在正常环境下,网络丢包的频率比NFS服务丢包的频率要高的多。因此,没有必要为基于TCP的NFS设置极短的重传
       超时时间。一般基于TCP的NFS的超时时间设置在1分钟和10分钟之间。当客户端耗尽了重传次数(选项retrans的值),
       它将假定发生了网络分裂,并尝试以新的套接字重新连接服务端。由于TCP自身使得网络传输的数据是可靠的,所
       以,可以安全地使用处在默认值和客户端服务端同时支持的最大值之间的rszie和wsize,而不再依赖于网络MTU大小。

DATA AND METADATA COHERENCE
       现在有些集群文件系统为客户端之间提供了非常完美的缓存一致性功能,但对于NFS客户端来说,实现完美的缓
       存一致性是非常昂贵的,特别是大型局域网络环境。因此,NFS提供了稍微薄弱一点的缓存一致性功能,以满足
       大多数文件共享需求。

   Close-to-open cache consistency
       一般情况下,文件共享是完全序列化的。首先客户端A打开一个文件,写入一些数据,然后关闭文件然后客户端B
       打开同一个文件,并读取到这些修改后的数据。

       当应用程序打开一个存储在NFSv3服务端上的文件时,NFS客户端检查文件在服务端上是否存在,并通过是否发送
       GETATTR或ACCESS请求判断文件是否允许被打开。NFS客户端发送这些请求时,不会考虑已缓存文件属性是否是新
       鲜有效的。

       当应用程序关闭文件,NFS客户端立即将已做的修改写入到文件中,以便下一个打开者可以看到所做的改变。这
       也给了NFS客户端一个机会,使得它可以通过文件关闭时的返回状态码向应用程序报告错误。

       在打开文件时以及关闭文件刷入数据时的检查行为被称为close-to-open缓存一致性,或简称为CTO。可以通过使
       用nocto选项来禁用整个挂载点的CTO。

       (译者注:NFS关闭文件时,客户端会将所做的修改刷入到文件中,然后发送GETATTR请求以确保该文件的属性缓存
       已被更新。之后其他的打开者打开文件时会发送GETATTR请求,根据文件的属性缓存可以判断文件是否被打开并做
       了修改。这可以避免缓存无效)

   Weak cache consistency
       客户端的数据缓存仍有几乎包含过期数据。NFSv3协议引入了"weak cache consistency"(WCC),它提供了一种在单
       个文件被请求之前和之后有效地检查文件属性的方式。这有助于客户端识别出由其他客户端对此文件做出的改变。

       当某客户端使用了并发操作,使得同一文件在同一时间做出了多次更新(例如,后台异步写入),它仍将难以判断
       是该客户端的更新操作修改了此文件还是其他客户端的更新操作修改了文件。

   Attribute caching
       使用noac挂载选项可以让多客户端之间实现属性缓存一致性。几乎每个文件系统的操作都会检查文件的属性信息。
       客户端自身会保留属性缓存一段时间以减少网络和服务端的负载。当noac生效时,客户端的文件属性缓存就会被
       禁用,因此每个会检查文件属性的操作都被强制返回到服务端上来操作文件,这表示客户端以牺牲网络资源为代
       价来快速查看文件发生的变化。

       不要混淆noac选项和"no data caching"。noac挂载选项阻止客户端缓存文件的元数据,但仍然可能会缓存非元数
       据的其他数据。

       NFS协议设计的目的不是为了支持真正完美的集群文件系统缓存一致性。如果要达到客户端之间缓存数据的绝对
       一致,那么应该使用文件锁的方式。

   File timestamp maintainence
       NFS服务端负责管理文件和目录的时间戳(atime,ctime,mtime)。当服务端文件被访问或被更新,文件的时间戳也会
       像本地文件系统那样改变。

       NFS客户端缓存的文件属性中包括了时间戳属性。当NFS客户端检索NFS服务端文件属性时,客户端文件的时间戳会
       更新。因此,在NFS服务端的时间戳更新后显示在NFS客户端之前可能会有一些延迟。

       为了遵守POSIX文件系统标准,Linux NFS客户端需要依赖于NFS服务端来保持文件的mtime和ctime时间戳最新状态。
       实现方式是先让客户端将改变的数据刷入到服务端,然后再输出文件的mtime。

       然而,Linux客户端可以很轻松地处理atime的更新。NFS客户端可以通过缓存数据来保持良好的性能,但这意味着
       客户端应用程序读取文件(会更新atime)时,不会反映到服务端,但实际上服务端的atime已经修改了。

       由于文件属性缓存行为,Linux NFS客户端mount时不支持一般的atime相关的挂载选项。

       特别是mount时指定了atime/noatime,diratime/nodiratime,relatime/norelatime以及strictatime/nostrictatime
       挂载选项,实际上它们没有任何效果。

   Directory entry caching
       Linux NFS客户端缓存所有NFS LOOKUP请求的结果。如果所请求目录项在服务端上存在,则查询的结果称为正查询
       结果。如果请求的目录在服务端上不存在(服务端将返回ENOENT),则查询的结果称为负查询结果。

       为了探测目录项是否添加到NFS服务端或从其上移除了,Linux NFS客户端会监控目录的mtime。如果客户端监测到
       目录的mtime发生了改变,客户端将丢弃该目录相关的所有LOOKUP缓存结果。由于目录的mtime是一种缓存属性,因
       此服务端目录mtime发生改变后,客户端可能需要等一段时间才能监测到它的改变。

       缓存目录提高了不与其他客户端上的应用程序共享文件的应用程序的性能。但使用目录缓存可能会干扰在多个客户
       端上同时运行的应用程序,并且需要快速检测文件的创建或删除。lookupcache挂载选项允许对目录缓存行为进行一
       些调整。

       如果客户端禁用目录缓存,则每次LOOKUP操作都需要与服务端进行验证,那么该客户端可以立即探测到其他客户端
       创建或删除的目录。可以使用lookupcache=none来禁用目录缓存。如果禁用了目录缓存,由于需要额外的NFS请求,
       这会损失一些性能,但禁用目录缓存比使用noac损失的性能要少,且对NFS客户端缓存文件属性没有任何影响。

   The sync mount option
       NFS客户端对待sync挂载选项的方式和挂载其他文件系统不同。如果即不指定sync也不指定async,则默认为async。
       async表示异步写入,除了发生下面几种特殊情况,NFS客户端会延迟发送写操作到服务端:

              ● 内存压力迫使回收系统内存资源。
              ● 客户端应用程序显式使用了sync类的系统调用,如sync(2),msync(2)或fsync(3)。
              ● 关闭文件时。
              ● 文件被锁/解锁。

       换句话说,在正常环境下,应用程序写的数据不会立即保存到服务端。(当然,关闭文件时是立即同步的)

       如果在挂载点上指定sync选项,任何将数据写入挂载点上文件的系统调用都会先把数据刷到服务端上,然后系统调
       用才把控制权返回给用户空间。这提供了客户端之间更好的数据缓存一致性,但消耗了大量性能。

       在未使用sync挂载选项时,应用程序可以使用O_SYNC修饰符强制立即把单个文件的数据刷入到服务端。

   Using file locks with NFS
       网络锁管理器(Network Lock Manager,NLM)协议是一个独立的协议,用于管理NFSv2和NFSv3的文件锁。为了让客户端
       或服务端在重启后能恢复锁,需要使用另一个网络状态管理器(Network Status Manager,NSM)协议。在NFSv4中,NFS
       直协议自身接支持文件锁相关功能,所以NLM和NSM就不再使用了。

       在大多数情况下,NLM和NSM服务是自动启动的,并且不需要额外的任何配置。但需要配置NFS客户端使用的是fqdn名
       称,以保证NFS服务端可以找到客户端并通知它们服务端的重启动作。

       NLS仅支持advisory文件锁。要锁定NFS文件,可以使用待F_GETLK和F_SETLK的fcntl(2)命令。NFS客户端会转换通过
       flock(2)获取到的锁为advisory文件锁。

       当服务端不支持NLM协议,或者当NFS服务端是通过防火墙但阻塞了NLM服务端口时,则需要指定nolock挂载选项。
       当客户端挂载导出的/var目录时,必须使用nolock禁用NLM锁,因为/var目录中包含了NLM锁相关的信息。
       (注,因为NLM仅在nfsv2和nfsv3中支持,所以NFSv4不支持nolock选项)

       当仅有一个客户端时,使用nolock选项可以提高一定的性能。

   NFS version 4 caching features
       NFSv4上的数据和元数据缓存行为和之前的版本相似。但是NFSv4添加了两种特性来提升缓存行为:change attributes
       以及delegation。(注:nfsv4中取消了weak cache consistency)

       change attribute是一种新的被跟踪的文件/目录元数据信息。它替代了使用文件mtime和ctime作为客户端验证缓存内
       容的方式。但注意,change attributes和客户端/服务端文件的时间戳的改变无关。

       文件委托(file delegation)是NFSv4的客户端和NFSv4服务端之前的一种合约,它允许客户端临时处理文件,就像没有
       其他客户端正在访问该文件一样。当有其他客户端尝试访问被委托文件时,服务端一定会通知服务端(通过callback请
       求)。一旦文件被委托给某客户端,客户端可以尽可能大地缓存该文件的数据和元数据,而不需要联系服务端。

       文件委托有两种方式:read和write。读委托意味着当其他客户端尝试向委托文件写入数据时,服务端通知客户端。而
       写委托意味着其他客户端无论是尝试读还是写,服务端都会通知客户端。

       NFSv4上当文件被打开的时候,服务端会授权文件委托,并且当其他客户端想要访问该文件但和已授权的委托冲突时,
       服务端可以在任意时间点重调(recall)委托关系。不支持对目录的委托。
       (译者注:只有读委托和读委托不会冲突)

       为了支持委托回调(delegation callback),在客户端初始联系服务端时,服务端会检查网络并返回路径给客户端。如果
       和客户端的联系无法建立,服务端将不会授权任何委托给客户端。

 

归来体系小说大纲:

转发请注解出处:

注:若您感觉那篇小说还不易请点击下右下角的推荐,有了你的匡助才能鼓舞笔者更加大的行文热情,非凡感激!

NFS基本使用,第1章NFS应用 本文目录: 壹.一概述 一.二 RPC不可不知的原理 壹.二.1 RPC原理 一.二.2 奥迪Q7CP工具介绍 1.三 运维NFS
一.四 配置导出目录和挂载…

相关文章