1)两个client可以挂载同一远端nfs目录到自己机器上,有文件锁的概念

2)NFS服务端口是2049,rpc监听用111端口,但是NFS中有很多服务和程序,他们的端口是随机取得小于1024的,当然可可以固定,下面说。

3)既然nfs很多功能端口是随机的,但是客户端并不知道,那究竟是怎么连接的呢?是通过RPC(remote procedure call)远端程序呼叫,nfs服务器在启动时会把端口信息告诉rpc,客户端要与服务端通信时,服务端会把nfs的服务端口告诉客户端,客户端通过rpc连接nfs服务器,所以客户端与服务端的rpc服务都要打开,见下图:

NFS软件架构,配置,挂载_第1张图片

4)nfs运行需要的几个程序进程:

     a. rpc. nfs

     b. rpc.mountd

     客户端通过服务器福安的rpc.nfs登入服务器,服务器端的rpc.mounted通过读取/etc/exports来管理用户权限,写入到/etc/init.d/nfs这个脚本中

     c. rpc.lock

     d. rpc.stat

   这两个是解决共享资源读取问题的,写入到/etc/init.d/nfslock这个脚本中


5)nfs服务器端安装的程序:

    a.rpcbind  提供rpc服务

    b. nfs-utils, 可就是提供上面rpc. nfs和rpc.mounted服务的程序

NFS软件架构,配置,挂载_第2张图片


6)/etc/exports设定

no_root_squash
root_squash

 用戶端使用 NFS 檔案系統的帳號若為 root 時,系統該如何判斷這個帳號的身份?預設的情況下,用戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody, 如此對伺服器的系統會較有保障。但如果你想要開放用戶端使用 root 身份來操作伺服器的檔案系統,那麼這裡就得要開 no_root_squash 才行!
all_squash 

不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名使用者,通常也就是 nobody(nfsnobody) 啦!
anonuid
anongid anon 意指 anonymous (匿名者) 前面關於 *_squash 提到的匿名使用者的 UID 設定值,通常為 nobody(nfsnobody),但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於你的 /etc/passwd 當中! anonuid 指的是 UID 而 anongid 則是群組的 GID 囉。

/tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)
/home/test    192.168.100.10(rw)


7)启动nfs

按照上面所说,nfs启动所需的程序为,rpcbind, rpc.nfs/rpc.mounted。

[root@www ~]# /etc/init.d/rpcbind start

[root@www ~]# /etc/init.d/nfs start (将会启动rpc.nfs和rpc.mounted)

[root@www ~]# /etc/init.d/nfslock start (将会启动rpc.lock和rpc.stat)
[root@www ~]# chkconfig rpcbind on
[root@www ~]# chkconfig nfs on
[root@www ~]# chkconfig nfslock on

启动的同时可以查看/var/message查看。

总结:nfs启动后共有如下几个进程:

1. rpcbind

2. rpc.rquota

3. rpc.mounted

4. rpc.nfs

5. rpc.stat

6 rpc.block

其中第一个进程由rpcbind程序包提供,2-6通过nfs-utils程序包提供,

8)查看nfs打开的端口:

[root@www ~]# netstat -tulnp| grep -E '(rpc|nfs)'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0 0.0.0.0:875    0.0.0.0:*        LISTEN  3631/rpc.rquotad
tcp        0      0 0.0.0.0:111    0.0.0.0:*        LISTEN  3601/rpcbind
tcp        0      0 0.0.0.0:48470  0.0.0.0:*        LISTEN  3647/rpc.mountd
tcp        0      0 0.0.0.0:59967  0.0.0.0:*        LISTEN  3689/rpc.statd
tcp        0      0 0.0.0.0:2049   0.0.0.0:*        LISTEN  - rpc.nfs
udp        0      0 0.0.0.0:875    0.0.0.0:*                3631/rpc.rquotad
udp        0      0 0.0.0.0:111    0.0.0.0:*                3601/rpcbind
udp        0      0 0.0.0.0:897    0.0.0.0:*                3689/rpc.statd
udp        0      0 0.0.0.0:46611  0.0.0.0:*                3647/rpc.mountd
udp        0      0 0.0.0.0:808    0.0.0.0:*                3601/rpcbind
udp        0      0 0.0.0.0:46011  0.0.0.0:*                3689/rpc.statd

总结nfs打开的服务:rpcbind(111), rpc.rquota, rpc.nfs(2049), rpc.mounted, rpc.stat,除了bind与nfs打开固定的端口之外,其他的都是打开随机端口然后向rpc注册。

查看端口注册情况:rpcinfo,可以看到打开的随机端口。


9)showmount查看export的目录,不加参数是本机,-e 是查看其他server。


10)/etc/export修改后不需要重启nfs服务,export -arv来重新挂载。


11)NFS如果跨网段,除了基本的网络通之外,还要考虑防火墙或者iptable的问题,因为除了rpcbinf和nfs开通了111和2049端口之外,还有rpc.mounted, rpc.quota,rpcblock,rpc.stat等晋城的端口需要放行,因为是随机产生的这对于iptable的配置就比较麻烦,所以有个文件可以定义这些端口,/etc/sysconfig/nfs里配置。


12)nfs客户端的设定,只需要保证rpcbind这个程序运行就行, /etc/init.d/rpcbind start, 当然挂载的目录也要存在。


13)nfs挂载参数:

 NFS软件架构,配置,挂载_第3张图片

[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \
> -o bg,soft,rsize=32768,wsize=32768 \
> 192.168.100.254:/home/public /home/nfs/public

則當你的 192.168.100.254 這部伺服器因為某些因素而離線時,你的 NFS 可以繼續在背景當中重複的呼叫! 直到 NFS 伺服器再度上線為止。這對於系統的持續操作還是有幫助的啦


14) nfs开机挂载,linux在开机的流程中,目录的挂载是在sysinit之前,也就是在网络配置之前,所以如果把nfs的mount写进/etc/fstab的话是不行的,所以可行的办法是直接把mount命令写入/etc/rc.d/rc/local即可,

[root@clientlinux ~]# vim /etc/rc.d/rc.local
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \
192.168.100.254:/home/public /home/nfs/public


15)nfs权限问题

nfs服务器端保护自己共享的目录是在/etc/exports:

[root@oc7070153642 yuxiao]# cat /etc/exports
/home/ 192.168.31.0/24 (rw sync all_squash anonuid=501)

anouid的意思是501的这个而客户端用户进入共享文件夹后变为anonymous。

nfs服务端自己也要保护自己,如果运行了共享文件夹的危险脚本的话,客户端保护自己的方法是通过mount命令指定rw还是ro,参照上面。


16)关于mount的另一个参数nolock和文件锁:

    文件锁是保持文件同步的一种手段,当多个用户同时操作同一个文件时,文件锁可以保证数据不发生冲突。NFSv2和NFSv3依靠NLM协议实现文件锁,NFSv4本身实现了文件锁,不需要NLM协同工作了。NFS中的文件锁既可以加在客户端,也可以加在服务器端。如果客户端挂载NFS文件系统时使用了选项nolock,表示在客户端加锁。这种情况下可以保证同一个客户端的多个进程访问同一个文件的过程不发生冲突,但是不同客户端访问同一个文件时还可能发生冲突,因为文件锁加在了客户端,其他客户端不知道这个文件锁的存在。如果客户端挂载NFS文件系统时使用了选项lock,表示在服务器端加锁,这样所有的客户端都可以检查服务器端是否存在文件锁,因此所有客户端访问同一个文件时都不会发生冲突。