Linux NFS服务器配置

NFS-Network
FileSystem的缩写,NFS是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。NFS
server也可以看作是一个FILE SERVER,它可以让你的PC通过网络将远端得NFS
SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件一样。

www.hj8828.com 1

1、NFS概述
 NFS:Network file system,网络文件系统;
 由sun公司1984年推出,用来在网络中的多台计算机间实现资源共享(包括象文件或cd-rom);
 设计的目的是:实现在不同系统间交互使用,所以它的通信协议采用与主机和操作系统无关的技术;
 NFS Server可以看作是File Server,它可以让你的PC通过网络将远端得NFS
SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件一样;
 NFS协议从诞生到现在有多个版本:NFS V2(rfc1094),NFS
V3(rfc1813)(最新的版本是V4(rfc3010);
 如何查看nfs当前的版本:
 rpm -qi portmap
 rpm -qi nfs-utils
 NFS服务器的安装:
 可以由多种安装方法:
 —-在安装linux系统时选择安装nfs服务对应的组件;(多数linux发行版本默认安装)
 —-安装nfs的rpm套件包(手动安装)
 rpm -ivh rpm包
 需要5个RPM包。
 setup-*:  共享NFS目录在/etc/exports中定义 (linux默认都安装)
 initscripts-*: 包括引导过程中装载网络目录的基本脚本
(linux默认都安装)
 nfs-utils-*:  包括基本的NFS命令与监控程序
 portmap-*:  支持安全NFS RPC服务的连接
 quota-*:    网络上共享的目录配额,包括rpc.rquotad
(这个包不是必须的)
 —-也可以去下载nfs的源代码包,进行编译安装;
 RPC(Remote Procedure call)
NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC
SERVER.所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS
CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM
PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。
 nfs在系统中的后台守护进程:
 nfs
 nfs服务需要启动的其他进程:
rpc.nfsd:接收从远程系统发来的NFS请求,并将这些请求转化为本地文件系统请求;
rpc.mountd:执行被请求的文件系统的挂接和卸载操作;
rpc.portmapper:将远程请求映射到正确的NFS守护程序;
rpc.statd:在远程主机重启时,提供加锁服务;
rpc.quotaed:提供硬盘容量的管理能力,磁盘限额;
rpcinfo -p 可以查看所要的守护进程时候正常运行;
ps -ef | grep nfsd
ps -ef | grep mountd
ps -ef | grep protmap
现在我们来查看服务器上有关NFS服务器启动了哪些端口:
 # lsof -i|grep rpc
 portmap   1931 daemon   3u IPv4   4289   UDP *:sunrpc
 portmap    1931 daemon     4u IPv4    4290    TCP *:sunrpc (LISTEN)
 rpc.statd 3206 statd    3u IPv4   7081    UDP *:1029
 rpc.statd 3206 statd    6u IPv4   7072    UDP *:838
 rpc.statd 3206 statd    7u IPv4   7085    TCP *:1031 (LISTEN)
 rpc.mount 3483   root    6u IPv4   7934       UDP *:691
 rpc.mount 3483   root    7u IPv4   7937       TCP *:694 (LISTEN)
NFS服务的主配置文件:
/etc/exports:
格式:[共享的目录] [主机名或IP(参数,参数)]
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
[共享的目录] [主机名1或IP1(参数1,参数2)]
[主机名2或IP2(参数3,参数4)]
第一列:欲共享出去的目录,也就是想共享到网络中的文件系统;
第二列:可访问主机
192.168.152.13 指定IP地址的主机
nfsclient.test.com 指定域名的主机
192.168.1.0/24 指定网段中的所有主机
*.test.com        指定域下的所有主机
*                       所有主机
第三列:共享参数
下面是一些NFS共享的常用参数:
下面是一些NFS共享的常用参数:
 ro                    只读访问
 rw                   读写访问
 sync                所有数据在请求时写入共享
 async              NFS在写入数据前可以相应请求
 secure             NFS通过1024以下的安全TCP/IP端口发送
 insecure          NFS通过1024以上的端口发送
 wdelay            如果多个用户要写入NFS目录,则归组写入(默认)
 no_wdelay     
如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
 Hide                在NFS共享目录中不共享其子目录
 no_hide           共享NFS目录的子目录
 subtree_check  
如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
 no_subtree_check   和上面相对,不检查父目录权限
 all_squash              
共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
 no_all_squash         保留共享文件的UID和GID(默认)
 root_squash            
root用户的所有请求映射成如anonymous用户一样的权限(默认)
 no_root_squas         root用户具有根目录的完全管理访问权限
 anonuid=xxx            指定NFS服务器/etc/passwd文件中匿名用户的UID
例如可以编辑/etc/exports为:
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)   *(ro)
/home/test  192.168.0.100(rw)
/home/linux  *.the9.com(rw,all_squash,anonuid=40,anongid=40)

V4相对V3的改进:
1:改进了INTERNET上的存取和执行效能
2:在协议中增强了安全方面的特性
3:增强的跨平台特性

