NFS就是Network File System的缩写,最大的功能就是可以通过网络让不同的机器、不同
的操作系统可以彼此共享文件(share files)
 既然NFS是通过网络来进行数据传输的,那么NFS应该会使用哪些端口?NFS使用哪个端口
来进行传输呢?NFS传输数据时使用的端口是随机选择的,唯一的限制小于1024,客户端怎么
知道服务器使用的是哪个端口?此时就要远程过程调用(Remote Procedure Call,简称RPC)
协议来帮忙

  #### 什么是RPC(Remote Procedure Call)

 因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能
就会启动一些端口来传输数据,因此,NFS的功能所对应的端口才无法固定,而是采用随机取
用一些未被使用的小于1024的端口来做为传输只用,但如此一来又造成客户端与服务器联机的
困扰,因为客户端得要知道服务器的数据传输端口才能进行联机
 此时,我们就需要远程过程调用(RPC)服务,RPC最主要的功能就是指定每个NFS功能所
对应的端口号,并且传递信息给客户端,让客户端可以连接到正确的端口上去。那RPC又是如
何知道每个NFS的端口?这是因为每当服务器在启动NFS时会随机取用数个端口,并主动的向
RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC固定使用port 111来监听客户端
的需求并应答正确的端口,所以当然可以让NFS的启动更为轻松愉快
 (1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求
 (2)服务器端找到对应的已注册的NFS daemon端口后,会通知客户端
 (3)客户端了解正确的端口后,就可以直接与NFS daemon联机
 
  ###############  NFS的软件结构  ###########
 (1) /etc/exports
  这个文件是NFS的主要配置文件,但系统并没有默认值,所以一开始这个文件不一定
 存在,可能需要使用vi自行建立
 
 (2)/usr/sbin/exportfs
  维护NFS共享资源的命令,我们可以利用这个命令重新共享/etc/exports变更的目录
 资源、将NFS Server共享的目录卸载或重新共享等,这个命令是NFS系统相当重要的一个
 
 (3)/usr/sbin/showmount
  这是另一个重要的NFS命令,exportfs用在NFS Server端,而showmount则主要用在
 Client端。这个showmount可以用来察看NFS服务器共享出来的目录资源
 
 (4)/var/lib/nfs/*tab
  NFS服务器的日志文件都放在/var/lib/nfs/目录里,在该目录下有两个比较重要的
 日志文件,一个是etab,主要记录NFS共享出来的目录的完整权限设置值,另一个是xtab
 ,记录曾经连接到此NFS主机的相关客户端数据
 
 (5)/etc/exports设置文件的语法与参数
  先编辑好主要配置文件/etc/exports,再启动portmap,然后启动nfs,NFS服务器就
 假设成功了
 
  主机名称的设置主要有几个方式:
   .. 可以使用完整的IP地址或者网段,例如192.168.1.10 或 192.168.1.0/24或
   192.168.1.0/255.255.255.0都可以接受
   .. 权限方面
   . rw: read-write 可读写的权限
   . ro: read-only  只读的权限
   . sync: 数据同步写入到内存与硬盘中
   . async: 数据会先暂存于内存中,而非直接写入硬盘
   . no_root_squash: 登入NFS主机使用共享目录的用户,如果是root用户,那么
     对于这个共享目录来说,它就具有root的权限
   . root_squach: 登入NFS主机使用共享目录的用户如果是root身份,那么这个
     用户的权限将被压缩成为匿名用户,通常他的UID与GID都会变成nobody(nfsnobody)
   那个系统账号的身份
   . all_squash: 不论登入NFS主机用户的身份为何,它的身份都会被压缩成匿名
     用户,通常也就是nobody(nfsnobody)
   . anonuid: anon指anonymous(匿名者),前面关于*_squach提到的匿名用户的
    UID设置值,通常为nobody(nfsnobody),但是我们可以自行设置这个UID
    的值,这个UID必须存在于我们自己的/etc/passwd中
   . anongid: 同anonuid,但是变成group ID
 范例:
  1、vi /etc/exports
   /tmp *(rw,no_root_squash)
  这个表示无论来自哪里都可以使用/tmp这个目录,*(rw,no_root_squash)这个字符
  串中间是没有空格的,而/tmp与*(rw,no_root_squash)则是直接用空格隔开的,要
  特别注意no_root_squash的功能,如果你是客户端,而且你是以root的身份登入linux
  主机,那么当你mount上这台主机的/tmp后,在该目录中将具有root的权限
  
  2、将一个公共目录/home/public开放,但是只限定局域网内192.168.0.0/24这个
   网段可以读写,其他人则只能读取
  # vi /etc/exports
  /home/public 192.168.0.0/24(rw,no_root_squash) *(ro,no_root_squash)
  
  3、将一个私人目录/home/test开放给192.168.0.100这个client端的机器,使其
   具有读写权限
  # vi /etc/exports
   /tmp *(rw,no_root_squash)
   /home/public 192.168.0.0/24(rw) *(ro)
   /home/test  192.168.0.100(rw)
   
 启动NFS
 # /etc/init.d/portmap start
 # /etc/init.d/nfslock start
 # /etc/init.d/nfs start
 portmap启动的端口在 111
 NFS启动的端口在2049
 其他rpc.daemons启动的端口则是随机产生的,因此需要向port 111注册
 
 NFS的联机观察
  在NFS服务器设置妥当后,我们可以先自行测试一下是否可以联机,
  # showmount [-ae] [hostname|IP]
  -a:显示目前主机与客户端得NFS联机共享状态
  -e:显示某台主机的/etc/exports所共享的目录数据
  
 范例:
  (1)显示出刚刚所设置的exports的信息
   # showmount -e localhost(IP)
  (2)查看日志
   # tail -f /var/lib/nfs/etab
  (3) exportfs [-aruv]
   参数:
    -a :  全部挂载(或卸载)/etc/exports 文件内的设置
    -r :  重新挂载/etc/exports里的设置,亦同步更新/etc/exports及/var/lib/nfs/xtab内容
    -u : 卸载某一目录
    -v : 在exports的时候,将共享的目录显示到屏幕上
    
###################  NFS客户端得挂载   #######################
# mount -t nfs 192.168.0.2:/home/public /home/nfs/public

#df -h  查看是否已经挂载成功

# umount /home/nfs/public 卸载挂载

# 开机自动挂载NFS

 # vi /etc/rc.local
  mount -t nfs 192.168.0.2:/home/public /home/nfs/public  或
 # vi /etc/fstab