概述

nfs(Network File System)网络文件系统,它允许网络中的计算机直接通过TCP/IP网络共享资源。
在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
服务主要用来服务arfa的日志下载和arfa执行日志记录

nfs分成服务器端和客户端配置
当前nfs 服务器配置在tw071036 web server master
客户端安装有: tw071037 web server slave
tw071029 az excutor
tw071030 az excutor
tw071031 az excutor
tw071032 az excutor

一、服务器部署文档

  1. 检查系统是否已安装nfs, rpcbink
    rpm -qa|grep nfs
    rpm -qa|grep rpcbind

  2. 安装nfs,rpcbind
    yum -y install nfs-utils rpcbind
    NFS的RPC服务器,Centos5下名字为portmap,CentOS6和CentOS7下名称为rcpbind
    NFS软件包
    nfs-utils:NFS主程序,包含rpc.nfsd rpc.mount两个deamons
    rpcbind:RPC主程序

  3. 创建存放文件的共享目录
    mkdir /usr/local/services/arfa_nfs #因为这个目录放在了ssd盘上面
    chown -R nobody:nobody #设置权限,允许nobody用户访问

  4. 编辑/ets/hosts.allow,允许外部程序可以访问
    增加如下内容:

    1
    2
    3
    4
    
    #nfs config
    all:127.0.0.1
    rpcbind: ALL :allow
    mountd: ALL :allow
    
  5. 编辑/etc/netconfig配置文件,注释掉udp6,tcp6行,禁用ip6,如下:

    1
    2
    
    #udp6       tpi_clts      v     inet6    udp     -       -
    #tcp6       tpi_cots_ord  v     inet6    tcp     -       -
    
  6. 编辑配置文件/etc/exports,设置共享目录,权限,用户,增加如下:

    1
    
    /usr/local/services/arfa_nfs 10.0.0.0/8(rw,sync,all_squash,anonuid=99,anongid=99)
    

    ———-下面是各个内容的详细解释———–
    格式:共享目录 指定共享对象(共享参数)
    对于上面的配置,解释如下:
    /usr/local/services/arfa_nfs 共享目录
    10.0.0.0/8 共享机器的访问权限
    rw:读写
    ro:只读
    sync: 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
    async:是大数据时使用,是先写到缓存区,必要时再写到磁盘里。
    all_squash:所有访问用户都映射为匿名用户或用户组;
    no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
    root_squash(默认):将来访的root用户映射为匿名用户或用户组;
    no_root_squash:来访的root用户保持root帐号权限;
    wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
    no_wdelay:若有写操作则立即执行,应与sync配合使用;
    subtree_check :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
    no_subtree_check(默认):即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
    anonuid anongid anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!
    当然,这个 UID 必需要存在于你的 /etc/passwd 当中!
    anonuid 指的是 UID 而 anongid 则是群组的 GID 啰 99 是nobody用户的uid和gid,可以使用id nobody命令查看
    ————解释含义完成——————

    exportfs -r 配置生效

  7. 配置服务端口号,编辑文件/etc/sysconfig/nfs

    1
    2
    3
    4
    5
    
    RQUOTAD_PORT=30001
    LOCKD_TCPPORT=30002
    LOCKD_UDPPORT=30002
    MOUNTD_PORT=30003
    STATD_PORT=30004  
    

    30001 是 rpc.rquotad
    30002 是 nlockmgr块管理
    30003 是 rpc.mountd
    111端口是 rpcbind的端口portmapper管理
    2049端口是 nfs,nfs_acl管理

  8. iptables配置,允许防火墙访问,编辑配置文件/etc//sysconfig/iptables

    1
    2
    3
    4
    5
    6
    
    -A RH-Firewall-1-INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 111 -j ACCEPT 
    -A RH-Firewall-1-INPUT -s 10.0.0.0/8 -p udp -m udp --dport 111 -j ACCEPT
    -A RH-Firewall-1-INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 2049 -j ACCEPT
    -A RH-Firewall-1-INPUT -s 10.0.0.0/8 -p udp -m udp --dport 2049 -j ACCEPT
    -A RH-Firewall-1-INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 30001:30004 -j ACCEPT
    -A RH-Firewall-1-INPUT -s 10.0.0.0/8 -p udp -m udp --dport 30001:30004 -j ACCEPT
    

    ——————重启防火墙,使配置生效——————-
    service iptables restart

  9. 注意先启动rpcbind再启动nfs,
    启动rpcbind服务:
    service rpcbind start

  10. 启动nfs服务
    service nfs restart

  11. 查看RPC服务注册状态
    rpcinfo -p localhost
    输出如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    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
    100011    1   udp  30001  rquotad
    100011    2   udp  30001  rquotad
    100011    1   tcp  30001  rquotad
    100011    2   tcp  30001  rquotad
    100005    1   udp  30003  mountd
    100005    1   tcp  30003  mountd
    100005    2   udp  30003  mountd
    100005    2   tcp  30003  mountd
    100005    3   udp  30003  mountd
    100005    3   tcp  30003  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  30002  nlockmgr
    100021    3   udp  30002  nlockmgr
    100021    4   udp  30002  nlockmgr
    100021    1   tcp  30002  nlockmgr
    100021    3   tcp  30002  nlockmgr
    100021    4   tcp  30002  nlockmgr
    
  12. 显示挂载信息 showmount -e localhost
    输出如下:
    /usr/local/services/arfa_nfs 10.0.0.0/8

  13. 配置开机启动:
    chkconfig rpcbind on
    chkconfig nfs on

