zoukankan      html  css  js  c++  java
  • Linux下NFS配置及远程挂载

    NFS配置及远程挂载

    NFS简介
      NFS是Network File System的简写,即网络文件系统。NFS最早是由 Sun Microsystems 公司开发,并于1984年推出。NFS 是一种可分散式的网络文件系统,可以通过网络(一个局域网)使不同的机器、不同的操作系统,能够共享目录和文件,使客户端能通过网络访问并分享文件到位于服务端的磁盘中。NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
      NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和linux的samba服务类似,只不过一般情况下,Windows网络共享服务或samba服务用户办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,若是大型网站,那么有可能还会用到更复杂的分布式文件系统Moosefs(mfs)、GlusterFS。NFS在文件传送或信息传送过程中依赖于RPC协议。RPC负责负责信息的传输。

    一、环境和需求
    环境:CentOS 7.5 ,安装过程中software selection选择Minimal install;
    软件版本:nfs-utils-1.3.0-0.54.el7.x86_64

    共三台主机,每台主机各挂接有一个4TB数据盘,挂载点在/data1;
    主机名:HOST1,IP:192.168.1.11
    主机名:HOST2,IP:192.168.1.12
    主机名:HOST3,IP:192.168.1.13

    需求:解决多台服务器之间数据盘的内容相互共享

    二、服务器校准时间

    1、登陆到服务器后,用命令查看当前时区:
    date -R
    命令执行结果如下:
    Fri, 02 Mar 2019 14:19:41 +0800

    如果显示是+0800,就是北京时间;

    2、更改时区的办法。如果不是北京时间,则用以下方法修改为北京时区:(如果不是root用户,则加上sudo)
    先把时区文件备份,命令执行如下:
    mv /etc/localtime /etc/localtime.old

    将正确的时区文件链接过来:
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    再用命令查看当前时区:
    date -R

    3 、如果ntp服务并未安装,则先安装后再执行上述命令:
    yum install -y ntp

    4、开启ntp同步命令:
    systemctl enable ntpd
    systemctl start ntpd

    5、允许同步硬件时间:
    在/etc/sysconfig/ntpd最后一行加
    SYNC_HWCLOCK=yes

    三、服务器的NFS服务端配置

    1、检查nfs软件是否安装

    sudo rpm -qa | grep nfs-utils
    sudo rpm -qa | grep rpcbind

    安装nfs组件,已安装的跳过;服务端和客户端需要的环境一样

    sudo yum -y install nfs-utils
    sudo yum -y install rpcbind

    2、根据需要修改NFS的配置文件 /etc/exports (默认是空文件),此处要注意三台服务器开放的ip限制有区别,除了exports文件外,其他配置完全一样;

     sudo vi /etc/exports
     #主机HOST1增加以下一行内容
     /data1 192.168.1.12(rw,sync) 192.168.1.13(rw,sync)

    sudo vi /etc/exports 
    #主机HOST2增加以下一行内容 /data1 192.168.1.11(rw,sync) 192.168.1.13(rw,sync) #主机HOST3增加以下一行内容 /data1 192.168.1.11(rw,sync) 192.168.1.12(rw,sync)

    3、配置端口

    默认设置中 nfs 端口是2049,portmapper 的端口是111,mountd 端口是20048,status 和 nlockmgr 是随机端口。如需进行防火墙开放端口的设置,修改如下,否则跳过:
    修改 /etc/sysconfig/nfs 文件

    sudo vi /etc/sysconfig/nfs
    #增加端口配置如下一行,对应 rpc.statd 服务,显示status
    STATD_PORT=2050

    因 nfslock 服务会自动开启 rpc.statd,无需做设置;在rpcinfo -p 映射中,rpc.statd 对应 status ,后续再次修改端口后重启服务使配置生效的

    sudo systemctl restart nfs-lock

    修改 /etc/modprobe.d/lockd.conf 文件。Network Lock Manager (NLM),对应是 nlockmgr

    sudo vi /etc/modprobe.d/lockd.conf 
    #增加端口配置如下两行
    options lockd nlm_tcpport=2051
    options lockd nlm_udpport=2051

    4、开启NFS服务,设置服务开机自启动,按顺序先 rpcbind 后 nfs

    sudo systemctl start rpcbind.service
    sudo systemctl start nfs.service
    sudo systemctl enable rpcbind.service
    sudo systemctl enable nfs.service

    sudo systemctl start rpcbind nfs-server
    sudo systemctl enable rpcbind nfs-server

    查看共享是否成功

    showmount -e localhost

    或用exportfs -arv命令,重新使配置文件生效,并显示生效内容 

    sudo exportfs -arv

     查看服务对应端口的命令

    rpcinfo -p

    5、防火墙设置
    查看防火墙是否在运行

    sudo firewall-cmd --state

    显示 running 则加上放行规则,否则跳过

    sudo firewall-cmd --permanent --add-port=111/tcp
    sudo firewall-cmd --permanent --add-port=111/udp
    sudo firewall-cmd --permanent --add-port=2049-2051/tcp
    sudo firewall-cmd --permanent --add-port=2049-2051/udp
    sudo firewall-cmd --permanent --add-port=20048/tcp
    sudo firewall-cmd --permanent --add-port=20048/udp
    sudo firewall-cmd --reload

    待验证

    sudo firewall-cmd --add-service=nfs --permanent
    sudo firewall-cmd --reload

    四、服务器的NFS客户端配置

    1、创建挂载目录(三台客户端各有不同)

    #HOST1的挂载目录
    sudo ln -s /data1 /data1_11
    sudo mkdir /data1_12
    sudo mkdir /data1_13
    
    #HOST2的挂载目录
    sudo ln -s /data1 /data1_12
    sudo mkdir /data1_11
    sudo mkdir /data1_13
    
    #HOST3的挂载目录
    sudo ln -s /data1 /data1_13
    sudo mkdir /data1_11
    sudo mkdir /data1_12

    2、客户端远程目录的挂载,将挂载配置写入fstab文件(三台客户端各有不同)

    sudo vi /etc/fstab
    
    #HOST1的fstab文件加上
    192.168.1.12:/data1  /data1_12                  nfs     defaults     0 0
    192.168.1.13:/data1  /data1_13                  nfs     defaults     0 0
    
    #HOST2的fstab文件加上
    192.168.1.11:/data1  /data1_11                  nfs     defaults     0 0
    192.168.1.13:/data1  /data1_13                  nfs     defaults     0 0
    
    #HOST3的fstab文件加上
    192.168.1.11:/data1  /data1_11                  nfs     defaults     0 0
    192.168.1.12:/data1  /data1_12                  nfs     defaults     0 0

    3、在客户端分别执行,让修改fstab后的挂载生效,

    sudo mount -a

    至此,NFS配置已经完成,如打开共享目录写入报错 Permission denied ,请根据需求和安全原则修正对应源目录写入的权限(详见下面补充说明)


    五、其他补充说明(安装过程或完成后检测用到的命令、知识点)

    1、NFS服务需要安装的软件包

    nfs-utils:nfs服务的主程序,包括rpc.nfsd、rpc.mountd两个daemons和相关的文档说明及执行命令文件等
    rpcbind:rpc主程序,安装 nfs-utils 时会自动按依赖安装上,无需另外安装

    在安装完 nfs-utils 后会自动创建 nfsnobody 用户

    [root@localhost ~]# id nfsnobody
    uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

    2、查NFS服务是否在运行

    sudo  systemctl status rpcbind
    sudo systemctl status nfs

    3、查看NFS版本

    服务器端使用:nfsstat -s

    客户端使用:nfsstat -c

    4、查看主机开放的端口
    ss命令的使用见:https://www.cnblogs.com/ylnic/p/10065344.html

    [wangzhiping@localhost /]$ ss -lutp4
    Netid  State      Recv-Q Send-Q           Local Address:Port                            Peer Address:Port                
    udp    UNCONN     0      0                            *:mountd                                     *:*                    
    udp    UNCONN     0      0                    127.0.0.1:703                                        *:*                    
    udp    UNCONN     0      0                            *:856                                        *:*                    
    udp    UNCONN     0      0                            *:nfs                                        *:*                    
    udp    UNCONN     0      0                            *:av-emb-config                              *:*                    
    udp    UNCONN     0      0                            *:epnsdp                                     *:*                    
    udp    UNCONN     0      0                            *:sunrpc                                     *:*                    
    tcp    LISTEN     0      64                           *:nfs                                        *:*                    
    tcp    LISTEN     0      128                          *:av-emb-config                              *:*                    
    tcp    LISTEN     0      64                           *:epnsdp                                     *:*                    
    tcp    LISTEN     0      128                          *:sunrpc                                     *:*                    
    tcp    LISTEN     0      128                          *:mountd                                     *:*                    
    tcp    LISTEN     0      128                          *:ssh                                        *:*                    
    tcp    LISTEN     0      100                  127.0.0.1:smtp                                       *:*                    
    [wangzhiping@localhost /]$ ss -lutp4n
    Netid  State      Recv-Q Send-Q             Local Address:Port                            Peer Address:Port              
    udp    UNCONN     0      0                              *:20048                                      *:*                  
    udp    UNCONN     0      0                      127.0.0.1:703                                        *:*                  
    udp    UNCONN     0      0                              *:856                                        *:*                  
    udp    UNCONN     0      0                              *:2049                                       *:*                  
    udp    UNCONN     0      0                              *:2050                                       *:*                  
    udp    UNCONN     0      0                              *:2051                                       *:*                  
    udp    UNCONN     0      0                              *:111                                        *:*                  
    tcp    LISTEN     0      64                             *:2049                                       *:*                  
    tcp    LISTEN     0      128                            *:2050                                       *:*                  
    tcp    LISTEN     0      64                             *:2051                                       *:*                  
    tcp    LISTEN     0      128                            *:111                                        *:*                  
    tcp    LISTEN     0      128                            *:20048                                      *:*                  
    tcp    LISTEN     0      128                            *:22                                         *:*                  
    tcp    LISTEN     0      100                    127.0.0.1:25                                         *:*       

    5、查看 rpc 的端口映射

    [nfs_user@localhost /]$ 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
        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   2050  status
        100024    1   tcp   2050  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   2051  nlockmgr
        100021    3   udp   2051  nlockmgr
        100021    4   udp   2051  nlockmgr
        100021    1   tcp   2051  nlockmgr
        100021    3   tcp   2051  nlockmgr
        100021    4   tcp   2051  nlockmgr

    6、NFS的常用目录

    文件目录用途
    /etc/exports NFS服务的主要配置文件,系统并没有默认值,是空文件,如这个文件不存在,需要自己创建
    /usr/sbin/exportfs NFS服务的管理命令
    /usr/sbin/showmount 客户端的查看命令
    /var/lib/nfs/etab 记录NFS分享出来的目录的完整权限设定值,即服务器配置的参数(包含默认的参数)
    /var/lib/nfs/xtab 记录曾经登录过的客户端信息

    NFS的配置文件:
    /etc/exports:NFS配置文件
    /var/lib/nfs/*tab:NFS服务器日志放置路径;etab记录共享出来的目录完整权限设置值;xtab记录曾经连接到此NFS主机的相关客户端数据

    NFS的两个命令:
    /usr/sbin/exportfs:维护NFS共享资源;重新共享/etc/exports变更目录或将NFS server共享目录卸载或重新共享
    /usr/sbin/showmount:在客户端查看NFS服务器共享出来的目录资源

    7、NFS的主要配置文件 /etc/exports 的内容格式

    <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
    a. 输出目录:
    输出目录是指NFS系统中需要共享给客户机使用的目录;
    
    b. 客户端:
    客户端是指网络中可以访问这个NFS输出目录的计算机
    
    客户端常用的指定方式
        指定ip地址的主机:192.168.0.200
        指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
        指定域名的主机:david.bsmart.cn
        指定域中的所有主机:*.bsmart.cn
        所有主机:*
    
    c. 选项:
    选项用来设置输出目录的访问权限、用户映射等。
    
    NFS主要有3类选项:
    访问权限选项
        设置输出目录只读:ro
        设置输出目录读写:rw
    
    用户映射选项
        all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
        no_all_squash:与all_squash取反(默认设置);
        root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
        no_root_squash:与rootsquash取反;
        anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
        anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
    
    其它选项
        secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
        insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
        sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
        async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
        wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
        no_wdelay:若有写操作则立即执行,应与sync配合使用;
        subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
        no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

    例如

    / user01(rw) user02(rw,no_root_squash)

    表示共享服务器上的根目录(/)只有user01和user02两台主机可以访问,且有读写权限;user01主机用root用户身份访问时,将客户机的root用户映射成服务器上的匿名用户(root_squash,该参数为缺省参数),相当于在服务器使用nobody用户访问目录;user02主机用root用户身份访问该共享目录时,不映射root用户(no_root_squash),即相当于在服务器上用root身份访问该目录。在配置文件中,使用了no_root_squash ,所以root用户不受约束,在 user02 机器上到挂载点下,到共享目录下,就可以像在本地磁盘使用root用户一样,是不受限制的(通常情况下,不限制root用户的比较多,要注意安全问题)

    /root/share/ 192.168.1.2(rw,insecure,sync,all_squash)

    表示共享服务器上的/root/share/目录只有192.168.1.2主机可以访问,且有读写权限;此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用nobody用户访问该目录(若客户机要在该共享目录上保存文件(即写操作),则服务器上的nobody用户对该目录必须有写的权限)

    /home/ylw/ *.test.com (rw,insecure,sync,all_squash)

    表示共享/home/ylw/目录,*.test.com域中所有的主机都可以访问该目录,且有读写权限

    /home/share/ .test.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4)

    表示共享目录/home/share/,*.test.com域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的uid为zh3、gid为wa4的用户

    8、exportfs命令详解

    • exportfs命令和nfs-utils这个包一起安装的
    • 例子:
      • 假设在第一次配置 nfs 的共享目录,之后需要新增、更改某些机器或共享的目录;
      • 首先需要更改配置文件,然后重启NFS服务,但如果远程客户端正在使用NFS服务,正在挂载着,如果你需要先停止nfs服务,那远程的客户端就会挂起,就会很大的影响,造成服务异常,进程异常,有很大可能导致系统坏掉
    • nfs服务不能随便重启,要重启,就需要先去服务器上,把挂载的目录卸载下来
      • 在卸载目录的时候,若是在当前目录下去卸载会提示 umount.nfs4: /mnt: device is busy
        • 方法一:退出该目录后,再去卸载
        • 方法二:在目录下卸载的时候,加 -l 选项,表示 lazy 懒惰的意思
      • 在卸载目录后,在重启nfs服务
    • 若是挂载了很多台机器,那么每台机器都需要去卸载,就会很麻烦,降低了工作效率
      • 方法:使用exportfs命令,重新加载下

    • exportfs命令
      • -a 全部挂载或者全部卸载,全部挂载或卸载 /etc/exports中的内容 
      • -r 重新挂载,重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
      • -u 卸载某一个目录,和-a一起使用,是卸载所有/etc/exports文件中的目录
      • -v 显示共享目录,在export的时候,将详细的信息输出到屏幕上。

    例一、在NFS服务端上修改 /etc/exports ,增加某个共享目录后

    /share 192.168.10.0/24(rw,sync,root_squash)

    用 exportfs 不用重启nfs服务,使改动立刻生效

    sudo exportfs -arv 

    其他例子
    exportfs -au  #卸载所有共享目录
    exportfs -rv  #重新共享所有目录并输出详细信息

    9、showmount 命令用于查询NFS服务器

    Usage: showmount [-adehv]
            [--all] [--directories] [--exports]
            [--no-headers] [--help] [--version] [host] 
    -a或--all
        以 host:dir 这样的格式来显示客户主机名和挂载点目录。
     -d或--directories
        仅显示被客户挂载的目录名。
     -e或--exports
        显示NFS服务器的输出清单。
     -h或--help
        显示帮助信息。
     -v或--version
        显示版本信。
     --no-headers
        禁止输出描述头部信息。
    
    显示NFS客户端信息
     # showmount
    
    显示指定NFS服务器连接NFS客户端的信息
     # showmount 192.168.1.1  #此ip为nfs服务器的
    
    显示输出目录列表
     # showmount -e
    
    显示指定NFS服务器输出目录列表(也称为共享目录列表)
     # showmount -e 192.168.1.1
    
    显示被挂载的共享目录
     # showmount -d  
    
    显示客户端信息和共享目录
     # showmount -a
    
    显示指定NFS服务器的客户端信息和共享目录
    # showmount -a 192.168.1.1

    10、关于权限的分析

    1. 客户端连接时候,对普通用户的检查
      a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;
     b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;
     c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;
    
    2. 客户端连接的时候,对root的检查
     a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;
     b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;
     c. 如果没有明确指定,此时root用户被压缩为nfsnobody;
     d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;

    多个NFS客户端访问服务器的读写文件时必须要有的权限
      a、NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限
      b、NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限
      c、每台服务器都对应存在和NFS默认配置UID的相同UID的账户nfsnodoby(确保所有所有客户端的访问权限统一,否则每台机器都需要同时建立相同UID用户,并覆盖NFS的默认用户配置)
    只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中最为集群共享存储时尤为重要

    11、客户端手动挂载

    挂载命令挂载的格式类型NFS服务器提供的共享目录NFS客户端的挂载点
    mount -t nfs 172.16.1.31:/data /mnt (该目录必须存在)


    创建挂载点

    sudo mkdir /data1_11

    挂载NFS,默认情况下只有 root 可以去挂载,普通用户可以执行sudo

    sudo mount -t nfs 192.168.1.11:/data1 /data1_11

    挂载成功后,可用如下命令查看

    sudo df -Th

    如需卸载nfs,命令如下

    sudo umount /data1_11

    sudo umount 192.168.1.11:/data1


    12、配置挂载 autofs(待测试确认)

    # yum -y install autofs
    # vi /etc/auto.master
    #添加一行
    /-    /etc/auto.mount
    # vi /etc/auto.mount
    #添加一行
    /data1 -fstype=nfs,rw  nfs.st.local:/data1_11
    
    #启动服务
    # systemctl start autofs 
    # systemctl enable autofs 

    参考:

    Red Hat Enterprise Linux fully supports NFS version 4.2 (NFSv4.2) since the Red Hat Enterprise Linux 7.4 release.Following are the features of NFSv4.2 in Red Hat Enterprise Linux 7.5
    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-nfs

    https://blog.csdn.net/gx_1_11_real/article/details/82622391
    http://blog.51cto.com/lzhnb/2086392
    https://www.cnblogs.com/st-jun/p/7742560.html
    https://blog.csdn.net/wh211212/article/details/52954961

  • 相关阅读:
    Java架构师成长直通车百度云
    java架构师直通车百度云
    java架构师成长直通车
    初级Java程序员需要掌握哪些主流技术
    JAVA互联网架构师专题/分布式/高并发/微服务之咕泡学院学习笔记
    java架构师学习之路
    新手都能学懂的SpringBoot
    2020新版python最新就业班项目实战教程(完整)
    35个jQuery小技巧!
    web知识总结
  • 原文地址:https://www.cnblogs.com/ylnic/p/10044271.html
Copyright © 2011-2022 走看看