zoukankan      html  css  js  c++  java
  • NFS服务搭建与配置

    本文讲解在 CentOS 5.x、CentOS 6.x 和 CentOS 7.x 环境下,如何安装与部署 NFS 服务。

    注意:一台机器不要同时做 NFS 的服务端和 NFS 的客户端。如果同时作了 NFS 的服务端和客户端,那么在关机的时候,会一直夯住,可能十分钟之后甚至更久才能关闭成功。

    NFS 工作原理简介

    启动 NFS SERVER 之前,首先要启动 RPC 服务(CentOS 5.x 下为 portmap 服务,CentOS 6.x 和 CentOS 7.x 下为 rpcbind 服务,下同),否则 NFS SERVER 就无法向 RPC 服务注册了。

    另外,如果 RPC 服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时 RPC 服务管理的NFS程序也需要重新启动以重新向RPC注册。

    要特别注意的是:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行 /etc/init.d/nfs reload 「针对CentOS 5.x 或 CentOS 6.x」 或 systemctl reload nfs.service 「针对CentOS 7.x」 或 exportfs -rv 即可使修改的 /etc/exports 生效。

    NFS 服务所需的安装包

    安装 NFS 和 RPC 「服务端、客户端都安装」

    1 [root@backup ~]# rpm -qa nfs-utils rpcbind
    2 [root@backup ~]# yum install nfs-utils rpcbind -y    #nfs需要的安装包
    3 [root@backup ~]# rpm -qa nfs-utils rpcbind
    4 nfs-utils-1.2.3-64.el6.x86_64
    5 rpcbind-0.2.0-11.el6_7.x86_64

    查看用户信息

     1 [root@nfs01 ~]# tail /etc/passwd
     2 haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
     3 ntp:x:38:38::/etc/ntp:/sbin/nologin
     4 saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
     5 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
     6 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     7 tcpdump:x:72:72::/:/sbin/nologin
     8 oldboy:x:500:500::/home/oldboy:/bin/bash
     9 rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin        #yum安装rpc服务时创建的
    10 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin        #yum安装rpc服务时创建的
    11 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin    #yum安装nfs服务时创建的

    NFS 版本查看

    服务端版本查看

    nfsstat -s

    客户端版本查看

    nfsstat  -c

    NFS服务端搭建

    配置exports

     1 [root@nfs01 ~]# mkdir /data
     2 [root@nfs01 ~]# ll -d /data/
     3 drwxr-xr-x. 3 root root 4096 Apr 11 09:49 /data/
     4 [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/    
     5 [root@nfs01 ~]# ll -d /data/                       
     6 drwxr-xr-x. 3 nfsnobody nfsnobody 4096 Apr 11 09:49 /data/
     7 [root@nfs01 ~]# cat /etc/exports    
     8 # share /data for web created by zhangliang at 2016-05-21
     9 /data   172.16.1.0/24(rw,sync)
    10 #172.16.1.0/24(rw,sync) 没有空格
    11 #/data  172.16.1.0/24(rw,sync,root_squash,all_squash,anonuid=XXXX,anongid=XXXX) # 推荐配置

    其他配置示例:

    1 # 指定 IP 配置
    2 /opt    192.168.0.1(ro) 192.168.0.2(rw)
    3 # 指定 网段
    4 /data   172.16.1.0/24(rw,sync)

    启动rpcbind服务

    CentOS 5.x 和 CentOS 6.x 启动方式

     1 [root@nfs01 ~]# /etc/init.d/rpcbind start    
     2 [root@nfs01 ~]# netstat -anp | grep 'rpc'    
     3 tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1346/rpcbind        
     4 tcp        0      0 0.0.0.0:38420               0.0.0.0:*                   LISTEN      1368/rpc.statd      
     5 tcp        0      0 :::13894                    :::*                        LISTEN      1368/rpc.statd      
     6 tcp        0      0 :::111                      :::*                        LISTEN      1346/rpcbind        
     7 udp        0      0 0.0.0.0:673                 0.0.0.0:*                               1346/rpcbind        
     8 udp        0      0 127.0.0.1:703               0.0.0.0:*                               1368/rpc.statd      
     9 udp        0      0 0.0.0.0:15306               0.0.0.0:*                               1368/rpc.statd      
    10 udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1346/rpcbind        
    11 udp        0      0 :::673                      :::*                                    1346/rpcbind        
    12 udp        0      0 :::50537                    :::*                                    1368/rpc.statd      
    13 udp        0      0 :::111                      :::*                                    1346/rpcbind        
    14 unix  2      [ ACC ]     STREAM     LISTENING     10120  1346/rpcbind        /var/run/rpcbind.sock
    15 unix  2      [ ]         DGRAM                    10207  1368/rpc.statd      
    16 [root@nfs01 ~]# rpcinfo -p localhost    
    17    program vers proto   port  service
    18     100000    4   tcp    111  portmapper
    19     100000    3   tcp    111  portmapper
    20     100000    2   tcp    111  portmapper
    21     100000    4   udp    111  portmapper
    22     100000    3   udp    111  portmapper
    23     100000    2   udp    111  portmapper
    24     100024    1   udp  15306  status
    25     100024    1   tcp  38420  status
    26 #### 由上可知,暂时只有自己的端口服务,没有其他的

    CentOS 7.x 启动方式

     1 [root@nginx_cdn ~]# systemctl start rpcbind.service  
     2 [root@nginx_cdn ~]# netstat -anp | grep 'rpc' 
     3 tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1930/rpcbind        
     4 tcp6       0      0 :::111                  :::*                    LISTEN      1930/rpcbind        
     5 udp        0      0 0.0.0.0:832             0.0.0.0:*                           1930/rpcbind        
     6 udp        0      0 0.0.0.0:111             0.0.0.0:*                           1930/rpcbind        
     7 udp6       0      0 :::832                  :::*                                1930/rpcbind        
     8 udp6       0      0 :::111                  :::*                                1930/rpcbind        
     9 unix  2      [ ACC ]     STREAM     LISTENING     17999    1/systemd            /var/run/rpcbind.sock
    10 [root@nginx_cdn ~]# rpcinfo -p localhost    
    11    program vers proto   port  service
    12     100000    4   tcp    111  portmapper
    13     100000    3   tcp    111  portmapper
    14     100000    2   tcp    111  portmapper
    15     100000    4   udp    111  portmapper
    16     100000    3   udp    111  portmapper
    17     100000    2   udp    111  portmapper

    启动 NFS

    CentOS 5.x 和 CentOS 6.x 启动方式

     1 [root@nfs01 ~]# /etc/init.d/nfs start    
     2 Starting NFS services:                                     [  OK  ]
     3 Starting NFS quotas:                                       [  OK  ]
     4 Starting NFS mountd:                                       [  OK  ]
     5 Starting NFS daemon:                                       [  OK  ]
     6 正在启动 RPC idmapd:                                      [确定]
     7 [root@nfs01 ~]# rpcinfo -p localhost    
     8    program vers proto   port  service
     9     100000    4   tcp    111  portmapper
    10     100000    3   tcp    111  portmapper
    11     100000    2   tcp    111  portmapper
    12     100000    4   udp    111  portmapper
    13     100000    3   udp    111  portmapper
    14     100000    2   udp    111  portmapper
    15     100024    1   udp  15306  status
    16     100024    1   tcp  38420  status
    17     100011    1   udp    875  rquotad
    18     100011    2   udp    875  rquotad
    19     100011    1   tcp    875  rquotad
    20     100011    2   tcp    875  rquotad
    21     100005    1   udp  11473  mountd
    22     100005    1   tcp  62369  mountd
    23     100005    2   udp  17528  mountd
    24     100005    2   tcp  47308  mountd
    25     100005    3   udp  11312  mountd
    26     100005    3   tcp  51724  mountd
    27     100003    2   tcp   2049  nfs
    28     100003    3   tcp   2049  nfs
    29     100003    4   tcp   2049  nfs
    30     100227    2   tcp   2049  nfs_acl
    31     100227    3   tcp   2049  nfs_acl
    32     100003    2   udp   2049  nfs
    33     100003    3   udp   2049  nfs
    34     100003    4   udp   2049  nfs
    35     100227    2   udp   2049  nfs_acl
    36     100227    3   udp   2049  nfs_acl
    37     100021    1   udp  25181  nlockmgr
    38     100021    3   udp  25181  nlockmgr
    39     100021    4   udp  25181  nlockmgr
    40     100021    1   tcp  20093  nlockmgr
    41     100021    3   tcp  20093  nlockmgr
    42     100021    4   tcp  20093  nlockmgr

    CentOS 7.x 启动方式

     1 [root@nginx_cdn ~]# systemctl start nfs.service 
     2 [root@nginx_cdn ~]# rpcinfo -p localhost 
     3    program vers proto   port  service
     4     100000    4   tcp    111  portmapper
     5     100000    3   tcp    111  portmapper
     6     100000    2   tcp    111  portmapper
     7     100000    4   udp    111  portmapper
     8     100000    3   udp    111  portmapper
     9     100000    2   udp    111  portmapper
    10     100024    1   udp  44741  status
    11     100024    1   tcp  23203  status
    12     100005    1   udp  20048  mountd
    13     100005    1   tcp  20048  mountd
    14     100005    2   udp  20048  mountd
    15     100005    2   tcp  20048  mountd
    16     100005    3   udp  20048  mountd
    17     100005    3   tcp  20048  mountd
    18     100003    3   tcp   2049  nfs
    19     100003    4   tcp   2049  nfs
    20     100227    3   tcp   2049  nfs_acl
    21     100003    3   udp   2049  nfs
    22     100003    4   udp   2049  nfs
    23     100227    3   udp   2049  nfs_acl
    24     100021    1   udp  48638  nlockmgr
    25     100021    3   udp  48638  nlockmgr
    26     100021    4   udp  48638  nlockmgr
    27     100021    1   tcp  16146  nlockmgr
    28     100021    3   tcp  16146  nlockmgr
    29     100021    4   tcp  16146  nlockmgr

    加入开始自启动

    CentOS 5.x 和 CentOS 6.x 环境

    使用 /etc/rc.local

    1 [root@nfs01 ~]# tail /etc/rc.local    
    2 # You can put your own initialization stuff in here if you don't
    3 # want to do the full Sys V style init stuff.
    4 
    5 touch /var/lock/subsys/local
    6 
    7 # start rpc and nfs server
    8 /etc/init.d/rpcbind start
    9 /etc/init.d/nfs start

    使用chkconfig

    1 [root@nfs01 ~]# chkconfig rpcbind on    
    2 [root@nfs01 ~]# chkconfig nfs on    
    3 [root@nfs01 ~]# ls /etc/rc.d/rc3.d/* | grep -E 'rpc|nfs'  
    4 /etc/rc.d/rc3.d/K61nfs-rdma
    5 /etc/rc.d/rc3.d/K69rpcsvcgssd
    6 /etc/rc.d/rc3.d/S13rpcbind
    7 /etc/rc.d/rc3.d/S14nfslock
    8 /etc/rc.d/rc3.d/S19rpcgssd
    9 /etc/rc.d/rc3.d/S30nfs

    查看rpc服务和NFS服务的开机启动顺序

     1 [root@nfs01 ~]# head /etc/init.d/rpcbind 
     2 #! /bin/sh
     3 #
     4 # rpcbind       Start/Stop RPCbind
     5 #
     6 # chkconfig: 2345 13 87                    #运行级别  开机顺序  关机顺序【其中 2345 指的是 运行级别】
     7 # description: The rpcbind utility is a server that converts RPC program 
     8 #              numbers into universal addresses. It must be running on the 
     9 #              host to be able to make RPC calls on a server on that machine.
    10 #
    11 # processname: rpcbind
    12 [root@nfs01 ~]# head /etc/init.d/nfs    
    13 #!/bin/sh
    14 #
    15 # nfs           This shell script takes care of starting and stopping
    16 #               the NFS services.
    17 #
    18 # chkconfig: - 30 60
    19 # description: NFS is a popular protocol for file sharing across networks.
    20 #              This service provides NFS server functionality, which is 
    21 #              configured via the /etc/exports file.
    22 # probe: true

    CentOS 7.x 环境

    1 [root@nginx_cdn ~]# systemctl enable rpcbind.service 
    2 [root@nginx_cdn ~]# systemctl enable nfs.service

    查看具体状态情况

    1 [root@nginx_cdn ~]# systemctl status rpcbind.service 
    2 ● rpcbind.service - RPC bind service
    3    Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
    4 ………………
    5 [root@nginx_cdn ~]# systemctl status nfs.service 
    6 ● nfs-server.service - NFS server and services
    7    Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
    8 ………………

    查看有哪些参数生效

    1 [root@nfs01 ~]# cat /var/lib/nfs/etab 
    2 /data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

    参数说明:
    ro:只读设置,这样 NFS 客户端只能读、不能写(默认设置);
    rw:读写设置,NFS 客户端可读写;
    sync:将数据同步写入磁盘中,效率低,但可以保证数据的一致性(默认设置);
    async:将数据先保存在内存缓冲区中,必要时才写入磁盘;如果服务器重新启动,这种行为可能会导致数据损坏,但效率高;
    root_squash:当客户端用 root 用户访问该共享文件夹时,将 root 用户映射成匿名用户(默认设置);
    no_root_squash:客户端的 root 用户不映射。这样客户端的 root 用户与服务端的 root 用户具有相同的访问权限,这可能会带来严重的安全影响。没有充分的理由,不应该指定此选项;
    all_squash:客户端所有普通用户及所属组都映射为匿名用户及匿名用户组;「推荐设置」
    no_all_squash:客户端所有普通用户及所属组不映射(默认设置);
    subtree_check:如果共享,如:/usr/bin之类的子目录时,强制NFS检查父目录的权限;
    no_subtree_check:即使共享 NFS 服务端的子目录时,nfs服务端也不检查其父目录的权限,这样可以提高效率(默认设置);
    secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
    insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
    wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
    no_wdelay:若有写操作则立即执行,当使用async时,无需此设置;
    anonuid=xxx:将远程访问的所有用户主都映射为匿名用户主账户,并指定该匿名用户主为本地用户主(UID=xxx);
    anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组为本地用户组(GID=xxx);

    检查是否成功

    1 [root@nfs01 ~]# showmount -e 172.16.1.31  # 其中 172.16.1.31 为 NFS 服务端IP 
    2 Export list for 172.16.1.31:
    3 /data 172.16.1.0/24

    NFS客户端配置

    启动rpcbind服务

    CentOS 5.x 和 CentOS 6.x 环境

    1 [root@web01 ~]# /etc/init.d/rpcbind start        
    2 Starting rpcbind:                                          [  OK  ]

    CentOS 7.x 环境

    1 [root@nginx_proxy01 ~]# systemctl start rpcbind.service

    检查共享信息

    1 [root@web01 ~]# showmount -e 172.16.1.31    
    2 Export list for 172.16.1.31:
    3 /data 172.16.1.0/24

    NFS挂载

    2台机器都挂载 NFS,好用于后面的测试。

    1 [root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt

    查看挂载信息

    查询方式1

    1 [root@web01 ~]# df -h        #有时可能会被卡主
    2 Filesystem         Size  Used Avail Use% Mounted on
    3 /dev/sda3          8.8G  1.5G  6.9G  18% /
    4 tmpfs              495M     0  495M   0% /dev/shm
    5 /dev/sda1          190M   40M  141M  23% /boot
    6 172.16.1.31:/data  8.8G  1.5G  6.9G  18% /mnt

    查询方式2

     1 [root@web01 ~]# cat /proc/mounts                     # 优先使用,监控时使用该命令
     2 rootfs / rootfs rw 0 0
     3 proc /proc proc rw,relatime 0 0
     4 sysfs /sys sysfs rw,relatime 0 0
     5 devtmpfs /dev devtmpfs rw,relatime,size=490920k,nr_inodes=122730,mode=755 0 0
     6 devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
     7 tmpfs /dev/shm tmpfs rw,relatime 0 0
     8 /dev/sda3 / ext4 rw,relatime,barrier=1,data=ordered 0 0
     9 /proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
    10 /dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
    11 none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
    12 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
    13 172.16.1.31:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.8,minorversion=0,local_lock=none,addr=172.16.1.31 0 0

    测试

    在客户端和服务端之间测试
    「2个客户端,1个服务端」

    1、任意客户端创建文件夹或创建文件并且输入数据,在服务端是否可以查看;

    2、服务端创建文件夹或创建文件并且输入数据,在任意客户端是否可以查看;

    3、在客户端A 删除客户端B 创建的文件

    4、在客户端B 删除客户端A 创建的文件

    加入开机自启动

    如果是 CentOS 7 环境,那么必须保证 /etc/rc.d/rc.local 文件具有可执行权限,否则该脚本不会执行也不会生效。

    开机自启动方式1

    1 [root@web01 mnt]$ ll /etc/rc.local 
    2 lrwxrwxrwx. 1 root root 13 Nov 14  2018 /etc/rc.local -> rc.d/rc.local
    3 [root@web01 mnt]# tail -3 /etc/rc.local    
    4 
    5 # mount nfs
    6 mount -t nfs 172.16.1.31:/data /mnt

    开机自启动方式2

    1 [root@web01 mnt]$ cat /etc/fstab 
    2 # 添加如下信息
    3 172.16.1.31:/data                        /mnt   nfs   defaults   0 0

    存在问题

    加入了开机自启动,当重启 NFS 客户端机器时,如果此时 NFS 服务端机器已关机,或者网络存在问题等等。使 NFS 客户端连接 NFS 服务端失败,那么此时会造成 NFS 客户端机器起不来的情况。

    因此为了避免该情况发生,不建议机器开机自启动就挂载 NFS。

    如果一台机器必须挂载 NFS,那么我们就做好监控。当该机器未挂载 NFS 时就告警给我们,然后我们去手动挂载。

    当然如果实际环境中你们的 NFS 服务极其稳定,且几乎不再改变 NFS 服务端地址,那么此时你也可以加入开机自启动。

    这些都是根据实际具体情况具体分析的。


     如果觉得不错就点个赞呗 (-^O^-) !

    ———END———-

  • 相关阅读:
    php第九节课
    php第八节课
    php第七节课
    php第六讲
    php第五节课
    php第四节课
    php第三节课
    Golang Slice切片
    Golang 反射
    Golang 流程控制
  • 原文地址:https://www.cnblogs.com/zhanglianghhh/p/9230045.html
Copyright © 2011-2022 走看看