NFS 服务

网络文件系统,英文Network File System(NFS)。是由SUN公司研制的UNIX表示层协议(pressentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。
它基于开放网络运算远程过程调用(ONC RPC)协议:一个开放、标准的RFC协议,任何人或组织都可以依据标准实现它。

Port TCP UDP Description IANA status
2049 Yes, and SCTP Yes [Network File System] (NFS) Official

RPC

远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。

Port TCP UDP IANA status Description
111 Yes Yes Official [Open Network Computing Remote Procedure Call] (ONC RPC, sometimes referred to as Sun RPC)
NFSv4

受Andrew File System(AFS)和Server Message Block(SMB,也称为CIFS)的影响,第4版(2000年12月的RFC 3010; 2003年4月的RFC 3530和2015年3月的RFC 7530进行了修订)包括性能改进,要求强大的安全性,并引入有状态协议。在Sun Microsystems移交NFS协议的开发之后,第4版成为由Internet工程任务组(IETF)开发的第一个版本。

与以前的版本相比,NFSv4的一大优势是仅使用一个IP端口2049来运行该服务,从而简化了跨防火墙使用协议的过程。也就意为着,NFSv4可以不再需要rpcbind(portmap)

红帽7关于nfs的说明"8.6.7. Configuring an NFSv4-only Server",明确可以不启用rpcbind
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/nfs-serverconfig#nfs4-only
By default, the NFS server supports NFSv2, NFSv3, and NFSv4 connections in Red Hat Enterprise Linux 7. However, you can also configure NFS to support only NFS version 4.0 and later. This minimizes the number of open ports and running services on the system, because NFSv4 does not require the rpcbind service to listen on the network.

红帽8关于nfs的说明"3.14. Configuring an NFSv4-only server",也明确可以不启用rpcbind
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/exporting-nfs-shares_deploying-different-types-of-servers

nfs1.png

先说NFSv4以下的版本
由于NFSv2或NFSv3,使用了多个守护进程(lockd, rpc.statd, rpc.mountd, ...)提供不同的功能,每个进程都要监听一个端口,且端口不是固定的,这样就要一个服务来提供知名端口(111)来响应Client的访问,并返回给客户端要访问服务的当前端口,这个服务就是rpcbind


  • 安装

    # yum install rpcbind nfs-utils
    • rpcbind
      Rpcbind实用程序是将RPC程序号转换为通用地址的服务器。
      接受来自本地RPC服务的端口预约注册。然后使这些端口可用(或通告),以便相应的远程RPC服务可以访问它们。 Rpcbind服务响应对RPC服务的请求,并建立与请求的RPC服务的连接。
      一般安装完成后会,自动自动运行,并加入开机启动中
    • nfs-utils
      NFS utils 是支持NFS服务的客户端和服务程序

  • nfs服务器

    • a) 共享配置(有两种方法可以在NFS服务器上配置exports)
        1. /etc/exports
          export host1(options1) host2(options2) host3(options3)
        1. /usr/sbin/exportfs
          exportfs命令允许root用户有选择地导出或取消导出目录,而无需重新启动NFS服务。提供适当的选项后,/usr/sbin/exportfs命令会将导出的文件系统写入/var/lib/nfs/xtab。由于rpc.mountd在确定对文件系统的访问特权时会引用xtab文件,因此对导出文件系统列表的更改将立即生效
    • b) 相关
        1. 分享资源的登录记录:/var/lib/nfs/*tab
          在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。
        1. 客户端查询服务器分享资源的指令:/usr/sbin/showmount
          这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔!

exports文件 options 参数

参数 功能说明
rw 可读写的权限
ro 只读的权限
sync(同步) 资料同步写入到内存与硬盘中(慢,不容易丢数据)
async(异步) 资料会暂存于内存当中,而不是写入硬盘(快,容易丢数据)
no_root_squash 客户端用root用户访问该共享文件夹时, root用户不会映射成匿名用户(极不安全,不建议使用)
root_squash 客户端用root用户访问该共享文件夹是,将root用户映射为匿名用户
all_squash 不论登入NFS的使用者身份是谁,他的身份都会被压缩成匿名用户(nfsnobody)
anonuid=xxx 指定NFS服务器的匿名用户UID
anongid=xxx 指定NFS服务器的匿名用户GID
insecure NFS通过1024以上的端口发送
secure NFS通过1024以下的安全TCP/IP端口发送
hide 在NFS共享目录中共享其子目录
no_hide 在NFS共享目录中共享其子目录
wdelay 如果多个用户写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户写入NFS目录,则立即写入,当使用async时,无需此设置
subtree_check 在共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限

exports文件 host 参数

类型 说明 示例
single host 单个主机 ftp.abc.com
192.168.2.10
ipv6地址:::1
IP networks 一个网段 192.168.2.0/255.255.255.0
192.168.2.0/24
wildcards 机器名称可以包含通配符*和?
也可以在[方括号]中包含字符类列表。
*.abc.com
netgroups NIS网络组可以以@group的形式给出。
在检查成员资格时,
仅考虑组成员的主机部分。
anonymous 使用一个*字符(不要与上面的通配符混淆)
将匹配任意客户端
*

/etc/exports的配置

# vim /etc/exports
"root 保有 root 的权限"
/tmp          *(rw,no_root_squash) 
"同一目录针对不同范围开放不同权限, 通配符仅能用在主机名的分辨上面,IP 或网段就只能用 192.168.100.0/24 的状况,
 不可以使用 192.168.100.* 喔!"
/home/public  192.168.100.0/24(rw) *(ro) 
"仅给某个单一主机使用的目录设定, 只有这部机器才能对 /home/test 这个目录进行存取喔!"
/home/test    192.168.100.10(rw)192.168.100.10 
 "开放匿名登录的情况, 特别注意到那个 all_squash 与 anonuid, anongid 的功能!如此一来,
当 ftp.abc.com 登入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,
就会变成 /etc/passwd 里面对应的 UID 为 45 的那个身份的使用者了!"
/home/linux   *.abc.com(rw,all_squash,anonuid=45,anongid=45)

启动服务

先决条件
对于支持NFSv2或NFSv3连接的服务器,必须正在运行rpcbind [1]服务。要验证rpcbind是否处于活动状态,请使用以下命令:


[root@localhost ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-10-16 22:34:53 CST; 59min ago
  Process: 9399 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 9400 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─9400 /sbin/rpcbind -w

Oct 16 22:34:53 localhost.localdomain systemd[1]: Starting RPC bind service...
Oct 16 22:34:53 localhost.localdomain systemd[1]: Started RPC bind service.

运行中,下面来看一下rpcbind的运行情况

[root@localhost ~]# rpcinfo 
   program version netid     address                service    owner
    100000    4    tcp6      ::.0.111               portmapper superuser
    100000    3    tcp6      ::.0.111               portmapper superuser
    100000    4    udp6      ::.0.111               portmapper superuser
    100000    3    udp6      ::.0.111               portmapper superuser
    100000    4    tcp       0.0.0.0.0.111          portmapper superuser
    100000    3    tcp       0.0.0.0.0.111          portmapper superuser
    100000    2    tcp       0.0.0.0.0.111          portmapper superuser
    100000    4    udp       0.0.0.0.0.111          portmapper superuser
    100000    3    udp       0.0.0.0.0.111          portmapper superuser
    100000    2    udp       0.0.0.0.0.111          portmapper superuser
    100000    4    local     /var/run/rpcbind.sock  portmapper superuser
    100000    3    local     /var/run/rpcbind.sock  portmapper superuser
[root@localhost ~]# ss -tunlp |grep rpcbind
udp    UNCONN     0      0         *:946                   *:*                   users:(("rpcbind",pid=9675,fd=10))
udp    UNCONN     0      0         *:111                   *:*                   users:(("rpcbind",pid=9675,fd=5),("systemd",pid=1,fd=30))
udp    UNCONN     0      0        :::946                  :::*                   users:(("rpcbind",pid=9675,fd=11))
udp    UNCONN     0      0        :::111                  :::*                   users:(("rpcbind",pid=9675,fd=7),("systemd",pid=1,fd=33))
tcp    LISTEN     0      128       *:111                   *:*                   users:(("rpcbind",pid=9675,fd=4),("systemd",pid=1,fd=29))
tcp    LISTEN     0      128      :::111                  :::*                   users:(("rpcbind",pid=9675,fd=6),("systemd",pid=1,fd=32))
[root@localhost ~]#

这里可以看到它监听了111/TCP, 111/UDP
下面来启动nfs

[root@localhost ~]# systemctl start nfs.service 
[root@localhost ~]# netstat -tunlp |grep -E "rpc|2049"
tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      9707/rpc.mountd     
tcp        0      0 0.0.0.0:42111           0.0.0.0:*               LISTEN      9571/rpc.statd      
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::54383                :::*                    LISTEN      9571/rpc.statd      
tcp6       0      0 :::20048                :::*                    LISTEN      9707/rpc.mountd     
tcp6       0      0 :::2049                 :::*                    LISTEN      -                   
udp        0      0 0.0.0.0:946             0.0.0.0:*                           9675/rpcbind        
udp        0      0 0.0.0.0:53756           0.0.0.0:*                           9571/rpc.statd      
udp        0      0 0.0.0.0:2049            0.0.0.0:*                           -                   
udp        0      0 0.0.0.0:20048           0.0.0.0:*                           9707/rpc.mountd     
udp        0      0 127.0.0.1:843           0.0.0.0:*                           9571/rpc.statd      
udp6       0      0 :::946                  :::*                                9675/rpcbind        
udp6       0      0 :::2049                 :::*                                -                   
udp6       0      0 :::20048                :::*                                9707/rpc.mountd     
udp6       0      0 :::36187                :::*                                9571/rpc.statd      
[root@localhost ~]# rpcinfo -s localhost
   program version(s) netid(s)                         service     owner
    100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser
    100005  3,2,1     tcp6,udp6,tcp,udp                mountd      superuser
    100003  4,3       udp6,tcp6,udp,tcp                nfs         superuser
    100227  3         udp6,tcp6,udp,tcp                nfs_acl     superuser
    100021  4,3,1     tcp6,udp6,tcp,udp                nlockmgr    superuser
" 使用-s 以简洁的格式显示,信息太长了,本机查看localhost可省
  另外,这里可以看出nfs支持的版本信息"

查看NFS的共享情况

showmount [-ae] [hostname|IP]
选项与参数:
-a :显示目前主机与客户端的 NFS 联机分享的状态;
-e :显示某部主机的 /etc/exports 所分享的目录数据。

还可以查看 /var/lib/nfs/etab文件,查看exports的详细共享参数

[root@localhost ~]# cat /etc/exports
/data/pub   *(ro)
[root@localhost ~]# systemctl start nfs.service 
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/data/pub *
[root@localhost ~]# cat /var/lib/nfs/etab 
/data/pub   *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,no_all_squash)
# 上面是同一行,可以看出除了 rw, sync, root_squash 等等,
# 其实还有 anonuid 及 anongid 等等的设定!

共享控制

exportfs [-aruv]
选项与参数:
-a :全部挂载(或卸除) /etc/exports 档案内的设定
-r :重新挂载 /etc/exports 里面的设定,
       此外,亦同步更新 /etc/exports及 /var/lib/nfs/xtab 的内容!
-u :卸除某一目录
-v :在 export 的时候,将分享的目录显示到屏幕上!

[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/data/pub   *(ro)
/data/mydata    192.168.1.10(rw,no_root_squash)
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/data/pub *
[root@localhost ~]# exportfs -arv
exporting 192.168.1.10:/data/mydata
exporting *:/data/pub
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/data/pub    *
/data/mydata 192.168.1.10
[root@localhost ~]# cat /var/lib/nfs/etab 
/data/mydata    192.168.1.10(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)
/data/pub   *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,no_all_squash)
[root@localhost ~]# 

======================================

NFSv4

之前说,在V4版本中可以不使用rpcbind(portmap),测试

1. 关闭rpcbind服务

[root@localhost ~]# systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket

[root@localhost ~]# systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
Created symlink from /etc/systemd/system/rpc-statd.service to /dev/null.
Created symlink from /etc/systemd/system/rpcbind.service to /dev/null.
Created symlink from /etc/systemd/system/rpcbind.socket to /dev/null.

2. 编辑配置文件

 2.1 方法一

  [root@localhost ~]# vim /etc/sysconfig/nfs

RPCNFSDARGS="-N 2 -N 3"
[root@localhost ~]# vim /etc/sysconfig/nfs 
[root@localhost ~]# systemctl restart nfs-server
[root@localhost ~]# netstat -tul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:mountd          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:mountd             [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN     
tcp6       0      0 [::]:nfs                [::]:*                  LISTEN     
udp        0      0 0.0.0.0:nfs             0.0.0.0:*                          
udp        0      0 0.0.0.0:mountd          0.0.0.0:*                          
udp        0      0 0.0.0.0:mountd          0.0.0.0:*                          
udp        0      0 0.0.0.0:mountd          0.0.0.0:*                          
udp6       0      0 [::]:nfs                [::]:*                             
udp6       0      0 [::]:tftp               [::]:*                             
udp6       0      0 [::]:mountd             [::]:*                             
udp6       0      0 [::]:mountd             [::]:*                             
udp6       0      0 [::]:mountd             [::]:* 
  2.2 方法二

   [root@localhost ~]# vim /etc/nfs.conf

[nfsd]

vers2=no
vers3=no
[root@localhost ~]# vim /etc/nfs.conf 
[root@localhost ~]# systemctl restart nfs-server
[root@localhost ~]# netstat -tul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN     
tcp6       0      0 [::]:nfs                [::]:*                  LISTEN     
udp        0      0 0.0.0.0:nfs             0.0.0.0:*                          
udp6       0      0 [::]:nfs                [::]:*                             
udp6       0      0 [::]:tftp               [::]:* 

建议使用方法二,这种会少启动一个mountd的进程

3. 重启服务

# systemctl restart nfs-server

特别注意:使用NFSv4 only的服务后,不能再使用“showmount”命令,替代命令还没有找到

=====================================

客户端

手动挂载 NFS 服务器分享的资源
你要如何挂载 NFS 服务器所提供的文件系统呢?基本上,可以这样做:
(NFSv2 v3)

  1. 确认本地端已经启动了 rpcbind 服务,nfs-utils(这个工具包包含了客户端和服务端)。
  2. 查看 NFS 服务器分享的目录有哪些,并了解我们是否可以使用 showmount
  3. 在本地端建立挂载点目录 (mkdir);
  4. 利用 mount 将远程主机直接挂载到相关目录。

(NFSv4)

  1. 安装nfs-utils
  2. 在本地建立挂载点(mkdir)
  3. 利用mount挂载

mount -t nfs 192.168.1.254:/ /mnt/pub

[root@localhost ~]# cd /mnt/pub/data/ 
mydata/ pub/            <---    "直接将服务器上的授权可挂载的目录都挂载上来了"
[root@localhost ~]# cat /proc/fs/nfsfs/
servers  volumes
[root@localhost ~]# cat /proc/fs/nfsfs/servers 
NV SERVER   PORT USE HOSTNAME
v4 c0a8020a  801   2 192.168.1.254
[root@localhost ~]# mount |tail -1
192.168.1.254:/ on /mnt/pub type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.10,local_lock=none,addr=192.168.1.254)

这里可看到使用的是V4版本,而且可以直接挂载server:/根,Centos 7 中默认使用的是V4版本要使用V2、V3
mount -t nfs -o vers=3 192.168.2.10:/data/pub /mnt/pub
前提是:rpcbind服务开启,才能使用V3

[root@localhost ~]# cat /proc/fs/nfsfs/servers 
NV SERVER   PORT USE HOSTNAME
v3 c0a8020a  801   1 192.168.1.254
[root@localhost ~]# mount |tail -1
192.168.1.254:/data/pub on /mnt/pub type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.254,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=192.168.1.254)

==================================

自动挂载 autofs 的使用

这个鸟哥 写得很好,引用

在一般 NFS 文件系统的使用情况中,如果客户端要使用服务器端所提供的 NFS 文件系统时,要嘛就是得在 /etc/rc.d/rc.local 当中设定开机时挂载,要嘛就得要登入系统后手动利用 mount 来挂载。 此外,客户端得要预先手动的建立好挂载点目录,然后挂载上来。但是这样的使用情况恐怕有点小问题。


NFS 文件系统与网络联机的困扰:
我们知道 NFS 服务器与客户端的联机或许不会永远存在,而 RPC 这个服务又挺讨厌的,如果挂载了 NFS 服务器后,任何一方脱机都可能造成另外一方老是在等待逾时~而且,挂载的 NFS 文件系统可能又不是常常被使用,但若不挂载的话,有时候紧急要使用时又得通知系统管理员, 这又很不方便...啊!好讨厌的感觉啊~@_@

所以,让我们换个思考的角度来讨论一下使用 NFS 的情境:

  • 可不可以让客户端在有使用到 NFS 文件系统的需求时才让系统自动挂载?
  • 当 NFS 文件系统使用完毕后,可不可以让 NFS 自动卸除,以避免可能的 RPC 错误?

如果能达到上述的功能,那就太完美啦!有没有这东西呢?有的,在现在的 Linux 环境下这是可以达成的理想!用的就是 autofs 这个服务啦!


autofs 的设定概念:

autofs 这个服务在客户端计算机上面,会持续的侦测某个指定的目录, 并预先设定当使用到该目录下的某个次目录时,将会取得来自服务器端的 NFS 文件系统资源,并进行自动挂载的动作。 讲这样或许你有点模糊,让我们拿底下这个图示来看看:


autofs.gif

如上图所示,我们的 autofs 主要配置文件为 /etc/auto.master,这个档案的内容很简单, 如上所示,我只要定义出最上层目录 (/home/nfsfile) 即可,这个目录就是 autofs 会一直持续侦测的目录啦。 至于后续的档案则是该目录底下各次目录的对应。在 /etc/auto.nfs (这个档案的档名可自定义) 里面则可以定义出每个次目录所欲挂载的远程服务器的 NFS 目录资源!

举例来说:『当我们在客户端要使用 /home/nfsfile/public 的数据时,此时 autofs 才会去 192.168.100.254 服务器上挂载 /home/public !』且『当隔了 5 分钟没有使用该目录下的数据后,则客户端系统将会主动的卸除 /home/nfsfile/public 』。

很不错用的一个工具吧!因为有用到服务器的数据时才自动挂载,没有使用了就会自动卸除! 而不是传统的情况一直是挂载的!既然这么好用,那就让我们实际来操演一下:


  • 建立主配置文件 /etc/auto.master ,并指定侦测的特定目录
    这个主要配置文件的内容很简单,只要有要被持续侦测的目录及『数据对应文件』即可。 那个数据对应文件的文件名是可以自行设定的,在鸟哥这个例子当中我使用 /etc/auto.nfs 来命名。
[root@clientlinux ~]# vim /etc/auto.master
/home/nfsfile  /etc/auto.nfs

上述数据中比较需要注意的是,那个 /home/nfsfile 目录不需要存在,因为 autofs 会主动的建立该目录! 如果你建立了,可能反而会出问题~因此,先确定一下没有该目录吧!


  • 建立数据对应文件内 (/etc/auto.nfs) 的挂载信息与服务器对应资源
    刚刚我们所指定的 /etc/auto.nfs 是自行设定的,所以这个档案是不存在的。那么这个档案的格式是如何呢?你可以这样看:
[本地端次目录]  [-挂载参数]  [服务器所提供的目录]
选项与参数:
[本地端次目录] :指的就是在 /etc/auto.master 内指定的目录之次目录
[-挂载参数]    :就是前一小节提到的 rw,bg,soft 等等的参数啦!可有可无;
[服务器所提供的目录] :例如 192.168.100.254:/home/public 等

[root@clientlinux ~]# vim /etc/auto.nfs
public   -rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/home/public
testing  -rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/home/test
temp     -rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/tmp
# 参数部分,只要最前面加个 - 符号即可!
参数 参数功能 预设参数
fg
bg
当执行挂载时,该挂载的行为会在前景 (fg) 还是在背景 (bg) 执行? 若在前景执行时,则 mount 会持续尝试挂载,直到成功或 time out 为止,若为背景执行, 则 mount 会在背景持续多次进行 mount ,而不会影响到前景的程序操作。 如果你的网络联机有点不稳定,或是服务器常常需要开关机,那建议使用 bg 比较妥当。 fg
soft
hard
如果是 hard 的情况,则当两者之间有任何一部主机脱机,则 RPC 会持续的呼叫,直到对方恢复联机为止。如果是 soft 的话,那 RPC 会在 time out 后『重复』呼叫,而非『持续』呼叫, 因此系统的延迟会比较不这么明显。同上,如果你的服务器可能开开关关,建议用 soft 喔! hard
intr 当你使用上头提到的 hard 方式挂载时,若加上 intr 这个参数, 则当 RPC 持续呼叫中,该次的呼叫是可以被中断的 (interrupted)。 没有
rsize
wsize
读出(rsize)与写入(wsize)的区块大小 (block size)。 这个设定值可以影响客户端与服务器端传输数据的缓冲记忆容量。一般来说, 如果在局域网络内 (LAN) ,并且客户端与服务器端都具有足够的内存,那这个值可以设定大一点, 比如说 32768 (bytes) 等,提升缓冲记忆区块将可提升 NFS 文件系统的传输能力! 但要注意设定的值也不要太大,最好是达到网络能够传输的最大值为限。 rsize=1024
wsize=1024

这样就可以建立对应了!要注意的是,那些 /home/nfsfile/public 是不需要事先建立的! 咱们的 autofs 会事情况来处理喔!好了,接下来让我们看看如何实际运作吧!


  • 实际运作与观察
    配置文件设定妥当后,当然就是要启动 autofs 啦!
[root@clientlinux ~]# /etc/init.d/autofs stop
[root@clientlinux ~]# /etc/init.d/autofs start
# 很奇怪!非常怪!CentOS 6.x 的 autofs 使用 restart 会失效!所以鸟哥才进行两次

假设你目前并没有挂载任何来自 192.168.100.254 这部 NFS 服务器的资源目录。好了, 那让我们实际来观察看看几个重要的数据吧!先看看 /home/nfsfile 会不会主动的被建立? 然后,如果我要进入 /home/nfsfile/public 时,文件系统会如何变化呢?

[root@clientlinux ~]# ll -d /home/nfsfile
drwxr-xr-x. 2 root root 0 2011-07-28 00:07 /home/nfsfile
# 仔细看,妳会发现 /home/nfsfile 容量是 0 喔!那是正常的!因为是 autofs 建立的

[root@clientlinux ~]# cd /home/nfsfile/public
[root@clientlinux public]# mount | grep nfsfile
192.168.100.254:/home/public on /home/nfsfile/public type nfs (rw,soft,rsize=32768,
wsize=32768,sloppy,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10)
# 上面的输出是同一行!瞧!突然出现这个玩意儿!因为是自动挂载的嘛!

[root@clientlinux public]# df  /home/nfsfile/public
文件系统               1K-区段      已用     可用 已用% 挂载点
192.168.100.254:/home/public
                       7104640    143104   6607040   3% /home/nfsfile/public
# 档案的挂载也出现没错!

呵呵!真是好啊!如此一来,如果真的有需要用到该目录时,系统才会去相对的服务器上面挂载! 若是一阵子没有使用,那么该目录就会被卸除呢!这样就减少了很多不必要的使用时机啦!还不错用吧! _


你可能感兴趣的:(NFS 服务)