Linux之NFS

目录

简介

  1. NFS 是 Network File System 的缩写,即网络文件系统。功能是让客户端通过网络访问不同主机上磁盘里的数据,主要用在类Unix系统上实现文件共享的一种方法
  2. NFS 的基本原则是容许不同的客户端及服务端通过一组RPC分享相同的文件系统,容许不同硬件及操作系统的系统共同进行文件的分享。
  3. NFS在文件传送或信息传送过程中依赖于RPC协议

NFS Server安装与配置

  1. 查看系统

    $ cat /etc/redhat-release
    CentOS Linux release 7.9.2009 (Core)
    
  2. 机器准备

    名称 IP 描述
    Server 10.100.22.160 服务端
    Client 10.100.22.161 客户端
  3. 服务端安装:在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的

    $ yum install nfs-utils -y
    # 设置开机启动
    $ systemctl enable nfs
    $ systemctl enable rpcbind
    # 启动
    $ systemctl start rpcbind
    $ systemctl start nfs
    # 查看NFS开放的端口
    $ netstat -tulnp| grep -E '(rpc|nfs)'
    
  4. 服务端配置:主要配置文件时/etc/exports

    # 配置一个共享目录
    $ mkdir -p /home/data/nfs
    $ chmod 755 /home/data/nfs
    # 设置导出目录
    $ vim /etc/exports
    /home/data/nfs     10.100.22.0/24(rw,sync,no_root_squash,no_all_squash)
    # 重启nfs
    $ systemctl restart nfs
    # 检查一下服务端本地的共享目录
    $ showmount -e localhost
    Export list for localhost:
    /home/data/nfs 10.100.22.0/24
    
  5. /etc/exports配置说明

    • /home/data/nfs: 共享目录位置
    • 10.100.0.0/24: 客户端 IP 范围,* 代表所有,即没有限制
    • rw: 权限设置,可读可写
    • sync: 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
    • no_root_squash: 可以使用 root 授权
    • no_all_squash: 可以使用普通用户授权
  6. 如果重新处理/etc/exports,不需要重启NFS(如果重启nfs,要再向RPC注册)

    #  重新挂载一次 /etc/exports 的设定
    $ exportfs -arv
    
    # 将已经分享的 NFS 目录资源,通通都卸除
    $ exportfs -auv
    $ showmount -e localhost  看不到任何资源
    

