11.1、NFS简介

 NFS是Network File System的缩写,中文名为网络文件系统,它是一种能使安装了不同操作系统的计算机之间通过网络进行共享的网络协议。由于NFS可以快速地进行文件共享,有效地提供资源的利用率,节省本地磁盘空间,方便集中管理,所以应用广泛。

  NFS采用C/S工作模式,NFS服务器设置好共享文件目录后,其他的NFS客户端就可以把这个由远端服务器共享出来的目录到本地系统上的某个自行定义的挂载点,并进行使用。

wKioL1k9OkOAhmf6AABfebd-M8o528.png-wh_50

  NFS支持的功能很多,而不同的功能由不同的程序来实现,每启动一个功能就需要打开一些端口进行数据传输。所以与其他大部分的C/S结构不同,NFS并不是监听一些固定端口,而是随机采用一些未被使用的小于1024的端口作为数据传输。但是客户端需要连接服务器时首先必须知道服务端程序提供服务的端口,而NFS端口的随机性为客户端连接带来了麻烦,为此NFS使用了远程过程调用RPC(Remote Procedure Call)来解决。

  当NFS启动时,它会随机地使用服务器上未被使用的小于1024的端口来为服务端口,然后会把端口号、进程ID和监听IP等信息在RPC服务中注册。这样一来,RPC服务就知道各个NFS功能对应的服务端口,当客户端通过固定端口111连接上RPC服务后,RPC就会把NFS各个功能所对应的端口号返回给客户端。至此,客户端就可以通过这些端口直接与NFS进行通信。

wKiom1k9PL2xq2kMAAUKVertY8E653.png-wh_50

11.2、NFS服务器安装与配置

  NFS服务器主要设计的软件有rpcbind和nfs-utils,它们分别是RPC和NFS主程序,关于这两个软件包,其作用分别为:

  rpcbind:监听端口111/tcp, 111/udp,最主要的功能就是在指定每个NFS功能所对应的端口号,并且汇报给客户端,让客户端可以连结到正确的端口上去。

  nfs-utils:NFS的主程序,监听端口2049/tcp, 2049/udp,包括提供NFS服务所需要的rpc.nfsd和rpc.mountd两个守护进程和其他相关配置文件。 

[root@localhost home]# yum install -y rpcbind nfs-utils   #yum安装软件包
[root@localhost home]# rpm -ql rpcbind      #查看文件的具体安装路径
/etc/rc.d/init.d/rpcbind                    #rpcbind自动启动脚本
/sbin/rpcbind                               #主程序
/usr/sbin/rpcinfo
/usr/share/doc/rpcbind-0.2.0                #文档
/usr/share/doc/rpcbind-0.2.0/AUTHORS
/usr/share/doc/rpcbind-0.2.0/ChangeLog
/usr/share/doc/rpcbind-0.2.0/README
/usr/share/man/man8/rpcbind.8.gz           #帮助文件
/usr/share/man/man8/rpcinfo.8.gz
/var/cache/rpcbind

#启动NFS服务时,先启动rpcbind,后启动nfs服务
[root@localhost home]# service rpcbind start   #启动rpcbind
Starting rpcbind: [  OK  ]
[root@localhost home]# service nfs start       #启动nfs
Starting NFS services:  [  OK  ]
Starting NFS mountd: [  OK  ]
Starting NFS daemon: [  OK  ]
Starting RPC idmapd: [  OK  ]

#关闭NFS服务时,先关闭nfs服务,后关闭rpcbind服务
[root@localhost home]# service nfs stop
Shutting down NFS daemon: [  OK  ]
Shutting down NFS mountd: [  OK  ]
Shutting down RPC idmapd: [  OK  ]
[root@localhost home]# service rpcbind stop
Stopping rpcbind: [  OK  ]

  NFS服务端的配置文件通过/etc/exports配置文件来实现,更改配置文件后需要通过exports命令使更改后的配置生效。

  • exports配置文件

  /etc/exports文件是NFS主要的配置文件,该文件用于设置服务器的共享目录,以及目录允许访问的主机、访问权限等信息。NFS安装后会在/etc目录下创建一个空白的exports文件,即没有任何的共享目录,用户需要进行手工编辑。文件每一行定义了一个共享目录,其格式为:

