NFS服务由浅入深

1.  NFS介绍

英文全称:network filesystem

作用:用在linux系统之间访问共享

使用的端口号:小于1024的随机端口

2.  什么是RPC?

全称:remote procedure call

作用:

客户端连接NFS服务器的时候,所使用的端口,需要向RPC注册,所以RPC就会知道端口号是多少,RPC程序会通过111反馈给客户端端口号。

               

要求:RPC要在NFS服务启动之前,就启动。

要想使用NFS,那么客户端和服务器都必须启动RPC服务。

NFS的RPC服务,在CentOS5.X下名称为portmap,在Centos6.x下名称为rpcbind.

3.  NFS daemons

rpc.nfsd  nfs服务器服务提供商,看nfs客户端是否可以使用nfs服务器。

rpc.mountd  验证客户端的权限。

rpc.lockd  锁定文档,防止多个用户同时修改一个文档,导致文档内容不一致。

rpc.statd  检查文件的一致性,如果有损坏,可以尝试恢复该文档。

4.  NFS服务器端的设置

    1.  NFS软件列表

        nfs-utils:  NFS服务的主程序,包括rpc.nfsd,rpc.mountd两个daemons和相关文档说明,以及执行命令文件等。

        rpcbind:  Centos6.x下面RPC的主程序,在启动NFS服务之前必须先启动rpcbind服务才行。

    2.  查看软件包

        rpm -qa nfs-utils rpcbind

        rpm -qa | grep -E "nfs-|rpcbind"

    3.  安装软件包

        yum install rpcbind nfs-utils -y

    4.  启动NFS相关服务

        centos6:  /etc/init.d/rpcbind start

        centos7:  systemctl start rpcbind

        检查rpcbind的启动情况:rpcinfo -p localhost,结果如下:

[root@kubernetes-node1 ~]# 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  45063  status
    100024    1   tcp  45046  status

        当启用nfs服务以后,systemctl start nfs 或者/etc/init.d/nfs start,再执行rpcinfo -p localhost,结果如下:

[root@localhost ~]# 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  47830  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100024    1   tcp  47243  status
    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  49190  nlockmgr
    100021    3   udp  49190  nlockmgr
    100021    4   udp  49190  nlockmgr
    100021    1   tcp  41713  nlockmgr
    100021    3   tcp  41713  nlockmgr
    100021    4   tcp  41713  nlockmgr

    5.  NFS服务常见进程详解

        NFS服务启动以后,使用命令ps -ef | egrep "nfs|rpc",可以查看进程,如下:

[root@localhost ~]# ps -ef | egrep "nfs|rpc"
root     27057     2  0 Apr27 ?        00:00:00 [rpciod]
rpcuser  27064     1  0 Apr27 ?        00:00:00 /usr/sbin/rpc.statd
root     27065     1  0 Apr27 ?        00:00:00 /usr/sbin/rpc.idmapd
rpc      27074     1  0 Apr27 ?        00:00:01 /sbin/rpcbind -w
root     27075     1  0 Apr27 ?        00:00:00 /usr/sbin/rpc.mountd
root     27086     2  0 Apr27 ?        00:00:00 [nfsd4_callbacks]
root     27092     2  0 Apr27 ?        00:00:00 [nfsd]
root     27093     2  0 Apr27 ?        00:00:00 [nfsd]
root     27094     2  0 Apr27 ?        00:00:00 [nfsd]
root     27095     2  0 Apr27 ?        00:00:00 [nfsd]
root     27096     2  0 Apr27 ?        00:00:00 [nfsd]
root     27097     2  0 Apr27 ?        00:00:00 [nfsd]
root     27098     2  0 Apr27 ?        00:00:00 [nfsd]
root     27099     2  0 Apr27 ?        00:00:02 [nfsd]
root     32584 32493  0 11:27 pts/0    00:00:00 grep -E --color=auto nfs|rpc

        nfsd(rpc.nfsd):管理NFS客户端是否能够登入NFS服务器端主机,其中包含登入者的ID判别等。

        mountd(rpc.mountd):管理NFS文件系统,看是不是有权限访问共享目录。 

        rpc.lockd: 锁定文档,防止多个用户同时修改一个文档,导致文档内容不一致。

        rpc.statd: 检查文件的一致性,如果有损坏,可以尝试恢复该文档。

    6.  配置NFS和rpcbind开机启动

        centos6:  chkconfig rpcbind on   &&   chkconfig nfs on

        centos7:  systemctl enable rpcbind && systemctl enable nfs

        生产实践中,都是添加到/etc/rc.local文件中,内容如下:

          /etc/init.d/rpcbind start

          /etc/init.d/nfs start

          centos7直接用systemctl管理就好。

    7.  NFS服务配置文件管理

        1.  配置文件路径

            /etc/exports,内容为空。

        2.  配置文件格式

            语法:NFS共享的目录  NFS客户端地址(参数1,参数2,参数3)

              NFS共享的目录:绝对路径,注意共享目录的本地权限,如果要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。

              NFS客户端地址:可以是单独的IP或主机名或域名或网段,还可以用*通配符表示所有.

                10.0.0.30

                10.0.0.0/24

                10.0.0.*

                nfs.oldboy.com

                *.oldboy.com

        3.  配置参数权限

            常用的参数

              rw:读写权限

              ro:只读权限

              sync:写入数据时,数据同步写入到NFS Server的硬盘才返回。优点:数据安全;缺点:写入慢。

              async:写入数据时,会先写到NFS Server内存缓冲区,直到硬盘有空才写入硬盘。优点:写入快;缺点:不能断电或宕机。

              no_root_squash:如果访问共享目录的是root,则对共享目录还是root权限。

              root_squash:如果访问共享目录的是root,则被压缩成匿名用户。

              all_squash:不管是任何用户,都压缩成匿名用户。

              anonuid:匿名用户的UID

              anongid:匿名用户的GID

            可以通过命令查看自带的参数:

              cat /var/lib/nfs/etab  这是服务器端的查看

              cat /proc/mounts  这是客户端的查看

            NFS配置权限关系图,如下:

            

