Nfs
server
可以看作是一个
FILE SERVER,
它可以让你的
PC
通过网络将远端得
NFS SERVER
共享出来的档案
MOUNT
到自己的系统中,在
CLIENT
看来使用
NFS
的远端文件就象是在使用本地文件一样。
NFS 协议从诞生到现在为止,已经有多个版本,如 NFS V2 ( rfc1094 ) ,NFS V3 ( rfc1813 )(最新的版本是 V4 ( rfc3010 )。
二、各 NFS 协议版本的主要区别
V3 相对 V2 的主要区别:
1 、文件尺寸
V2 最大只支持 32BIT 的文件大小 (4G), 而 NFS V3 新增加了支持 64BIT 文件大小的技术。
2 、文件传输尺寸
V3 没有限定传输尺寸, V2 最多只能设定为 8k ,可以使用 -rsize and -wsize 来进行设定。
3 、完整的信息返回
V3 增加和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处。
4 、增加了对 TCP 传输协议的支持
V2 只提供了对 UDP 协议的支持,在一些高要求的网络环境中有很大限制, V3 增加了对 TCP 协议的支持
*5 、异步写入特性
6 、改进了 SERVER 的 mount 性能
7 、有更好的 I/O WRITES 性能。
9 、更强网络运行效能,使得网络运作更为有效。
10 、更强的灾难恢复功能。
异步写入特性( v3 新增加)介绍:
NFS V3 能否使用异步写入,这是可选择的一种特性。 NFS V3 客户端发发送一个异步写入请求到服务器,在给客户端答复之前服务器并不是必须要将数据写入到存储器中(稳定的)。服务器能确定何时去写入数据或者将多个写入请求聚合到一起并加以处理,然后写入。客户端能保持一个数据的 copy 以防万一服务器不能完整的将数据写入。当客户端希望释放这个 copy 的时候,它会向服务器通过这个操作过程,以确保每个操作步骤的完整。异步写入能够使服务器去确定最好的同步数据的策略。使数据能尽可能的同步的提交何到达。与 V2 比较来看,这样的机制能更好的实现数据缓冲和更多的平行(平衡)。而 NFS V2 的 SERVER 在将数据写入存储器之前不能再相应任何的写入请求。
V4 相对 V3 的改进:
1 :改进了 INTERNET 上的存取和执行效能
2 :在协议中增强了安全方面的特性
3 :增强的跨平台特性
三、 CLIENT 和 SERVER 的具体操作和设置
在讲 NFS SERVER 的运作之前先来看一些与 NFS SERVER 有关的东西:
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 需要启动的 DAEMONS
pc.nfsd: 主要复杂登陆权限检测等。
rpc.mountd :负责 NFS 的档案系统,当 CLIENT 端通过 rpc.nfsd 登陆 SERVER 后,对 clinet 存取 server 的文件进行一系列的管理
NFS SERVER 在 REDHAT LINUX 平台下一共需要两个套件: nfs-utils 和 PORTMAP
nfs-utils :提供 rpc.nfsd 及 rpc.mountd 这两个 NFS DAEMONS 的套件
portmap:NFS 其实可以被看作是一个 RPC SERVER PROGRAM, 而要启动一个 RPC SERVER PROGRAM ,都要做好 PORT 的对应工作,而且这样的任务就是由 PORTMAP 来完成的。通俗的说 PortMap 就是用来做 PORT 的 mapping 的。
一:服务器端的设定(以 LINUX 为例)
服务器端的设定都是在 /etc/exports 这个文件中进行设定的,设定格式如下:
欲分享出去的目录 主机名称 1 或者 IP1( 参数 1 ,参数 2 ) 主机名称 2 或者 IP2 (参数 3 ,参数 4 )
上面这个格式表示,同一个目录分享给两个不同的主机,但提供给这两台主机的权限和参数是不同的,所以分别设定两个主机得到的权限。
可以设定的参数主要有以下这些:
rw :可读写的权限;
ro :只读的权限;
no_root_squash :登入到 NFS 主机的用户如果是 ROOT 用户,他就拥有 ROOT 的权限,此参数很不安全,建议不要使用。
root_squash :在登入 NFS 主 ?C 使用分享之目 ? 的使用者如果是 root ?r ,那 ???? 使用者的 ? 嘞 ? ⒈ ? 嚎 s 成 ? 槟涿 褂谜撸 ǔ K ?UID ? GID 都 ?? 成 nobody 那 ?? 身份;
all_squash :不管登陆 NFS 主机的用户是什么都会被重新设定为 nobody 。
anonuid :将登入 NFS 主机的用户都设定成指定的 user id, 此 ID 必须存在于 /etc/passwd 中。
anongid :同 anonuid ,但是 ? 成 group ID 就是了!
sync :资料同步写入存储器中。
async :资料会先暂时存放在内存中,不会直接写入硬盘。
insecure 允许从这台机器过来的非授权访问。
例如可以编辑 /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)
设定好后可以使用以下命令启动 NFS:
/etc/rc.d/init.d/portmap start ( 在 REDHAT 中 PORTMAP 是默认启动的)
/etc/rc.d/init.d/nfs start
exportfs 命令:
如果我们在启动了 NFS 之后又修改了 /etc/exports ,是不是还要重新启动 nfs 呢?这个时候我们就可以用 exportfs 命令来使改动立刻生效,该命令格式如下:
exportfs [-aruv]
-a :全部 mount 或者 unmount /etc/exports 中的内容
-r :重新 mount /etc/exports 中分享出来的目录
-u : umount 目录
-v :在 export 的 ?r 候,将详细的信息输出到屏幕上。
具体例子:
[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
exportfs -au <== 全部都卸载了。
客户段的操作:
1 、 showmout 命令对于 NFS 的操作和查错有很大的帮助,所以我们先来看一下 showmount 的用法
showmout
-a :这个参数是一般在 NFS SERVER 上使用,是用来显示已经 mount 上本机 nfs 目录的 cline 机器。
-e :显示指定的 NFS SERVER 上 export 出来的目录。
例如:
showmount -e 192.168.0.30
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.0.100
2 、 mount nfs 目录的方法:
mount -t nfs hostname(orIP):/directory /mount/point
具体例子:
Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs
Solaris:mount -F nfs 192.168.0.1:/tmp /mnt/nfs
BSD: mount 192.168.0.1:/tmp /mnt/nfs
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 数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。
rsize 和 wsize :
文件传输尺寸设定: V3 没有限定传输尺寸, V2 最多只能设定为 8k ,可以使用 -rsize and -wsize 来进行设定。这两个参数的设定对于 NFS 的执行效能有较大的影响
bg :在执行 mount 时如果无法顺利 mount 上时,系统会将 mount 的操作转移到后台并继续尝试 mount ,直到 mount 成功为止。(通常在设定 /etc/fstab 文件时都应该使用 bg ,以避免可能的 mount 不上而影响启动速度)
fg :和 bg 正好相反,是默认的参数
nfsvers = n: 设定要使用的 NFS 版本,默认是使用 2 ,这个选项的设定还要取决于 server 端是否支持 NFS VER 3
mountport :设定 mount 的端口
port :根据 server 端 export 出的端口设定,例如如果 server 使用 5555 端口输出 NFS, 那客户端就需要使用这个参数进行同样的设定
timeo=n: 设置超时时间,当数据传输遇到问题时,会根据这个参数尝试进行重新传输。默认值是 7/10 妙( 0.7 秒)。如果网络连接不是很稳定的话就要加大这个数值,并且推荐使用 HARD MOUNT 方式,同时最好也加上 INTR 参数,这样你就可以终止任何挂起的文件访问。
intr 允许通知中断一个 NFS 调用。当服务器没有应答需要放弃的时候有用处。
udp :使用 udp 作为 nfs 的传输协议( NFS V2 只支持 UDP)
tcp :使用 tcp 作为 nfs 的传输协议
namlen=n :设定远程服务器所允许的最长文件名。这个值的默认是 255
acregmin=n :设定最小的在文件更新之前 cache 时间,默认是 3
acregmax=n :设定最大的在文件更新之前 cache 时间,默认是 60
acdirmin=n :设定最小的在目录更新之前 cache 时间,默认是 30
acdirmax=n :设定最大的在目录更新之前 cache 时间,默认是 60
actimeo=n :将 acregmin 、 acregmax 、 acdirmin 、 acdirmax 设定为同一个数值,默认是没有启用。
retry=n :设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试。默认的数值是 10000 minutes
noac: 关闭 cache 机制。
同时使用多个参数的方法: mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
请注意, NFS 客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突。比如说服务器以只读的方式导出,客户端却以可写的方式 mount, 虽然可以成功 mount 上,但尝试写入的时候就会发生错误。一般服务器和客户端配置冲突的时候,会以服务器的配置为准。
4 、 /etc/fstab 的设定方法
/etc/fstab 的格式如下:
fs_spec fs_file fs_type fs_options fs_dump fs_pass
fs_spec: 该字段定义希望加载的文件系统所在的设备或远程文件系统 , 对于 nfs 这个参数一般设置为这样: 192.168.0.1:/NFS
fs_file: 本地的挂载点
fs_type :对于 NFS 来说这个字段只要设置成 nfs 就可以了
fs_options: 挂载的参数,可以使用的参数可以参考上面的 mount 参数。
fs_dump - 该选项被 "dump" 命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为 0
fs_pass - 该字段被 fsck 命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统 "/" 对应该字段的值应该为 1 ,其他文件系统应该为 2 。若该文件系统无需在启动时扫描则设置该字段为 0 。
5 、与 NFS 有关的一些命令介绍
nfsstat:
查看 NFS 的运行状态,对于调整 NFS 的运行有很大帮助
rpcinfo :
查看 rpc 执行信息,可以用于检测 rpc 运行情况的工具。
四、 NFS 调优
调优的步骤:
1 、测量当前网络、服务器和每个客户端的执行效率。
2 、分析收集来的数据并画出图表。查找出特殊情况,例如很高的磁盘和 CPU 占用、已经高的磁盘使用时间
3 、调整服务器
4 、重复第一到第三步直到达到你渴望的性能
与 NFS 性能有关的问题有很多,通常可以要考虑的有以下这些选择:
WSIZE,RSIZE 参数来优化 NFS 的执行效能
WSIZE 、 RSIZE 对于 NFS 的效能有很大的影响。
wsize 和 rsize 设定了 SERVER 和 CLIENT 之间往来数据块的大小,这两个参数的合理设定与很多方面有关,不仅是软件方面也有硬件方面的因素会影响这两个参数的设定(例如 LINUX KERNEL 、网卡,交换机等等)。
下面这个命令可以测试 NFS 的执行效能,读和写的效能可以分别测试,分别找到合适的参数。对于要测试分散的大量的数据的读写可以通过编写脚本来进行测试。在每次测试的时候最好能重复的执行一次 MOUNT 和 unmount 。
time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
用于测试的 WSIZE,RSIZE 最好是 1024 的倍数,对于 NFS V2 来说 8192 是 RSIZE 和 WSIZE 的最大数值,如果使用的是 NFS V3 则可以尝试的最大数值是 32768 。
如果设置的值比较大的时候,应该最好在 CLIENT 上进入 mount 上的目录中,进行一些常规操作( LS,VI 等等),看看有没有错误信息出现。有可能出现的典型问题有 LS 的时候文件不能完整的列出或者是出现错误信息,不同的操作系统有不同的最佳数值,所以对于不同的操作系统都要进行测试。
设定最佳的 NFSD 的 COPY 数目。
linux 中的 NFSD 的 COPY 数目是在 /etc/rc.d/init.d/nfs 这个启动文件中设置的,默认是 8 个 NFSD, 对于这个参数的设置一般是要根据可能的 CLIENT 数目来进行设定的,和 WSIZE 、 RSIZE 一样也是要通过测试来找到最近的数值。
UDP and TCP
可以手动进行设置,也可以自动进行选择。
mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
UDP 有着传输速度快,非连接传输的便捷特性,但是 UDP 在传输上没有 TCP 来的稳定,当网络不稳定或者黑客入侵的时候很容易使 NFS 的 Performance 大幅降低甚至使网络瘫痪。所以对于不同情况的网络要有针对的选择传输协议。 nfs over tcp 比较稳定, nfs over udp 速度较快。在机器较少网络状况较好的情况下使用 UDP 协议能带来较好的性能,当机器较多,网络情况复杂时推荐使用 TCP 协议( V2 只支持 UDP 协议)。在局域网中使用 UDP 协议较好,因为局域网有比较稳定的网络保证,使用 UDP 可以带来更好的性能,在广域网中推荐使用 TCP 协议, TCP 协议能让 NFS 在复杂的网络环境中保持最好的传输稳定性。可以参考这篇文章: http://www.hp.com.tw/ssn/unix/0212/unix021204.asp
版本的选择
V3 作为默认的选择( RED HAT 8 默认使用 V2,SOLARIS 8 以上默认使用 V3 ),可以通过 vers= mount option 来进行选择。
LINUX 通过 mount option 的 nfsvers=n 进行选择。
五、 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 、 can't 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 的设定。
六、 NFS 安全
NFS 的不安全性主要体现于以下 4 个方面 :
1 、新手对 NFS 的访问控制机制难于做到得心应手 , 控制目标的精确性难以实现
2 、 NFS 没有真正的用户验证机制 , 而只有对 RPC/Mount 请求的过程验证机制
3 、较早的 NFS 可以使未授权用户获得有效的文件句柄
4 、在 RPC 远程调用中 , 一个 SUID 的程序就具有超级用户权限 .
加强 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
/etc/hosts.deny
portmap: ALL : deny
5 、改变默认的 NFS 端口
NFS 默认使用的是 111 端口,但同时你也可以使用 port 参数来改变这个端口,这样就可以在一定程度上增强安全性。
6 、使用 Kerberos V5 作为登陆验证系统
NFS 协议从诞生到现在为止,已经有多个版本,如 NFS V2 ( rfc1094 ) ,NFS V3 ( rfc1813 )(最新的版本是 V4 ( rfc3010 )。
二、各 NFS 协议版本的主要区别
V3 相对 V2 的主要区别:
1 、文件尺寸
V2 最大只支持 32BIT 的文件大小 (4G), 而 NFS V3 新增加了支持 64BIT 文件大小的技术。
2 、文件传输尺寸
V3 没有限定传输尺寸, V2 最多只能设定为 8k ,可以使用 -rsize and -wsize 来进行设定。
3 、完整的信息返回
V3 增加和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处。
4 、增加了对 TCP 传输协议的支持
V2 只提供了对 UDP 协议的支持,在一些高要求的网络环境中有很大限制, V3 增加了对 TCP 协议的支持
*5 、异步写入特性
6 、改进了 SERVER 的 mount 性能
7 、有更好的 I/O WRITES 性能。
9 、更强网络运行效能,使得网络运作更为有效。
10 、更强的灾难恢复功能。
异步写入特性( v3 新增加)介绍:
NFS V3 能否使用异步写入,这是可选择的一种特性。 NFS V3 客户端发发送一个异步写入请求到服务器,在给客户端答复之前服务器并不是必须要将数据写入到存储器中(稳定的)。服务器能确定何时去写入数据或者将多个写入请求聚合到一起并加以处理,然后写入。客户端能保持一个数据的 copy 以防万一服务器不能完整的将数据写入。当客户端希望释放这个 copy 的时候,它会向服务器通过这个操作过程,以确保每个操作步骤的完整。异步写入能够使服务器去确定最好的同步数据的策略。使数据能尽可能的同步的提交何到达。与 V2 比较来看,这样的机制能更好的实现数据缓冲和更多的平行(平衡)。而 NFS V2 的 SERVER 在将数据写入存储器之前不能再相应任何的写入请求。
V4 相对 V3 的改进:
1 :改进了 INTERNET 上的存取和执行效能
2 :在协议中增强了安全方面的特性
3 :增强的跨平台特性
三、 CLIENT 和 SERVER 的具体操作和设置
在讲 NFS SERVER 的运作之前先来看一些与 NFS SERVER 有关的东西:
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 需要启动的 DAEMONS
pc.nfsd: 主要复杂登陆权限检测等。
rpc.mountd :负责 NFS 的档案系统,当 CLIENT 端通过 rpc.nfsd 登陆 SERVER 后,对 clinet 存取 server 的文件进行一系列的管理
NFS SERVER 在 REDHAT LINUX 平台下一共需要两个套件: nfs-utils 和 PORTMAP
nfs-utils :提供 rpc.nfsd 及 rpc.mountd 这两个 NFS DAEMONS 的套件
portmap:NFS 其实可以被看作是一个 RPC SERVER PROGRAM, 而要启动一个 RPC SERVER PROGRAM ,都要做好 PORT 的对应工作,而且这样的任务就是由 PORTMAP 来完成的。通俗的说 PortMap 就是用来做 PORT 的 mapping 的。
一:服务器端的设定(以 LINUX 为例)
服务器端的设定都是在 /etc/exports 这个文件中进行设定的,设定格式如下:
欲分享出去的目录 主机名称 1 或者 IP1( 参数 1 ,参数 2 ) 主机名称 2 或者 IP2 (参数 3 ,参数 4 )
上面这个格式表示,同一个目录分享给两个不同的主机,但提供给这两台主机的权限和参数是不同的,所以分别设定两个主机得到的权限。
可以设定的参数主要有以下这些:
rw :可读写的权限;
ro :只读的权限;
no_root_squash :登入到 NFS 主机的用户如果是 ROOT 用户,他就拥有 ROOT 的权限,此参数很不安全,建议不要使用。
root_squash :在登入 NFS 主 ?C 使用分享之目 ? 的使用者如果是 root ?r ,那 ???? 使用者的 ? 嘞 ? ⒈ ? 嚎 s 成 ? 槟涿 褂谜撸 ǔ K ?UID ? GID 都 ?? 成 nobody 那 ?? 身份;
all_squash :不管登陆 NFS 主机的用户是什么都会被重新设定为 nobody 。
anonuid :将登入 NFS 主机的用户都设定成指定的 user id, 此 ID 必须存在于 /etc/passwd 中。
anongid :同 anonuid ,但是 ? 成 group ID 就是了!
sync :资料同步写入存储器中。
async :资料会先暂时存放在内存中,不会直接写入硬盘。
insecure 允许从这台机器过来的非授权访问。
例如可以编辑 /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)
设定好后可以使用以下命令启动 NFS:
/etc/rc.d/init.d/portmap start ( 在 REDHAT 中 PORTMAP 是默认启动的)
/etc/rc.d/init.d/nfs start
exportfs 命令:
如果我们在启动了 NFS 之后又修改了 /etc/exports ,是不是还要重新启动 nfs 呢?这个时候我们就可以用 exportfs 命令来使改动立刻生效,该命令格式如下:
exportfs [-aruv]
-a :全部 mount 或者 unmount /etc/exports 中的内容
-r :重新 mount /etc/exports 中分享出来的目录
-u : umount 目录
-v :在 export 的 ?r 候,将详细的信息输出到屏幕上。
具体例子:
[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
exportfs -au <== 全部都卸载了。
客户段的操作:
1 、 showmout 命令对于 NFS 的操作和查错有很大的帮助,所以我们先来看一下 showmount 的用法
showmout
-a :这个参数是一般在 NFS SERVER 上使用,是用来显示已经 mount 上本机 nfs 目录的 cline 机器。
-e :显示指定的 NFS SERVER 上 export 出来的目录。
例如:
showmount -e 192.168.0.30
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.0.100
2 、 mount nfs 目录的方法:
mount -t nfs hostname(orIP):/directory /mount/point
具体例子:
Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs
Solaris:mount -F nfs 192.168.0.1:/tmp /mnt/nfs
BSD: mount 192.168.0.1:/tmp /mnt/nfs
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 数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。
rsize 和 wsize :
文件传输尺寸设定: V3 没有限定传输尺寸, V2 最多只能设定为 8k ,可以使用 -rsize and -wsize 来进行设定。这两个参数的设定对于 NFS 的执行效能有较大的影响
bg :在执行 mount 时如果无法顺利 mount 上时,系统会将 mount 的操作转移到后台并继续尝试 mount ,直到 mount 成功为止。(通常在设定 /etc/fstab 文件时都应该使用 bg ,以避免可能的 mount 不上而影响启动速度)
fg :和 bg 正好相反,是默认的参数
nfsvers = n: 设定要使用的 NFS 版本,默认是使用 2 ,这个选项的设定还要取决于 server 端是否支持 NFS VER 3
mountport :设定 mount 的端口
port :根据 server 端 export 出的端口设定,例如如果 server 使用 5555 端口输出 NFS, 那客户端就需要使用这个参数进行同样的设定
timeo=n: 设置超时时间,当数据传输遇到问题时,会根据这个参数尝试进行重新传输。默认值是 7/10 妙( 0.7 秒)。如果网络连接不是很稳定的话就要加大这个数值,并且推荐使用 HARD MOUNT 方式,同时最好也加上 INTR 参数,这样你就可以终止任何挂起的文件访问。
intr 允许通知中断一个 NFS 调用。当服务器没有应答需要放弃的时候有用处。
udp :使用 udp 作为 nfs 的传输协议( NFS V2 只支持 UDP)
tcp :使用 tcp 作为 nfs 的传输协议
namlen=n :设定远程服务器所允许的最长文件名。这个值的默认是 255
acregmin=n :设定最小的在文件更新之前 cache 时间,默认是 3
acregmax=n :设定最大的在文件更新之前 cache 时间,默认是 60
acdirmin=n :设定最小的在目录更新之前 cache 时间,默认是 30
acdirmax=n :设定最大的在目录更新之前 cache 时间,默认是 60
actimeo=n :将 acregmin 、 acregmax 、 acdirmin 、 acdirmax 设定为同一个数值,默认是没有启用。
retry=n :设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试。默认的数值是 10000 minutes
noac: 关闭 cache 机制。
同时使用多个参数的方法: mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
请注意, NFS 客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突。比如说服务器以只读的方式导出,客户端却以可写的方式 mount, 虽然可以成功 mount 上,但尝试写入的时候就会发生错误。一般服务器和客户端配置冲突的时候,会以服务器的配置为准。
4 、 /etc/fstab 的设定方法
/etc/fstab 的格式如下:
fs_spec fs_file fs_type fs_options fs_dump fs_pass
fs_spec: 该字段定义希望加载的文件系统所在的设备或远程文件系统 , 对于 nfs 这个参数一般设置为这样: 192.168.0.1:/NFS
fs_file: 本地的挂载点
fs_type :对于 NFS 来说这个字段只要设置成 nfs 就可以了
fs_options: 挂载的参数,可以使用的参数可以参考上面的 mount 参数。
fs_dump - 该选项被 "dump" 命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为 0
fs_pass - 该字段被 fsck 命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统 "/" 对应该字段的值应该为 1 ,其他文件系统应该为 2 。若该文件系统无需在启动时扫描则设置该字段为 0 。
5 、与 NFS 有关的一些命令介绍
nfsstat:
查看 NFS 的运行状态,对于调整 NFS 的运行有很大帮助
rpcinfo :
查看 rpc 执行信息,可以用于检测 rpc 运行情况的工具。
四、 NFS 调优
调优的步骤:
1 、测量当前网络、服务器和每个客户端的执行效率。
2 、分析收集来的数据并画出图表。查找出特殊情况,例如很高的磁盘和 CPU 占用、已经高的磁盘使用时间
3 、调整服务器
4 、重复第一到第三步直到达到你渴望的性能
与 NFS 性能有关的问题有很多,通常可以要考虑的有以下这些选择:
WSIZE,RSIZE 参数来优化 NFS 的执行效能
WSIZE 、 RSIZE 对于 NFS 的效能有很大的影响。
wsize 和 rsize 设定了 SERVER 和 CLIENT 之间往来数据块的大小,这两个参数的合理设定与很多方面有关,不仅是软件方面也有硬件方面的因素会影响这两个参数的设定(例如 LINUX KERNEL 、网卡,交换机等等)。
下面这个命令可以测试 NFS 的执行效能,读和写的效能可以分别测试,分别找到合适的参数。对于要测试分散的大量的数据的读写可以通过编写脚本来进行测试。在每次测试的时候最好能重复的执行一次 MOUNT 和 unmount 。
time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
用于测试的 WSIZE,RSIZE 最好是 1024 的倍数,对于 NFS V2 来说 8192 是 RSIZE 和 WSIZE 的最大数值,如果使用的是 NFS V3 则可以尝试的最大数值是 32768 。
如果设置的值比较大的时候,应该最好在 CLIENT 上进入 mount 上的目录中,进行一些常规操作( LS,VI 等等),看看有没有错误信息出现。有可能出现的典型问题有 LS 的时候文件不能完整的列出或者是出现错误信息,不同的操作系统有不同的最佳数值,所以对于不同的操作系统都要进行测试。
设定最佳的 NFSD 的 COPY 数目。
linux 中的 NFSD 的 COPY 数目是在 /etc/rc.d/init.d/nfs 这个启动文件中设置的,默认是 8 个 NFSD, 对于这个参数的设置一般是要根据可能的 CLIENT 数目来进行设定的,和 WSIZE 、 RSIZE 一样也是要通过测试来找到最近的数值。
UDP and TCP
可以手动进行设置,也可以自动进行选择。
mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
UDP 有着传输速度快,非连接传输的便捷特性,但是 UDP 在传输上没有 TCP 来的稳定,当网络不稳定或者黑客入侵的时候很容易使 NFS 的 Performance 大幅降低甚至使网络瘫痪。所以对于不同情况的网络要有针对的选择传输协议。 nfs over tcp 比较稳定, nfs over udp 速度较快。在机器较少网络状况较好的情况下使用 UDP 协议能带来较好的性能,当机器较多,网络情况复杂时推荐使用 TCP 协议( V2 只支持 UDP 协议)。在局域网中使用 UDP 协议较好,因为局域网有比较稳定的网络保证,使用 UDP 可以带来更好的性能,在广域网中推荐使用 TCP 协议, TCP 协议能让 NFS 在复杂的网络环境中保持最好的传输稳定性。可以参考这篇文章: http://www.hp.com.tw/ssn/unix/0212/unix021204.asp
版本的选择
V3 作为默认的选择( RED HAT 8 默认使用 V2,SOLARIS 8 以上默认使用 V3 ),可以通过 vers= mount option 来进行选择。
LINUX 通过 mount option 的 nfsvers=n 进行选择。
五、 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 、 can't 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 的设定。
六、 NFS 安全
NFS 的不安全性主要体现于以下 4 个方面 :
1 、新手对 NFS 的访问控制机制难于做到得心应手 , 控制目标的精确性难以实现
2 、 NFS 没有真正的用户验证机制 , 而只有对 RPC/Mount 请求的过程验证机制
3 、较早的 NFS 可以使未授权用户获得有效的文件句柄
4 、在 RPC 远程调用中 , 一个 SUID 的程序就具有超级用户权限 .
加强 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
/etc/hosts.deny
portmap: ALL : deny
5 、改变默认的 NFS 端口
NFS 默认使用的是 111 端口,但同时你也可以使用 port 参数来改变这个端口,这样就可以在一定程度上增强安全性。
6 、使用 Kerberos V5 作为登陆验证系统