共享目录 [客户端1(选项1,选项2 ...)]   [客户端2(选项1,选项2 ...)] ...

  共享目录与各客户端之间以空格进行分隔,除了共享目录以外,其他内容可选。


  共享目录:提供NFS客户端使用的目录

  客户端:可以访问共享目录的计算机,可以通过IP地址和主机名进行指定,也可以使用子网掩码指定网段或者使用通配符'*'或'?'进行模糊指定。

  选项:指定该共享目录的访问权限,如果不指定,则NFS使用默认选项。

客户端示例:

客户端 说明
Demoserver 主机名为Demoserver的计算机
10.0.0.71 IP地址为10.0.0.71的计算机
192.168.2.0/24 子网192.168.2.0中的所有计算机
host?.example.com ?表示任意字符
*.example.com .example.com域中的所有计算机
* 所有计算机

客户端常用选项:

客户端选项 说明
ro 客户端只能以只读方式访问共享目录中的文件,不能写入
rw 对共享目录可读写
sync 将数据同步写入内存与硬盘中
async
异步IO方式,数据会先暂存在内存中,待需要时再写入硬盘
secure
限制NFS服务只能使用小于1024端口号进行数据传输
insecure
使用大于1024端口
wdelay
如果多个客户端要对同一目录进行读写,则将这些操作集中执行
no_wdelay
有写操作则立即写入,当设置了async选项时,该选项无效
hide
共享目录时,不共享目录中的子目录
no_hide
共享子目录
subtree_check
强制NFS检查共享目录父目录的权限
no_subtree_check
不检查父目录权限
all_squash
不管登录NFS的使用者是什么身份,都把他的UID和GID映射为匿名用户和用户组
no_all_squash 保留用户原来的UID和GID,不进行映射
anonuid 指定NFS服务器使用/etc/passwd文件中UID为该值的用户作为匿名用户,应该尽量保持客户端和服务器端用户UID的一致性
anongid 指定NFS服务器使用/etc/group文件中GID为该值的用户作为匿名用户组
root_squash 如果登录NFS服务器使用共享目录的使用者是root,则把这个使用者的权限映射为匿名用户
no_root_squash 如果登录NFS服务器使用共享目录的使用者是root,保留它的root权限,这可能会导致严重的安全问题
  • exportfs命令:输出共享目录

 NFS服务启动时,会读取/etc/exports配置文件的内容,把文件中设置的共享目录输出,供客户端使用。在NFS服务启动后,如果要对/etc/exports进行更改,需要通过exportfs对共享目录进行输出,其命令格式为:

/usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..]
/usr/sbin/exportfs -r [-v]
/usr/sbin/exportfs [-av] -u [client:/path ..]
/usr/sbin/exportfs [-v]
/usr/sbin/exportfs -f

常用选项:

-a:全部输出或取消输出所有的共享目录

-i:忽略/etc/exports配置文件,而使用默认或命令行中指定的选项

-o:指定输出的客户端选项

-r:重新读取/etc/exports中的配置,并同步/var/lib/nfs/xtab与/etc/exports的内容

-u:取消一个或多个共享目录的输出

-v:如果不跟其他选项一起使用,则显示当前共享的所有目录及他们的选项设置,如果输出或取消输出共享目录,则显示进行了那些操作

11.3、NFS客户端配置

  要在NFS客户端上使用服务器的共享目录,需要在本地主机上启动rpcbind服务,然后使用showmount命令查看NFS服务器共享的目录有哪些,使用mkdir命令在本地建立共享目录的挂载点,最后使用mount命令挂载共享目录到本地。

  showmount命令格式为:

showmount  [选项]  [主机IP或名称]

常用选项:

-a:一般在NFS服务器上使用,用于显示已经挂载服务器共享目录的客户端及他们使用的共享目录

-d:与-a类似,但只显示目录,不显示具体客户端

-e:显示指定NFS服务器输出的共享目录列表

-h:显示帮助信息

-v:显示版本信息

--no-headers:不输出标题信息

  挂载点可以由用户自行指定,创建挂载点后,就可以挂载共享目录,挂载共享目录使用的命令与挂载本地文件系统的命令一样,使用mount命令,其格式为:

mount  [选项]  NFS服务器IP或主机名:共享目录  挂载点

常用选项:

