Linux 文件服务器: NFS 服务器


Linux 文件服务器: NFS 服务器
---------------------------------------------------------------------------------------------------------------------------------------------


1. NFS 功能
---------------------------------------------------------------------------------------------------------------------------------------------
NFS 是一个通过网络分享文件系统的服务,它最大的问题在于“权限” 方面的概念,因为客户端和服务器端可能必须具备相同的帐号才能够存取某些目录或文件。
另外, NFS 的启动需要通过远程过程调用 (RPC)。


    1.1 NFS (Network FileSystem) 网络文件系统
    -----------------------------------------------------------------------------------------------------------------------------------------
    NFS (Network FileSystem) 最初由 Sun 公司开发。它的最大功能是可以通过网络,让不同的主机,不同的操作系统,可以共享文件 (share files)。因此,
    可以将它看作是一个文件服务器(file server)。客户端将远程的 NFS 服务器共享的目录,挂载到本地机器上,在本地机器看来,挂载的远程主机目录就好像
    是本机的一个磁盘分区,使用非常便利。
    
    NFS 服务端口基本上是 2049,但文件系统非常复杂, NFS 还有其他程序启动其他端口,这些端口是由系统随机选择的小于 1024 的端口。这些服务端口通过
    (Remote Procedure Call, RPC) 服务查询获得。


    1.2 RPC (Remote Procedure Call) 远程过程调用
    -----------------------------------------------------------------------------------------------------------------------------------------
    NFS 支持的功能非常多,而不同的功能会使用不同的程序提供服务,每启动一个功能会启动一些端口来传输数据,因此, NFS 的功能对应的端口是不固定的,
    而是随机选择一些未被使用的小于 1024 的端口启动服务。因此造成客户端连接服务器时的困扰,无法直接确定服务器监听的端口。
    
    此时就需要通过远程过程调用 RPC 服务。 RPC 最主要的功能就是确定每个 NFS 功能对应的端口,并回报给客户端,让客户端可以连接到正确的端口上。RPC
    是如何确定每个 NFS 服务的端口呢,这是由于服务器在启动 NFS 时会随机选取一定数量的端口,并主动向 RPC 注册,因此 RPC 可以确定每个端口对应的
    NFS 功能。 而 RPC 服务是固定在 port 111 端口上监听客户端的请求,并向客户端返回正确的服务端口。

    
        提示:
        -------------------------------------------------------------------------------------------------------------------------------------
        在启动 NFS 服务之前,要先启动 RPC 服务,否则 NFS 会无法向 RPC 注册。另外,若 RPC 重新启动,原本注册的数据也会丢失,因此,它所管理的
        所有服务都需要重新启动进行重新注册。
    
    NFS 必须要有 RPC 服务存在时才能成功提供服务,因此称 NFS 为 RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的,例如:NIS (Network
    Information Service) 也是 RPC 服务的一种。
    
    不论是服务器端还是客户端,要使用 NFS, 两者都需要启动 RPC 服务。
    
    
    
    1.3 NFS 启动的 RPC daemons
    -----------------------------------------------------------------------------------------------------------------------------------------
    NFS 服务器主要的任务是进行文件系统的共享,文件系统的共享则与权限有关。因此, NFS 服务器的启动至少需要两个 daemons, 一个管理客户端是否能够
    登录,一个管理客户端能够取得的权限。如果还要管理 quota , 则 NFS 还要启动其他的 RPC 服务。对于简单的 NFS 服务器来说,需要启动如下基本服务:
    
        
        ■ rpc.nfsd
        -------------------------------------------------------------------------------------------------------------------------------------
        最主要的 NFS 服务器服务提供者。这个 daemon 主要的功能就是管理客户端是否能够使用服务器文件系统挂载信息,其中包括登录者的 ID 验证。


        ■ rpc.mountd
        -------------------------------------------------------------------------------------------------------------------------------------
        这个 daemon 主要的功能是管理 NFS 的文件系统。当客户端顺利的通过 rpc.nfsd 而登录服务器之后,在他可以使用 NFS 服务器提供的文件之前,还会
        经过文件权限的认证程序。它会读 NFS 的配置文件 /etc/exports 来比对客户端的权限,当通过之后客户端就可以取得使用 NFS 文件的权限了。
                

        ■ rpc.lockd (非必要)
        -------------------------------------------------------------------------------------------------------------------------------------
        用于管理文件锁 (lock). 当多个客户端同时尝试写入某个文件时,可能会对该文件造成一些问题。 rpc.lockd 服务可以用来克服这个问题。但
        rpc.lockd 必须要同时在客户端与服务器端都开启才行。
        
        rpc.lockd 也常与 rpc.statd 同时启用。


        ■ rpc.statd (非必要)
        -------------------------------------------------------------------------------------------------------------------------------------
        可以用来检查档案的一致性,与 rpc.lockd 有关。若发生因为客户端同时使用同一文件造成文件可能损毁时, rpc.statd 可以用来检测并尝试恢复该
        文件。与 rpc.lockd 同样的,这个功能必须要在服务器端与客户端都启动才会生效。
        
        
    1.4 NFS 文件访问权限
    -----------------------------------------------------------------------------------------------------------------------------------------        
    NFS 服务本身并没有进行用户身份登录识别,当客户端用户要存取服务器端的文件系统时,服务器会以客户端的用户 UID 和 GID 等身份信息尝试读写客户端
    的文件系统。当客户端用户与服务器端的用户的 UID 及帐号对应不一致时,可能造成文件系统使用上的困扰。
    
    要实际在客户端以 NFS 存取服务器端的文件系统时,还需要具有:
    
        
        ● NFS 服务器有开放可写入的权限 (与 /etc/exports 设定有关);
        ● 实际的文件权限具有可写入 (w) 的权限。

    当满足了 (1)使用者账号,亦即 UID 的相关身份; (2)NFS 服务器允许有写入的权限; (3)文件系统确实具有 w 的权限时,你才具有该文件的可写入权限。
    尤其是身份 (UID) 确认的环节,最容易搞错,也因为如此,所以 NFS 通常需要与 NIS 这个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份
    错乱。