NFS Server配置说明

  1. 主要配置文件:/etc/exports,配置文件并没有默认值,也不一定会存在此文件(需手动创建)。格式:<输出目录> [客户端1 选项(访问权限,用户映射,其他)]

    • 输出目录:NFS系统中需要共享给客户机使用的目录
    • 客户端:网络中可以访问这个NFS输出目录的计算机,指定方式
      • 指定ip地址的主机:192.168.0.200
      • 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
      • 指定域名的主机:david.bsmart.cn
      • 指定域中的所有主机:*.bsmart.cn
      • 所有主机:*
    • 选项:设置输出目录的访问权限、用户映射等
      • 访问权限选项:只读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服务器也不检查其父目录的权限,这样可以提高效率;
  2. NFS 文件系统维护指令:/usr/sbin/exportfs可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等

    选项与参数:
    -a :全部挂载(或卸除) /etc/exports 档案内的设定
    -r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports
         及 /var/lib/nfs/xtab 的内容!
    -u :卸除某一目录
    -v :在 export 的时候,将分享的目录显示到屏幕上!
    
  3. 分享资源的登录文件:/var/lib/nfs/*tab,NFS 服务器的登录文件都放置到此目录里面

  4. 客户端查询服务器分享资源的指令:/usr/sbin/showmount。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端

NFS Client安装与配置

  1. 查看系统

    $ cat /etc/redhat-release
    CentOS Linux release 7.9.2009 (Core)
    
  2. 安装,客户端不需要启动NFS服务

    $ yum install nfs-utils -y
    # 设置开机启动
    $ systemctl enable rpcbind
    # 启动
    $ systemctl start rpcbind
    # 查看服务端的共享目录
    $ showmount -e 10.100.22.160
    Export list for 10.100.22.160:
    /home/data/nfs 10.100.0.0/24
    # 创建客户端目录
    $ mkdir -p /home/client
    $ chmod 755 /home/client
    # 挂载目录
    $ mount -t nfs 10.100.22.160:/home/data/nfs /home/client
    # 卸载目录
    $ umount /home/client
    # 如果NFS Server宕机,需要强制卸载(umount:/mnt:device is busy)
    $ umount -lf /mnt
    
  3. 如果挂载出现错误,可以在服务端查看日志

    $ cat /var/log/messages | grep mount
    
  4. 测试NFS

    # 在客户端共享目录创建一个文件
    $ cd /home/client && touch a.txt
    # 在服务端
    $ cd /home/data/nfs && touch b.txt
    $ ll
    # 查看NFS的共享状态
    $ showmount -e 10.100.22.160
    Export list for 10.100.22.160:
    /home/data/nfs 10.100.22.0/24
    

客户端自动挂载

  1. 设置自动挂载方法一:缺点是可能偶尔开机挂载不上,除了开机自启动配置,还要对是否挂载进行监控。

    $ chmod +x /etc/rc.local
    $ echo "#mount by oldboy" >> /etc/rc.local
    $ echo "/bin/mount -t nfs nfs 10.100.22.160:/home/data/nfs /home/client" >> /etc/rc.local
    $ tail -2 /etc/rc.local
    
  2. 设置自动挂载方法二:理论上开机启动过程中,fstab会优先于网络被Linux系统加载。网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载。而且,即使是本地的文件系统,也要注意fstab中最后两列要设置0 0。否则有可能导致无法启动服务器的问题。因此,NFS网络文件系统最好不要放到fstab里实现开机挂载

    $ vim /etc/fstab
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=39bc8e0d-efbd-4915-ae40-83402394aedc /boot xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    # 末尾新增配置
    10.100.22.160:/home/data/nfs  /home/client      nfs     defaults        0 0
    
    $ systemctl daemon-reload
    查看
    $ mount
    ...省略...
    10.100.22.160:/home/data/nfs on /home/client type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.100.22.161,local_lock=none,addr=10.100.22.160)
    
    # 可以重启客户端,查看是否生效
    $ reboot
    $ df -h |grep /home/client
    10.100.22.160:/home/data/nfs   78G  357M   78G   1% /home/client
    
  3. NFS服务端宕机后给NFS客户端带来的问题,NFS服务器宕机后,在客户端访问挂载点会处于挂掉状态,甚至早期系统执行Ctrl+C都无法退出,CentOS7客户端还可能无法重启,这个问题的解决方法有以下几种

    • cat /proc/mounts |grep nfs找到挂载点,然后执行umount -lf /客户端目录方式卸载即可

    • 在mount挂载时增加soft或者intr,不让客户端持续呼叫NFS服务器。

    • 如果是fstab里实现的挂载即可在第4列defaults后面增加soft或者intr

      $ tail -2 /etc/fstab 
      10.100.22.160:/home/data/nfs  /home/client      nfs     defaults,soft       0 0
      #10.100.22.160:/home/data/nfs  /home/client      nfs     defaults,intr       0 0
      

客户端优化

  1. 查看挂载配置

    # 查看NFS服务器端配置参数的细节
    $ cat /var/lib/nfs/etab
    /home/data/nfs  10.100.22.0/24(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)
    # 查看客户端mount的挂载参数细节
    $ cat /proc/mounts |grep nfs	
    sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
    10.100.22.160:/home/data/nfs /home/client nfs4 rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.100.22.161,local_lock=none,addr=10.100.22.160 0 0
    
  2. mount参数说明

    • fg/bg:默认[fg],在客户端执行挂载时,可以选择在前台(fg)执行还是在后台(bg)执行
    • soft/hart:默认[hart]当网络和server出问题时,soft参数会在超时后停止挂载,hard参数会一直挂载直到成功(但可能造成客户端无响应,常配合intr参数使用)
    • intr:当hard挂载资源timeout后,若使用intr参数可在超时后终端挂载,防止NFS锁死
    • resize/wsize:读出和写入的区块大小,影响客户端与服务器段传输数据的缓冲存储量
    • proto=tcp:默认[tcp]传输使用的协议,跨internet建议tcp有较好的纠错能力,内网建议用udp提高性能
  3. 挂载建议

    noatime,nodiratime 减少更新访问时间戳产生的磁盘I/O.本地文件系统挂载时不能加odiratime选项,会报错
    $ mount -t nfs -o noatime,nodiratime,intr,rsize=131072,wsize=131072 \
    10.100.22.160:/home/data/nfs /home/client
    
  4. NFS内核优化

    cat >>/etc/sysctl.conf<<EOF
    net.core.wmem_dafault = 8388608
    net.core.rmem_dafault = 8388608
    net.core.wmem_max = 16777216
    net.core.rmem_max = 16777216
    EOF
    sysctl -p
    
  5. Linux NFS 客户端对于同时发起的NFS请求数量进行了控制,若该参数配置较小,会降低 IO 性能。默认系统为2,最大值为256。可以使用root用户执行以下命令来提高该参数的值,取得较好的性能。

    $ echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
    $ echo "options sunrpc tcp_max_slot_table_entries=128" >>  /etc/modprobe.d/sunrpc.conf
    $ sysctl -w sunrpc.tcp_slot_table_entries=128
    $ cat /proc/sys/sunrpc/tcp_slot_table_entries
    
上一篇:NFS


下一篇:NFS服务搭建