选项 说明
-t nfs 指定要挂载的文件系统类型为NFS
-o ro 只读挂载的文件系统为只读
-o rw 可读写
-o rsize=n 指定NFS服务器上读文件时NFS使用的块大小,单位字节
-o wsize=n 指定NFS服务器上写文件时NFS使用的块大小,单位字节
-o timeo=n 指定超时后重新发送请求的延时时间,单位十分之一秒
-o retrans=n 指定放弃挂载前尝试的次数
-o acregmin=n 指定文件在缓冲中存放的最小时间,单位秒
-o acregmax=n 指定文件在缓冲中存放的最大时间,单位秒
-o acdirmin=n 指定目录在缓冲中存放的最小时间,单位秒
-o acdirmax=n 指定目录在缓冲中存放的最大时间,单位秒
-o actime=n 该选项值代替acregmin,acregmax,acdirmin,acdirmax,把这四个值设为一样
-o retry=n 指定放弃挂载前尝试的时间,单位分钟
-o port=n 指定连接NFS服务器使用的端口号
-o proto=n 指定挂载NFS文件系统时使用的网络协议
-o fg 使用前台方式完成挂载工作
-o bg 使用后台方式完成挂载工作
-o hard 如果超时,则在控制台显示server not responding的错误信息并重复尝试连接,直到恢复为止
-o soft 如果连接超时,则返回I/O错误给请求的程序
-o intr 如果NFS文件操作超时,而使用了hard方式挂载,允许中断文件操作
-o noac 禁止缓存,强制进行同步写
-o fsc 启动本地磁盘缓存

11.4、使用autofs按需挂载共享目录

  传统NFS共享目录使用方式中,客户端要挂载共享目录一般是通过手工执行mount命令或在fstab文件中配置开机自动挂在这两种方式完成。但是,NFS客户端与服务器之间不是永久连接,而NFS一个缺点是当客户端和服务器连接后,任何一方离线都可能导致另一方不断等待超时。同时,可能很多用户挂载了共享目录,但实际没有使用,导致NFS服务器资源的消耗,为了解决这些问题,一般做法是使用autofs服务,仅在访问时动态挂载共享目录。

  autofs是一个按需挂载文件系统的程序,可以直接使用yum安装。

[root@localhost ~]# yum install -y autofs
[root@localhost ~]# service autofs start
Loading autofs4: [  OK  ]
Starting automount: [  OK  ]

  /etc/auto.master是autofs的主配置文件,配置格式为:

挂载点顶层目录  映射文件

  挂载点顶层目录: 例如要把共享目录挂在到/nfs/public目录下,那么这里的值就设置为/nfs, 而/nfs/public不需要手工创建

  映射文件:该文件是由用户自行指定并创建,在该文件中设置的NFS系统应该如何挂载

映射文件格式:

挂载点  [-挂载选项]  NFS服务器名或IP:共享目录

  其中,挂载点是基于auto.master文件中所设置的'挂载点顶层目录'的相对路径。配置文件更改后需要重启autofs服务式配置生效,也可以使用reload重载。

配置实例

  假设NFS服务器nfsserver所输出的共享目录有4个,/tmp,/sharefiles/public, /sharefiles/private,/media/cdrom,exports文件具体内容为:

[root@localhost ~]# cat /etc/exports 
/tmp                     192.168.191.*(rw,no_root_squash)
/sharefiles/public       192.168.191.*(rw,all_squash,anonuid=40,anongid=40)
/sharefiles/private      192.168.191.*(rw)
/media/cdrom             192.168.191.*(ro)

要通过autofs服务把这些目录都挂载到本地

/nfs/tmp
/nfs/public
/nfs/private
/nfs/cdrom

创建挂载点顶层目录

[root@localhost ~]# mkdir /nfs

编辑/etc/automaster文件,添加如下内容:

/nfs    /etc/auto.nfs

编辑/etc/auto.nfs映射文件:

[root@localhost ~]# cat /etc/auto.nfs 
tmp        -  192.168.191.128:/tmp
public     -  192.168.191.128:/sharefiles/public
private    -  192.168.191.128:/sharefiles/private
cdrom      -  192.168.191.128:/media/cdrom

重启autofs服务:

[root@localhost nfs]# service autofs reload
Reloading maps
[root@localhost home]# cd /nfs/           #进入nfs目录,目录为空
[root@localhost nfs]# ls            
[root@localhost nfs]# ls /nfs/cdrom       #访问各挂载的目录
cdrom.txt
[root@localhost nfs]# ls /nfs/private
private
[root@localhost nfs]# ls /nfs/public
public
[root@localhost nfs]# ls /nfs/tmp
yum.log
[root@localhost nfs]# ls                  #当访问时,挂载的目录才出现
cdrom  private  public  tmp