二、客户端配置

  1. 安装客户端
    yum -y install nfs-utils
  2. 创建目录
    mkdir -p /data/arfa_nfs
  3. 挂载目录
    mount -t nfs 10.65.9.136:/usr/local/services/arfa_nfs /data/arfa_nfs -o proto=tcp -o nolock
  4. 卸载nfs配置
    umount /data/arfa_nfs
  5. 查看nfs的磁盘挂载信息
    df -h
    1
    2
    3
    4
    5
    6
    7
    8
    
    ---------------客户端挂载参数说明----------------------
    noatime       不更新文件的inode访问时间戳,文件很多时此参数可以提高效率。
    nodiratime    不更新目录的访问时间戳,同上。
    nosuid         关闭挂载目录的suid
    noexec         不允许执行二进制文件。shell脚本无法直接使用,但是用sh  xxx.sh依然可以调用。
    rsize          系统每次读取的最大字节,centos6.5默认131072,此参数过小会影响系统的I/O效率.
    wsize          系统每次写入的最大字节,同上
    defaults       使用默认的选项。默认选项为rw、suid、dev、exec、anto  nouser与async。 
    
  6. 查看nfs状态:
    服务端 nfsstat -s
    客户端 nfsstat -m
  7. 开启nfs调试日志,日志保存在/var/log/message
    服务端 rpcdebug -m nfs -s all
    客户端 rpcdebug -m nfsd -s all
    关闭nfs调试功能:
    服务端 rpcdebug -m nfs -s all
    客户端 rpcdebug -m nfsd -s all

三、 因为arfa需要web端执行测试,所以需要用nobody ssh到其他机器上面,nobody用户需要有登陆权限,
前提需要关闭所有使用nobody用户端进程
mkdir -p /home/nobody
chown -R nobody.nobody /home/nobody/
usermod -s /bin/bash -d /home/nobody/ nobody
ssh-keygen -t rsa

四、 nfs原理
既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口, NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。
因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口。

  1. RPC与NFS如何通讯
    因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。

  2. RPC是如何知道每个NFS功能端端口呢?
    首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。
    如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。 提示:在启动NFS SERVER之前,首先要启动RPC服务(即rpcbind服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,
    直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。

  3. NFS客户端和NFS服务端通讯端过程
    (1) 首先服务器端启动RPC服务,并开启111端口
    (2) 服务器端启动NFS服务,并向RPC注册端口信息
    (3) 客户端启动RPC(rpcbind)服务器,向服务端RPC(rpcbind) 服务请求服务端NFS端口
    (4) 服务端端RPC(rpcbind)服务反馈NFS端口信息给客户端
    (5) 客户端通过获取端NFS端口来建立和服务端的NFS连接并进行数据的传输

tw1

tw1