5.  NFS服务配置实战

    1.  安装rpcbind和NFS,启动起来,并设置为开机启动。

    2.  创建共享目录,或者共享已经存在的目录。

        mkdir -p /home/yangjianbo

    3.  把共享目录添加到/etc/exports文件中,内容如下:

        /home/yangjiabo 172.16.20.215(rw,sync,all_squash)

        当客户端172.16.20.215访问共享目录的时候,使用的nfsnobody用户。所以要给nfsnobody用户权限。

        chown -R nfsnobody.nfsnobody /home/yangjianbo

    4.  修改完以后,一定要重新加载配置,一定要注意。不需要重启NFS服务。

        [root@localhost home]# exportfs -rv

    5.  在NFS服务器上查看一下挂载情况:showmount -e localhost

    6.  在NFS客户端上也要安装rpcbind和NFS,但是NFS可以不用启动。

        查看一下挂载目录:showmount -e nfs的IP

        挂载命令:mount -t nfs 172.16.252.190:/home/yangjianbo /home/yangjianbo

        前提一定要客户端存在/home/yangjiabo目录。

6.  NFS客户端配置

    1.  挂载命令

        语法:mount -t nfs nfs_IP:共享目录  客户端挂载点(必须存在)

    2.  挂载失败排错思路

        1.  先看一下服务器上是否可以挂载

            showmount -e localhost

            mount -t nfs 172.16.252.190:/home/yangjianbo /mnt

        2.  再从客户端showmount服务器是否正常。

            showmount -e 172.16.252.190

        3.  如果不正常,就看看网络是不是有问题,或者防火墙屏蔽掉了。

    3.  NFS客户端开机自启动挂载

        1.  将挂载命令放在/etc/rc.local里。

            缺点:偶尔挂载不上,生产需要对挂载监控。

#mount by www
/bin/mount -t nfs 172.16.252.190:/usr/local/cmrcms /home/www

        2.  将挂载目录放在/etc/fstab里。

            echo "172.16.252.190:/usr/local/cmrcms  /home/www    nfs    defaults 0 0" >> /etc/fstab

7.  NFS高级配置

    1.  NFS服务端指定固定UID访问共享目录

        1.  在NFS服务器上创建用户和组,指定UID和GID,然后把共享目录的属主属组指到该用户和组上。

            groupadd web -g 888

            useradd www-user -u 888 -g web

            mkdir -p /home/www

            chown -R www-user.web /home/www

            echo '#www' >>/etc/exports

            echo '/home/www 172.16.20.215(rw,sync,all_squash,anonuid=888,anongid=888)'  >>/etc/exports

    2.  NFS客户端操作

        1.  建立用户和组,同上一样。          

            groupadd web -g 888

            useradd www-user -u 888 -g web

            mkdir /home/test

            mount -t nfs 172.16.252.190:/home/www /home/test

    3.  如果出现属主和属组都为nobody,需要修改nfs服务器和nfs客户端文件/etc/idmapd.conf

        Domain = zhen.com

        [Mapping]

        Nobody-User = java
        Nobody-Group = java

        CentOS6重启/etc/init.d/rpcidmapd restart

        CentOS7重启systemctl restart rpcbind

        NFS客户端重新挂载一下共享目录

posted @ 2018-05-02 09:24  奋斗史  阅读(422)  评论(0)    收藏  举报