现在我们来查看服务器上有关NFS服务器启动了哪些端口:
        # lsof -i|grep rpc
        portmap   1931 daemon    3u  IPv4   4289       UDP *:sunrpc
        portmap   1931 daemon    4u  IPv4   4290       TCP *:sunrpc
(LISTEN)
        rpc.statd 3206  statd    3u  IPv4   7081       UDP *:1029
        rpc.statd 3206  statd    6u  IPv4   7072       UDP *:838
        rpc.statd 3206  statd    7u  IPv4   7085       TCP *:1031
(LISTEN)
        rpc.mount 3483   root    6u  IPv4   7934       UDP *:691
        rpc.mount 3483   root    7u  IPv4   7937       TCP *:694
(LISTEN)

www.hj8828.com 2

1、NFS概述
   NFS:Network file system,网络文件系统;
  
由sun公司1984年推出,用来在网络中的多台计算机间实现资源共享(包括象文件或cd-rom);
  
设计的目的是:实现在不同系统间交互使用,所以它的通信协议采用与主机和操作系统无关的技术;
   NFS Server可以看作是File Server,它可以让你的PC通过网络将远端得NFS
SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使
用NFS的远端文件就象是在使用本地文件一样;
   NFS协议从诞生到现在有多个版本:NFS V2(rfc1094),NFS
V3(rfc1813)(最新的版本是V4(rfc3010);
 
   如何查看nfs当前的版本:
   rpm -qi portmap
   rpm -qi nfs-utils
   NFS服务器的安装:
   可以由多种安装方法:
  
—-在安装linux系统时选择安装nfs服务对应的组件;(多数linux发行版本默认安装)
   —-安装nfs的rpm套件包(手动安装)
       rpm -ivh rpm包
   需要5个RPM包。
   setup-*:   共享NFS目录在/etc/exports中定义 (linux默认都安装)
   initscripts-*:  包括引导过程中装载网络目录的基本脚本
(linux默认都安装)
   nfs-utils-*:  包括基本的NFS命令与监控程序
   portmap-*:  支持安全NFS RPC服务的连接
   quota-*:    网络上共享的目录配额,包括rpc.rquotad
(这个包不是必须的)
   —-也可以去下载nfs的源代码包,进行编译安装;
 
   RPC(Remote Procedure call)
  
NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC
SERVER.所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS
CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM
PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。
 
   nfs在系统中的后台守护进程:
   nfs
 
   nfs服务需要启动的其他进程:
 
rpc.nfsd:接收从远程系统发来的NFS请求,并将这些请求转化为本地文件系统请求;
  rpc.mountd:执行被请求的文件系统的挂接和卸载操作;
  rpc.portmapper:将远程请求映射到正确的NFS守护程序;
  rpc.statd:在远程主机重启时,提供加锁服务;
  rpc.quotaed:提供硬盘容量的管理能力,磁盘限额;
  rpcinfo -p  可以查看所要的守护进程时候正常运行;
 ps -ef | grep nfsd
 ps -ef | grep mountd
 ps -ef | grep protmap

5、与NFS有关的一些命令介绍
nfsstat:
查看NFS的运行状态,对于调整NFS的运行有很大帮助
rpcinfo:
查看rpc执行信息,可以用于检测rpc运行情况的工具。

  NFS服务的主配置文件:
  /etc/exports:
  格式:   
[共享的目录] [主机名或IP(参数,参数)]
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
[共享的目录] [主机名1或IP1(参数1,参数2)]
[主机名2或IP2(参数3,参数4)]
 
  第一列:欲共享出去的目录,也就是想共享到网络中的文件系统;
  第二列:可访问主机
  192.168.152.13  指定IP地址的主机
  nfsclient.test.com  指定域名的主机
  192.168.1.0/24  指定网段中的所有主机
  *.test.com          指定域下的所有主机
  *                 所有主机
  第三列:共享参数
  下面是一些NFS共享的常用参数:
下面是一些NFS共享的常用参数:
www.hj8828.com,        ro                      只读访问
        rw                      读写访问
        sync                    所有数据在请求时写入共享
        async                   NFS在写入数据前可以相应请求
        secure                  NFS通过1024以下的安全TCP/IP端口发送
        insecure                NFS通过1024以上的端口发送
        wdelay                 
如果多个用户要写入NFS目录,则归组写入(默认)
        no_wdelay              
如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
        hide                    在NFS共享目录中不共享其子目录
        no_hide                 共享NFS目录的子目录
        subtree_check          
如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
        no_subtree_check        和上面相对,不检查父目录权限
        all_squash             
共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
        no_all_squash           保留共享文件的UID和GID(默认)
        root_squash            
root用户的所有请求映射成如anonymous用户一样的权限(默认)
        no_root_squas           root用户具有根目录的完全管理访问权限
        anonuid=xxx            
指定NFS服务器/etc/passwd文件中匿名用户的UID
例如可以编辑/etc/exports为:
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)   *(ro)
/home/test  192.168.0.100(rw)
/home/linux  *.the9.com(rw,all_squash,anonuid=40,anongid=40)

1、新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现
2、NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制
3、较早的NFS可以使未授权用户获得有效的文件句柄
4、在RPC远程调用中,一个SUID的程序就具有超级用户权限.