*
*
*
    
2. NFS Server 设置
---------------------------------------------------------------------------------------------------------------------------------------------


    2.1 软件安装
    -----------------------------------------------------------------------------------------------------------------------------------------

        ● RPC 主程序:rpcbind
        -------------------------------------------------------------------------------------------------------------------------------------
        NFS 是一个 RPC 服务,而要启动任何一个 RPC 服务之前,都需要做好 port 的映射(mapping),这个工作是由 rpcbind 服务负责的。因此,启动任何
        一个 RPC 服务之前,都需要启动 rpcbind 服务。

        
        ● NFS 主程序:nfs-utils
        -------------------------------------------------------------------------------------------------------------------------------------
        这个就是 NFS 服务所需要的主要软件。
        
        
        ● 安装并检查
        -------------------------------------------------------------------------------------------------------------------------------------        
        [root@online ~]# yum install rpcbind
        [root@online ~]# yum install nfs

        [root@online ~]# rpm -qa | grep rpcbind
        rpcbind-0.2.0-42.el7.x86_64
        
        [root@online ~]# rpm -qa | grep nfs
        libnfsidmap-0.25-17.el7.x86_64
        nfs4-acl-tools-0.3.3-15.el7.x86_64
        nfs-utils-1.3.0-0.48.el7_4.2.x86_64
        
        
        
    2.2 NFS 软件结构
    -----------------------------------------------------------------------------------------------------------------------------------------        
    NFS 配置文件只有一个。    

    
        ● 主要配置文件:/etc/exports
        -------------------------------------------------------------------------------------------------------------------------------------    
        这个是 NFS 的主要配置文件。系统没有默认值,所以这个文件不一定存在,可能需要手动建立。
        
        
        ● NFS 文件系统维护命令可执行文件:/usr/sbin/exportfs
        -------------------------------------------------------------------------------------------------------------------------------------
        这个是维护 NFS 分享资源的指令的可执行文件。可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸载或重新
        共享等,NFS 系统非常重要的指令之一。

        
        ● 共享资源的登录文件:/var/lib/nfs/*tab
        -------------------------------------------------------------------------------------------------------------------------------------
        NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录下,该目录下有两个比较重要的文件:
            
            一个是 etab, 主要记录了 NFS 所共享出来的目录的完整权限;
            另一个 xtab 则记录曾经链接到此 NFS 服务器的客户端信息。
        
        
        ● 客户端查询服务器共享资源指令的可执行文件:/usr/sbin/showmount
        -------------------------------------------------------------------------------------------------------------------------------------
        这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 共享出来
        的目录资源。

    
    2.3 /etc/exports 配置文件的语法和参数
    -----------------------------------------------------------------------------------------------------------------------------------------
    NFS 会使用到内核功能,所以使用的内核版本必须要支持 NFS 。小于 2.2 版本的内核不支持 NFS 功能。如果自行编译内核,注意选择 NFS 的内核支持。

    编辑 /etc/exports 配置文件:
    [root@online ~]# vim /etc/exports

            /disk2T-1/nfs     localhost(rw)       192.168.1.0/24(rw)      *.sansovo.org(rw,sync)
    格式:    [分享目录]         [可用主机名(权限)]     [可用 IP 网段]             [可用域名通配符]
    
    每一行最前面是要分享出来的目录,注意,是以目录为单位。然后这个目录可以依照不同的权限分享给不同的主机。本例中,将 /disk2T-1/nfs 目录
    共享给三个主机或网段定义,之间空白分隔。主机后面以小括号 () 设计权限参数, 若权限参数不止一个时,则以逗号 (,) 分开。主机名与小括号是连在
    一起的,中间没有空格。
    
    文件内可以使用 # 注释。
        
    主机名的设定主要有几个方式:
    
        ● 可以使用完整的 IP 或者是网段,例如 192.168.1.10 或 192.168.1.0/24 ,或 192.168.1.0/255.255.255.0 都可以接受。    
        ● 也可以使用主机名,但这个主机名必须要在 /etc/hosts 内,或可使用 DNS 找到该主机名。如果是主机名,可以支持通配符,例如 * 或 ? 均可接受。
        
    注意,通配符只能用在主机名的定义上,IP 或网段就只能用 192.168.10.0/24 的形式,不可以使用 192.168.100.* 形式。
    
    权限方面 (就是小括号内的参数),常见的参数有:

    +===================+===========================================================================================================+
    |    参数值            |            内容说明                                                                                        |
    +-------------------+-----------------------------------------------------------------------------------------------------------+
    | rw ro                | 该目录分享的权限是可读写 (read-write) 或只读 (read-only),但最终能不能读写,还与文件系统的 rwx 及身份有关 |                                                                                                |
    +-------------------+-----------------------------------------------------------------------------------------------------------+
    | sync async        | sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!                |
    +-------------------+-----------------------------------------------------------------------------------------------------------+
    | no_root_squash    | 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?默认情况下,客户端的             |
    | root_squash        | root 身份会由 root_squash 的设置转变成 nfsnobody, 如此对服务器的系统会较有保障。但如果想要开放            |
    |                    | 客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 。                            |
    +-------------------+-----------------------------------------------------------------------------------------------------------+
    | all_squash        | 不论登入 NFS 的使用者身份为何, 他的身份都会被转变为匿名用户,通常也就是 nobody(nfsnobody) 。                |
    +-------------------+-----------------------------------------------------------------------------------------------------------+
    | anonuid            | anon 意指 anonymous (匿名者)。前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但    |
    | anongid            | 是可以自行设定这个 UID 的值。当然,这个 UID 必需要存在于 /etc/passwd 当中。 anonuid 指的是 UID, 而 anongid|
    |                    | 则是用户组的 GID 。                                                                                        |
    +-------------------+-----------------------------------------------------------------------------------------------------------+

        
    范例:
        
        ● 让 root 保有 root 的权限
        -------------------------------------------------------------------------------------------------------------------------------------
        任何人都可以使用 NFS 服务器的 /tmp ,用通配符来处理主机名,重点在 no_root_squash,让 root 写入的文件还是具有 root 的权限。
        
        [root@online ~]# vim /etc/exports
        /tmp *(rw,no_root_squash)
        
        ● 同一目录针对不同范围开放不同权限
        -------------------------------------------------------------------------------------------------------------------------------------
        将一个公共的目录 /home/public 公开出去,但只有限定的局域网络 192.168.1.0/24 这个网段且加入 nfsgroup 用户组的用户才能够读写,其他来源
        则只能读取。
        
        [root@online ~]# mkdir /home/public
        [root@online ~]# setfacl -m g:nfsgroup:rwx /home/public
        [root@online ~]# vim /etc/exports
        /tmp *(rw,no_root_squash)
        /home/public 192.168.1.0/24(rw)  *(ro)
        # 注意,将主机名与网段分为两段,中间用空白隔开。
        
        ● 仅给某个单一主机使用的目录设置
        -------------------------------------------------------------------------------------------------------------------------------------
        将一个私有目录 /home/test 只开放给 192.168.1.103 这个 Client 端的机器来使用时,假设使用者的身份是 devalone 才具有完整的权限。
        
        [root@online ~]# mkdir /home/test
        [root@online ~]# setfacl -m u:devalone:rwx /home/test
        [root@online ~]# vim /etc/exports
        /tmp *(rw,no_root_squash)
        /home/public 192.168.1.0/24(rw)  *(ro)
        /home/test 192.168.1.103(rw) # 只要设定 IP 正确即可
        
        
        ● 开放匿名登录
        -------------------------------------------------------------------------------------------------------------------------------------        
        要让 *.sansovo.org 域的主机,登入 NFS 主机时,可以存取 /home/linux。但是他们存数据的时候,要他们的 UID 与 GID 都变成 45 这个身份的用户,
        假设 NFS 服务器上的 UID 45 与 GID 45 的用户/组名为 nfsanon。
        
        [root@online ~]# groupadd -g 45 nfsanon
        [root@online ~]# useradd -u 45 -g nfsanon nfsanon
        [root@online ~]# mkdir /home/linux
        [root@online ~]# setfacl -m u:nfsanon:rwx /home/linux
        [root@online ~]# vim /etc/exports
        /tmp *(rw,no_root_squash)
        /home/public 192.168.1.0/24(rw)  *(ro)
        /home/test 192.168.1.103(rw)
        /home/linux *.sansovo.org(rw,all_squash,anonuid=45,anongid=45)
        
        如果要开放匿名,重点是 all_squash,并且要配合 anonuid 和 anongid
        
        当 *.sansovo.org 登录这部 NFS 主机,并且在 /home/linux 写入文件时,该文件的所有人与用户组,就会变成 /etc/passwd 里对应的 UID 为 45 的
        用户。
        
        
    2.4 启动 NFS
    -----------------------------------------------------------------------------------------------------------------------------------------
    先启动 rpcbind:
    [root@online ~]# systemctl start rpcbind.service
    设置 rpcbind 开机启动:
    [root@online ~]# systemctl enable rpcbind.service
    
    启动 nfs:
    [root@online ~]# systemctl start nfs.service
    设置 nfs 开机启动:
    [root@online ~]# systemctl enable nfs.service

    启动 nfslock:
    [root@online ~]# systemctl start nfslock.service
    设置 nfslock 开机启动:
    [root@online ~]# systemctl enable nfslock.service
    
    
    查看系统日志,观察是否有错误发生:
    [root@online ~]# tail -n 50 /var/log/messages
    
    
    检查 NFS 端口使用情况:
    [root@online ~]# netstat -tulnp| grep -E '(rpc|nfs)'
    tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      18428/rpc.mountd
    tcp        0      0 0.0.0.0:56965           0.0.0.0:*               LISTEN      18426/rpc.statd
    tcp6       0      0 :::20048                :::*                    LISTEN      18428/rpc.mountd
    tcp6       0      0 :::33081                :::*                    LISTEN      18426/rpc.statd
    udp        0      0 0.0.0.0:20048           0.0.0.0:*                           18428/rpc.mountd
    udp        0      0 0.0.0.0:111             0.0.0.0:*                           18269/rpcbind
    udp        0      0 0.0.0.0:634             0.0.0.0:*                           18269/rpcbind
    udp        0      0 127.0.0.1:794           0.0.0.0:*                           18426/rpc.statd
    udp        0      0 0.0.0.0:40117           0.0.0.0:*                           18426/rpc.statd
    udp6       0      0 :::20048                :::*                                18428/rpc.mountd
    udp6       0      0 :::111                  :::*                                18269/rpcbind
    udp6       0      0 :::634                  :::*                                18269/rpcbind
    udp6       0      0 :::34147                :::*                                18426/rpc.statd


    
    注意,rpcbind 启动的 port 在 111 ,同时启动在 UDP 与 TCP

    可以使用 rpcinfo 来观察每个 RPC 服务的注册状况:
    
    ■ rpcinfo — report RPC information
    -----------------------------------------------------------------------------------------------------------------------------------------
    用法:
        rpcinfo [-m | -s] [host]
        rpcinfo -p [host]
        rpcinfo -T transport host prognum [versnum]
        rpcinfo -l [-T transport] host prognum versnum
        rpcinfo [-n portnum] -u host prognum [versnum]
        rpcinfo [-n portnum] [-t] host prognum [versnum]
        rpcinfo -a serv_address -T transport prognum [versnum]
        rpcinfo -b [-T transport] prognum versnum
        rpcinfo -d [-T transport] prognum versnum
        
        rpcinfo -p [IP|hostname]
        rpcinfo -t|-u IP|hostname 程序名称

    选项与参数:
        -p :针对某 IP (未写则默认为本机) 显示出所有的 port 与 porgram 的信息;
        -t :针对某主机的某个程序检查其 TCP 封包所在的软件版本;
        -u :针对某主机的某个程序检查其 UDP 封包所在的软件版本;
    
    
    范例:
        
        ● 显示出当前本机的 RPC 状态
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# 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
            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
            100024    1   udp  60387  status
            100024    1   tcp  57745  status
            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  58439  nlockmgr
            100021    3   udp  58439  nlockmgr
            100021    4   udp  58439  nlockmgr
            100021    1   tcp  43507  nlockmgr
            100021    3   tcp  43507  nlockmgr
            100021    4   tcp  43507  nlockmgr
    
        
        ● 针对 nfs 程序检查其相关的软件版本信息 (仅察看 TCP 封包)
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# rpcinfo -t localhost nfs
        program 100003 version 3 ready and waiting
        program 100003 version 4 ready and waiting

    
    2.5 NFS 联机观察
    -----------------------------------------------------------------------------------------------------------------------------------------    
    NFS 服务器设置好之后,可以在 server 端先测试一下是否可以联机,使用 showmount 工具。
    
    
    ■ showmount - 显示关于 NFS 服务器文件系统挂载的信息
    -----------------------------------------------------------------------------------------------------------------------------------------
    在远程主机上查询关于该 NFS 服务器的挂载进程状态。如果不使用任何参数, showmount 显示所有从该服务器上挂载到本地的客户清单。 showmount 的输
    出格式设计成类似于经过 ``sort -u'' 命令格式化后一样。
    
    用法:
         showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
    
    选项与参数:
        -a或--all        : 以 host:dir 这样的格式来显示客户主机名和挂载点目录。
        -e或--exports    : 显示 NFS 服务器的输出清单,即 NFS 主机的 /etc/exports 所分享的目录数据。
    
    
    范例:
    
        显示出 exports 共享目录信息
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# showmount -e localhost
        Export list for localhost:
        /disk2T-1/nfs *.sansovo.org,192.168.1.0/24,localhost

        查看 nfs 信息文件:
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# ll /var/lib/nfs/
        总用量 4
        -rw-r--r--.  1 root    root    627 4月  27 18:30 etab
        -rw-r--r--.  1 root    root      0 4月  27 12:48 export-lock
        drwx------.  2 root    root     25 4月  27 12:48 nfsdcltrack
        -rw-r--r--.  1 root    root      0 3月   7 21:39 rmtab
        dr-xr-xr-x. 11 root    root      0 4月  27 17:54 rpc_pipefs
        drwx------.  4 rpcuser rpcuser  43 4月  27 12:48 statd
        -rw-r--r--.  1 rpcuser rpcuser   0 3月   7 21:39 state
        drwxr-xr-x.  2 root    root      6 3月   7 21:39 v4recovery
        -rw-r--r--.  1 root    root      0 3月   7 21:39 xtab

        
        [root@online ~]# tail /var/lib/nfs/etab

        
    ■ exportfs - 管理NFS共享文件系统列表
    -----------------------------------------------------------------------------------------------------------------------------------------    
    用法:
        /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 :全部挂载(或卸载) /etc/exports 文件内内的设置
        -r :重新挂载 /etc/exports 里的设置,此外,也同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容
        -u :卸载某一目录的共享
        -v :输出详细信息。当共享或者取消共享时,显示在做什么。显示当前共享列表的时候,同时显示共享的选项。
    
    范例:
        ● 重新挂载一次 /etc/exports 的设置
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# exportfs -arv
        exporting localhost:/disk2T-1/nfs
        exporting 192.168.1.0/24:/disk2T-1/nfs
        exporting *.sansovo.org:/disk2T-1/nfs

        ● 将已经分享的 NFS 目录资源,通通都卸载
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# exportfs -auv
        
        这时就看不到任何资源了:
        [root@online ~]# showmount -e localhost
        Export list for localhost:
        
        全部挂载:
        [root@online ~]# exportfs -av
        exporting localhost:/disk2T-1/nfs
        exporting 192.168.1.0/24:/disk2T-1/nfs
        exporting *.sansovo.org:/disk2T-1/nfs
    
    
    2.6 NFS 安全性
    -----------------------------------------------------------------------------------------------------------------------------------------        
    
            
    ■ 防火墙的设置问题与解决方案
    -----------------------------------------------------------------------------------------------------------------------------------------        
    一般来说, NFS 的服务仅会对内部网络开放,不会对互联网开放。然而,如果有特殊需求的话,也可能会跨不同网段。但是,NFS 的防火墙很不好处理,
    因为除了固定的 port 111, 2049 之外, 还有很多不固定的端口是由 rpc.mountd, rpc.rquotad 等服务所开启的,所以,防火墙很难设置规则。

    为了解决这个问题, CentOS 提供了一个固定 NFS 服务端口的配置文件,就是 /etc/sysconfig/nfs 。这个文件能够指定每个服务的特定端口,每次启动
    nfs 时,相关服务启动的端口就会固定下来,这样,就可以设置正确的防火墙规则。
        
    除此之外,还有 lockd kernel module, 编辑 /etc/modprobe.d/lockd.conf 文件可以配置文件锁管理器的端口号。
        
    [root@online ~]# vi /etc/sysconfig/nfs    
    
    # Port rpc.mountd should listen on.
    MOUNTD_PORT=2048
    ...
    
    # Port rpc.statd should listen on.
    STATD_PORT=662
    
    ...
    
    # Outgoing port statd should used. The default is port
    # is random
    STATD_OUTGOING_PORT=2020



    编辑 /etc/modprobe.d/lockd.conf 配置锁端口。
    [root@online ~]# vi /etc/modprobe.d/lockd.conf
    # Set the TCP port that the NFS lock manager should use.
    # port must be a valid TCP port value (1-65535).
    options lockd nlm_tcpport=30001
    #
    # Set the UDP port that the NFS lock manager should use.
    # port must be a valid UDP port value (1-65535).
    options lockd nlm_udpport=30001
    #
    
    ● 另外,/etc/nfs.conf 也是可以配置 NFS 服务端口的文件。
    
    编辑之后重新启动系统, 观察 NFS 信息:
    [devalone@online ~]$ rpcinfo -p
   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    662  status
    100024    1   tcp    662  status
    100005    1   tcp   2048  mountd
    100005    2   tcp   2048  mountd
    100005    3   tcp   2048  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  30001  nlockmgr
    100021    3   udp  30001  nlockmgr
    100021    4   udp  30001  nlockmgr
    100021    1   tcp  30001  nlockmgr
    100021    3   tcp  30001  nlockmgr
    100021    4   tcp  30001  nlockmgr

    
    这些服务端口号已经固定,配置防火墙放行。
    
    CentOS 7 默认使用 firewalld 防火墙,使用 firewall-config GUI 界面操作,或使用 firewall-cmd 命令行操作:
    -----------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# firewall-cmd --get-default-zone
        public
        
        ● 开放 rpc-bind 服务端口:
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# firewall-cmd --zone=public --query-service=rpc-bind
        no
        [root@online ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
        success
        
        
        ● 开放 nfs 主服务端口:
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# firewall-cmd --zone=public --query-service=nfs
        no
        [root@online ~]# firewall-cmd --permanent --zone=public --add-service=nfs
        success

        
        ● 开放 mountd 服务端口:
        -------------------------------------------------------------------------------------------------------------------------------------    
        [root@online ~]# firewall-cmd --permanent  --zone=public --add-port=2048/tcp
        success
        [root@online ~]# firewall-cmd --permanent  --zone=public --add-port=2048/udp
        success        

        
        ● 开放 status 服务端口: 662/tcp, 662/udp
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# firewall-cmd --permanent --zone=public --add-port=662/tcp
        success
        [root@online ~]# firewall-cmd --permanent --zone=public --add-port=662/udp
        success

        ● 开放 Outgoing port statd 服务端口: 2020/tcp, 2020/udp
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# firewall-cmd --permanent --zone=public --add-port=2020/tcp
        success
        [root@online ~]# firewall-cmd --permanent --zone=public --add-port=2020/udp
        success
        
        ● 开放 nlockmgr 服务端口: 30001/tcp, 30001/udp
        -------------------------------------------------------------------------------------------------------------------------------------        
        [root@online ~]# firewall-cmd --permanent --zone=public --add-port=30001/tcp
        success
        [root@online ~]# firewall-cmd --permanent --zone=public --add-port=30001/udp
        success

        ● 立即生效:
        [root@online ~]# firewall-cmd --reload
        success

        
    ■ NFS 服务器关机前的注意事项:
    -----------------------------------------------------------------------------------------------------------------------------------------
    由于 NFS 使用的这个 RPC 服务,当客户端连上服务器时,那么服务器将无法关机。因此,NFS Server 关机之前,要先断开客户端的连接,关掉 rpcbind
    与 nfs 。
    
    
*
*
*
    
3. NFS 客户端的设置
---------------------------------------------------------------------------------------------------------------------------------------------    
    
    
    
    3.1 手动挂载 NFS 服务器共享的资源
    -----------------------------------------------------------------------------------------------------------------------------------------
    
    手动挂载的步骤:
    
        (1)    确认本机已经启动了 rpcbind 服务
        -------------------------------------------------------------------------------------------------------------------------------------
        
        [root@namenode ~]# systemctl start rpcbind.service
        [root@namenode ~]# systemctl start nfs.service
        [root@namenode ~]# systemctl enable rpcbind.service    
        [root@namenode ~]# systemctl enable nfs.service        
        
        
        (2) 扫瞄 NFS 服务器共享的目录,并了解是否可以使用 (showmount)
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@namenode ~]# showmount -e online.sansovo.org
        Export list for online.sansovo.org:
        /disk2T-1/nfs *.sansovo.org,192.168.1.0/24,localhost
    
    
        (3) 在本机建立要挂载的挂载点目录 (mkdir)
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@namenode ~]# mkdir /nfs
        [root@namenode ~]# chown devalone:devalone /nfs

        
        (4) 利用 mount 将远程主机直接挂载到相关目录。
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@namenode ~]# mount -t nfs online.sansovo.org:/disk2T-1/nfs /nfs
    
        没有任何输出,挂载成功。
        
        [devalone@namenode ~]$ df
        ......
        online.sansovo.org:/disk2T-1/nfs 1952560128 6137856 1946422272    1% /nfs
        
        进入目录,操作测试:
        [devalone@namenode ~]$ cd /nfs
        [devalone@namenode nfs]$
        [devalone@namenode nfs]$ mkdir -p hdfs/name
        [devalone@namenode nfs]$ ll
        总用量 0
        drwxrwxr-x. 3 devalone devalone 18 4月  27 22:30 hdfs
        
        OK.
            
        注意:
            挂载语法    : -t nfs 指定文件系统类型
            host:/dir    : 指定 NFS 服务器主机提供的共享目录
    

        卸载 nfs:
        -------------------------------------------------------------------------------------------------------------------------------------
        [root@online ~]# umount /nfs
        [devalone@namenode ~]$ ll /nfs
        总用量 0

    
        
    3.2 客户端可处理的挂载参数与开机挂载
    -----------------------------------------------------------------------------------------------------------------------------------------    
    
    
    +===============+===============================================================================================+===========+
    |    参数        |                            描述                                                                | 系统默认值|
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    | suid nosuid    | 如果挂载的 partition 上面有任何 SUID 的 binary 程序,使用 nosuid 可以取消 SUID 的功能            | suid        |
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    | rw ro            | 可以指定该文件系统是只读 (ro) 或可读写喔。服务器可以提供给你可读写,但客户端可以设置允许只读    | rw        |
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    | dev nodev        | 是否可以保留设备文件的特殊功能。一般来说只有 /dev 这个目录才会有特殊设备,因此可以选择 nodev    | dev        |
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    | exec noexec    | 是否具有执行 binary file 的权限。如果要挂载的仅是数据区 (例如 /home),那么可以选择 noexec        | exec        |
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    | user nouser    | 是否允许用户进行文件的挂载与卸载功能。如果要保护文件系统,最好不要提供用户挂载与卸载            | nouser    |
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    | auto noauto    | auto 指的是 mount -a 时,会不会被挂载的项目。如果不需要这个分区随时被挂载,可以设定为 noauto    | auto        |
    +---------------+-----------------------------------------------------------------------------------------------+-----------+
    
    
    一般来说,如果 NFS 服务器所提供的只是类似 /home 下的个人资料,应该不需要可执行、SUID 与设备文件,因此在挂载的时候,可以这样下达指令:
    
    [root@online ~]# mount -t nfs -o nosuid,noexec,nodev,rw online.sansovo.org:/disk2T-1/nfs /nfs
    
    查看相信的挂载信息:
    [devalone@namenode ~]$ mount | grep 'online'
    [devalone@namenode ~]$ mount | grep 'addr'

    这样,挂载的这个文件系统就只能作为数据存取之用,对于客户端是比较安全的。
    
    
    ■ NFS 特殊的挂载参数
    -----------------------------------------------------------------------------------------------------------------------------------------
    由于文件系统对 Linux 是非常重要的东西,进行任何操作时,只要用到文件系统,整个目录树系统就会自动查询全部的挂载点。如果 NFS 服务器与客户端
    之间的联机因为网络问题,或者是服务器端先关机了,却没有通知客户端,那么客户端只要运行文件系统指令 (例如 df, ls, cp 等等) ,整个系统就会慢
    下来,因为必须要等到文件系统搜寻等待超时后,系统才会返回。

    为了避免文件系统困扰,除了上述的 mount 参数之外,Linux 针对 NFS 服务器提供很多额外参数。    
    
    
+=======+===================================================================================================================+===============+
| 参数    |                    参数功能                                                                                        | 默认值        |
+-------+-------------------------------------------------------------------------------------------------------------------+---------------+
| fg    | 当执行挂载时,该挂载的行为在前台 (fg) 还是后台(bg) 执行。若在前台执行, mount 会持续尝试挂载,直到成功或 time out    |    fg            |
| bg    | 为止。若为后台执行,则 mount 会在后台持续多次进行 mount ,而不会影响到前台的程序操作。如果网络联机不太稳定,或是    |                |
|        | 服务器经常需要开关机,建议使用 bg 比较妥当。                                                                        |                |
+-------+-------------------------------------------------------------------------------------------------------------------+---------------+
| soft     | 如果是 hard 的情况,则当两者之间有任何一部主机脱机,则 RPC 会持续 call, 直到对方恢复联机为止。如果是 soft,  RPC    |    hard        |
| hard    | 会在 time out 后反复 call, 而非持续 call, 因此系统的延迟会比较不那么明显。如果服务器开关机频繁,建议使用 soft     |                |
+-------+-------------------------------------------------------------------------------------------------------------------+---------------+
| intr    | 当使用 hard 方式挂载时,若加上 intr 参数,则当 RPC 持续 call 时,该次的 call 是可以被中断的 (interrupted)。        |    无            |
+-------+-------------------------------------------------------------------------------------------------------------------+---------------+
| rsize    | 读出(rsize)与写入(wsize)的块大小 (block size)。这个配置值可以影响客户端与服务器端传输数据的缓冲区容量。一般来说,    | rsize=1048576    |
| wsize    | 如果在局域网络内 (LAN), 并且客户端与服务器端都具有足够的内存,这个值可以设定大一点,如: 32768 (bytes) 等,提升    | wsize=1048576    |
|         | 缓冲区块大小可提升 NFS 文件系统的传输能力。但要注意设置的值也不要太大,最好是达到网络能够传输的最大值为限。        |                |
+-------+-------------------------------------------------------------------------------------------------------------------+---------------+
        
    更多参数 man nfs
    
    如果 NFS 是用在高速运行的环境当中,建议加上这些参数:
    [root@online ~]# mount -t nfs -o intr,nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 online.sansovo.org:/disk2T-1/nfs /nfs
    
    查看挂载信息:
    [devalone@namenode ~]$ mount | grep 'online'
    
    
    注:
    rsize=32768,wsize=32768 参数不用修改,默认的 1048576 byte = 1M 运行足够好,写到命令里为了演示这两个参数的用法。
    
    
    
    ■ NFS 开机挂载
    -----------------------------------------------------------------------------------------------------------------------------------------
    
    
    [root@online ~]# vi /etc/fstab
    online.sansovo.org:/disk2T-1/nfs /nfs           nfs     intr,nosuid,noexec,nodev,rw,bg,soft     0 0


    
    3.3 无法挂载的原因分析
    -----------------------------------------------------------------------------------------------------------------------------------------
    
        ● 客户端的主机名或 IP 网段不被允许使用;
        ● 服务器或客户端某些服务未启动: rpcbind 或 nfs 服务没有启动;
        ● 防火墙没有打开相关服务的端口。


    3.4 自动挂载 autofs 的使用
    -----------------------------------------------------------------------------------------------------------------------------------------    
    服务器与客户端的联机或许不会永远存在,如果挂载了 NFS 服务器后,任何一方脱机都可能造成另外一方总是等待超时;而且挂载的 NFS 文件系统可能
    又不是常常被使用,但如果不挂载,有时又会紧急使用。autofs 挂载会很好地解决开机挂载和手动挂载的这些弊端,它提供如下解决方案:

        ● 客户端在有使用 NFS 文件系统时才让系统自动挂载
        ● NFS 文件系统使用完毕后,让 NFS 自动卸载,以避免可能的 RPC 错误。
        

    
    ■ autofs 服务运行原理
    -----------------------------------------------------------------------------------------------------------------------------------------
    autofs 这个服务运行在 NFS 客户端上,会持续监视某个指定的目录,并设置当使用该目录下的某个子目录时,会获取来自服务器端的 NFS 文件系统资源,
    并进行自动挂载操作。

    autofs 主控配置文件为 /etc/auto.master, 文件的内容很简单,只要定义最上层的监视目录 (如:/nfs) 即可。后面的内容则是该目录下各子目录的映射
    文件,映射文件的文件名可自定义,如:/etc/auto.nfs 。在映射文件里可以定义每个子目录所挂载的远程服务器的 NFS 目录资源。
    
    当客户端用到映射文件里定义的子目录时, autofs 才会到对应的服务器上挂载资源;挂载之后,默认间隔 5 分钟没有使用该目录内的数据, autofs 会
    自动卸载这个 NFS 文件系统资源。

    这个 5 分钟超时值可以通过 autofs.conf 程序配置文件修改,单位为秒:
    
    [root@namenode ~]# vi /etc/autofs.conf
    
    # timeout - set the default mount timeout in secons. The internal
    #           program default is 10 minutes, but the default installed
    #           configuration overrides this and sets the timeout to 5
    #           minutes to be consistent with earlier autofs releases.
    #
    timeout = 300

    列出与 autofs 相关的配置文件:
    [root@namenode ~]# ll /etc/auto*
    /etc/autofs.conf
    /etc/autofs_ldap_auth.conf
    /etc/auto.master
    /etc/auto.misc
    /etc/auto.net
    /etc/auto.nfs
    /etc/auto.smb


    ■ 安装、配置 autofs
    -----------------------------------------------------------------------------------------------------------------------------------------
    [root@namenode ~]# yum install autofs
    
    配置开机启动并即刻 autofs 服务
    [root@namenode ~]# systemctl enable autofs.service
    [root@namenode ~]# systemctl start autofs.service
    
    [root@namenode ~]# vi /etc/auto.master
    /nfs    /etc/auto.nfs


    ■ 建立数据映射文件 (/etc/auto.nfs) 的挂载信息与服务器对应资源
    -----------------------------------------------------------------------------------------------------------------------------------------
    数据映射文件格式:
    
    [本地端子目录] [-挂载参数] [服务器提供的目录]
    
    [本地端子目录]    :指的是在 /etc/auto.master 内指定的监视目录的子目录,如, hdfs
    [-挂载参数]     :就是之前提到的 mount 挂载参数,如:rw,bg,soft 等,可选
    [服务器提供的目录]    :online.sansovo.org:/disk2T-1/nfs/hdfs

    范例:
        [root@namenode ~]# vi /etc/auto.nfs
        hdfs -intr,nosuid,bg,soft online.sansovo.org:/disk2T-1/nfs/hdfs
            

    测试:
    [root@namenode ~]# ll /nfs
    total 0
    drwxrwxr-x. 3 devalone devalone 18 Apr 27 22:30 hdfs

    [root@namenode ~]# umount /nfs
    [root@namenode ~]# ll /nfs
    total 0
    [root@namenode ~]# systemctl restart autofs

    [root@namenode ~]# ll /nfs
    total 0
    [root@namenode ~]# cd /nfs/
    [root@namenode nfs]# ll
    total 0
    [root@namenode nfs]# cd hdfs
    [root@namenode hdfs]# ll
    total 0
    drwxrwxr-x. 2 devalone devalone 6 Apr 27 22:30 name
    
    [root@namenode hdfs]# df
    online.sansovo.org:/disk2T-1/nfs/hdfs 1952560128 6137856 1946422272   1% /nfs/hdfs
    
    [root@namenode hdfs]# mount | grep online
    online.sansovo.org:/disk2T-1/nfs/hdfs on /nfs/hdfs type nfs4 (rw,nosuid,nodev,noexec,relatime,vers=4.1,rsize=1048576,wsize=1048576 ...

    
    OK.



   

猜你喜欢

转载自blog.csdn.net/devalone/article/details/80565625
今日推荐