NFS V3 能否使用异步写入,这是可选择的一种特性。NFS
V3客户端发发送一个异步写入请求到服务器,在给客户端答复之前服务器并不是必须要将数据写入到存储器中稳定的)。服务器能确定何时去写入数据或者将多个写入请求聚合到一起并加以处理,然后写入。客户端能保持一个数据的copy以防万一服务器不能完整的将数据写入。当客户端希望释放这个copy的时候,它会向服务器通过这个操作过程,以确保每个操作步骤的完整。异步写入能够使服务器去确定最好的同步数据的策略。使数据能尽可能的同步的提交何到达。与V2比较来看,这样的机制能更好的实现数据缓冲和更多的平行平衡)。而NFS
V2的SERVER在将数据写入存储器之前不能再相应任何的写入请求。

这是我写的第一份笔记式文档,是对自己最近在研究NFS方面的一个小小的总结,这个稳定也参考和引用了一部分别人的文档,这里表示感谢,这篇是根据LINUX来写的,有空的话我还会写一篇FOR
FREEBSD和SOLARIS的。

二、 各NFS协议版本的主要区别

五、NFS故障解决
1、NFSD没有启动起来
首先要确认 NFS 输出列表存在,否则 nfsd 不会启动。可用 exportfs
命令来检查,如果 exportfs 命令没有结果返回或返回不正确,则需要检查
/etc/exports 文件。
2、mountd 进程没有启动
mountd 进程是一个远程过程调用 (RPC)
,其作用是对客户端要求安装mount)文件系统的申请作出响应。mountd进程通过查找
/etc/xtab文件来获知哪些文件系统可以被远程客户端使用。另外,通过mountd进程,用户可以知道目前有哪些文件系统已被远程文件系统装配,并得知远程客户端的列表。查看mountd是否正常启动起来可以使用命令rpcinfo进行查看,在正常情况下在输出的列表中应该象这样的行:
100005 1 udp 1039 mountd
100005 1 tcp 1113 mountd
100005 2 udp 1039 mountd
100005 2 tcp 1113 mountd
100005 3 udp 1039 mountd
100005 3 tcp 1113 mountd
如果没有起来的话可以检查是否安装了PORTMAP组件。
rpm -qa|grep portmap
3、fs type nfs no supported by kernel
kernel不支持nfs文件系统,重新编译一下KERNEL就可以解决。
4、cant contact portmapper: RPC: Remote system error – Connection
refused
出现这个错误信息是由于SEVER端的PORTMAP没有启动。
5、mount clntudp_create: RPC: Program not registered
NFS没有启动起来,可以用showmout -e host命令来检查NFS
SERVER是否正常启动起来。
6、mount: localhost:/home/test failed, reason given by server:
Permission denied
这个提示是当client要mount nfs
server时可能出现的提示,意思是说本机没有权限去mount nfs
server上的目录。解决方法当然是去修改NFS SERVER咯。
7、被防火墙阻挡
这个原因很多人都忽视了,在有严格要求的网络环境中,我们一般会关闭linux上的所有端口,当需要使用哪个端口的时候才会去打开。而NFS默认是使用111端口,所以我们先要检测是否打开了这个端口,另外也要检查TCP_Wrappers的设定。

三、 CLIENT和SERVER的具体操作和设置

加强NFS安全的方法:
1、合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS
SERVER的CLIENT仅仅有最小的权限,最好不要使用root_squash。
2、使用IPTABLE防火墙限制能够连接到NFS SERVER的机器范围
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 –dport 111 -j
ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 –dport 111 -j
ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 –dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 –dport 111 -j ACCEPT
3、为了防止可能的Dos攻击,需要合理设定NFSD 的COPY数目。
4、修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的
/etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow

3、mount nfs的其它可选参数:
HARD mount和SOFT MOUNT:
HARD: NFS
CLIENT会不断的尝试与SERVER的连接在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出一些提示),直到MOUNT上。
SOFT:会在前台尝试与SERVER的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。
例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
对于到底是使用hard还是soft的问题,这主要取决于你访问什么信息有关。例如你是想通过NFS来运行X
PROGRAM的话,你绝对不会希望由于一些意外的情况如网络速度一下子变的很慢,插拔了一下网卡插头等)而使系统输出大量的错误信息,如果此时你用的是HARD方式的话,系统就会等待,直到能够重新与NFS
SERVER建立连接传输信息。另外如果是非关键数据的话也可以使用SOFT方式,如FTP数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。

exportfs命令:
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
exportfs [-aruv]
-a :全部mount或者unmount /etc/exports中的内容
-r :重新mount /etc/exports中分享出来的目录
-u :umount 目录
-v :在 export 的時候,将详细的信息输出到屏幕上。
具体例子:
[root @test root]# exportfs -rv <==全部重新 export 一次!
exporting 192.168.0.100:/home/test
exporting 192.168.0.*:/home/public
exporting *.the9.com:/home/linux
exporting *:/home/public
exporting *:/tmp
reexporting 192.168.0.100:/home/test to kernel