NFS详细介绍[转]

一、NFS简介

NFS(Network File System)是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。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在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主機使用分享之目录的使用者如果是root时,那么这个使用者的权限將被压缩成为匿名使用者,通常他的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:

[root @test root]#/etc/rc.d/init.d/portmap start
[root @test root]#/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 的時候,将详细的信息输出到屏幕上。

具体例子:

[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目录的方法:
</code> #mount -t nfs hostname(orIP):/directory /mount/point </code> 具体例子:

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 -t 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在复杂的网络环境中保持最好的传输稳定性。

版本的选择
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的目的

#cat /etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow

#cat /etc/hosts.deny
portmap: ALL : deny

5、改变默认的NFS端口
NFS默认使用的是111端口,但同时你也可以使用port参数来改变这个端口,这样就可以在一定程度上增强安全性。
6、使用Kerberos V5作为登陆验证系统

原文:http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=network:NFS

linux iptables允许NFS Client访问NFS Server[技术]

portmapper在NFS服务启动的时候给每一个NFS服务分配了一个动态的端口,如何才能让NFS client在使用RHEL/Fedora/CentOS linux iptales防火墙时可以正常使用NFS服务呢?

需要打开下面的端口

a] TCP/UDP 111 – RPC 4.0 portmapper

b] TCP/UDP 2049 – NFSD (nfs server)

c] Portmap 静态端口—在/etc/sysconfig/nfs文件中定义的一系列TCP/UDP端口

按nfs默认启动的话,很多服务如rpc.mounted,端口都不是固定的,这样不方便在防火墙上进行管理,所以我们需要把每个启动的服务的端口固定下来,需要做的就是编辑/etc/sysconfig/nfs文件。

# vi /etc/sysconfig/nfs

更改下面的配置,将端口分配为一个没被占用的

# TCP port rpc.lockd should listen on.
LOCKD_TCPPORT=lockd-port-number
# UDP port rpc.lockd should listen on.
LOCKD_UDPPORT=lockd-port-number
# Port rpc.mountd should listen on.
MOUNTD_PORT=mountd-port-number
# Port rquotad should listen on.
RQUOTAD_PORT=rquotad-port-number
# Port rpc.statd should listen on.
STATD_PORT=statd-port-number
# Outgoing port statd should used. The default is port is random
STATD_OUTGOING_PORT=statd-outgoing-port-numbe

下面是我用于测试的机器上修改的内容

RQUOTAD_PORT=6005
LOCKD_TCPPORT=6004
LOCKD_UDPPORT=6004
MOUNTD_PORT=6002
STATD_PORT=6003
STATD_OUTGOING_PORT=6006

保存退出后就可以重启nfs服务,portmap服务

# service portmap restart
# service nfs restart

下面就是iptables方面的配置了,蚊子这里因为是学习,所以设置的比较严格,下面先说下我的环境

1,两台Server:192.168.211.128(nfs-server),192.168.211.129(nfs-client)
2,nfs-server上只允许nfs,ssh的访问,其余都拒绝

下面是我的iptables的配置

iptables -A INPUT -p tcp -s 192.168.211.0/24 –dport 22 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6002 -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6003 -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6004 -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6005 -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6006 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6002 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6003 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6004 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6005 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 6006 -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 111 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 111 -j ACCEPT
iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 2049 -j ACCEPT
iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED -s 192.168.211.0/24 –dport 2049 -j ACCEPT
iptables -P INPUT DROP

第一条就是允许连接ssh
第二条作用是在启动nfs的时候,nfs-server会通过本地回环接口与portmap进行会话,所以需要允许
最后一条是设置input链的默认策略为drop
中间的就是允许nfs-server相应的端口了

如果在配置iptables的时候有问题可以使用service iptables restart重置,如果没有问题就可以使用service iptables save保存相应的配置,保存的配置文件放在/etc/sysconfig/iptables里。

nagios监控NFS挂载脚本更新[原创]

在蚊子上篇文章《nagios监控NFS是否被正确的挂载》中,介绍了一个脚本,是用了监控nfs是否被正常挂载的,在这几天使用过程中还是发现了一些小问题。

如果nfs挂载的顺序没有按照fstab中写的顺序进行挂载,监控就会发出warning的警告,但报警信息中没挂载的硬盘信息是空的,实际查看机器确是所有挂载正常。

于是对我的脚本进行了调整,将check_mount函数提前运行,然后根据LIST变量内容判断是否挂载正常,调整后脚本的如下,同时后面提供了脚本下载地址。

有需要的朋友可以去下面的地址下载

下载check_nfsmount文件

nagios监控NFS是否被正确的挂载[原创]

今天蚊子与大家分享的nagios监控脚本是监控NFS是否被挂载上的脚本

先说下我写这个脚本的初衷吧,事情还是因为上次网络部调整我服务器机柜位置引起的,当时蚊子自信满满的认为服务器上我已经配置好了自动挂载NFS,所以我根本不用担心NFS挂载的情况,当服务器启动恢复后,我的nagios给我发了一个recovery的邮件,我就想当然的认为好了,也就没管。第二天开发人员居然找到我,问我昨天是不是有两台机器重启了,我说是呀,他们就说NFS没有挂载上,我当时还很强调说不可能呢,结果我手动重启了一下昨天的机器,发现真的没有自动挂载上,让我很是郁闷。

没有自动挂载到还不是让人最郁闷,那个我已经通过技术问题解决了,郁闷的是有了问题居然不是nagios第一时间通知我。由于之前我使用的是nagios的check_disk这个脚本,在NFS磁盘有问题,不可读写或空间不足的时候给我报过警,但我经过测试发现,这个脚本只能监控本地磁盘(包括挂载好的NFS)可用性,而不管是否NFS被正确挂载了,所以才有了今天这个脚本。

脚本名称:check_nfsmount
脚本作用:
1,检查NFS磁盘是否被挂载
2,报告哪些NFS没有被挂载
使用方法:
1,将需要mount的NFS磁盘写入到fstab,如下

# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults,usrquota,grpquota        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
192.168.211.129:/home/tst       /data/tst       nfs     defaults        0 0
192.168.211.129:/home/tst02     /data/tst02     nfs     defaults        0 0
192.168.211.129:/home/tst03     /data/tst03     nfs     defaults        0 0

2,将脚本nagios安装目录的libexec下,并赋予可执行权限
3,配置nrpe配置文件,添加相应的command
4,nagios监控机上添加相应的服务
脚本内容:

对于脚本中还没有考虑到的还希望各位指出。

解决nfs不能自动mount补遗[技术]

今天网络部调整我服务器的位置,所以把我的服务器停机了,结果服务器恢复的时候,蚊子发现nfs并没有自动的mount上。记得蚊子在《自动挂载NFS目录的两个办法》中已经写了自动挂载的办法了,于是又把这篇文章翻了出来看了一下。

首先蚊子发现手动挂载nfs是正常的,说明portmap服务是好的,使用/etc/init.d/netfs status查看状态,也能看到需要挂载的路径,而且执行/etc/init.d/netfs start看到nfs路径是可以被挂载的。由此说明netfs服务也是正常的。

紧接着蚊子查看了一下/etc/rc.d/rc3.d下面的启动脚本,如下

S10network   
S12syslog    
S13irqbalance
S13iscsi     
S13portmap   
S22messagebus
S25netfs     
S28autofs    

由此看到,netfs服务是在portmap的后面启动,同样也是在network的后面启动的,所以应该不会是服务启动顺序的问题。

紧接着又想到了另外一个问题:并不是所有服务器都不能挂载nfs,有些机器是可以的。有一点蚊子这里需要说一下,蚊子公司的nfs服务器的ip地址和我服务器的ip不在一个网段,服务器是10网段,nfs是192网段的。所以蚊子必须在启动服务器的时候添加路由。

在此,蚊子使用了两种方式自动添加路由

1,使用rc.local文件
2,使用static-routes文件

问题就是使用第一种方式的时候不能自动挂载,但使用第二种方式的时候就可以自动挂载。后来蚊子把使用第一种方式的都改成第二种方式,问题迎刃而解,服务器重启后可以自动挂载nfs了。

总结:

按照linux启动的顺序,rc.local里面的内容是在linux所有服务都启动完毕,最后才被执行的,也就是说,这里面的内容是在netfs之后才被执行的,那也就是说在netfs启动的时候,服务器上的静态路由是没有被添加的,所以netfs挂载不能成功。

static-routes文件又是什么呢,这个是network脚本执行时调用的一个文件,这个文件的放置在/etc/sysconfig目录下,在network脚本中的位置是:

151         # Add non interface-specific static-routes.
152         if [ -f /etc/sysconfig/static-routes ]; then
153            grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
154               /sbin/route add -$args
155            done
156         fi

从这段脚本可以看到,这个就是添加静态路由的方法,static-routes的写法是

any net 192.168.0.0/16 gw 网关ip

这样的话,在启动network脚本的时候路由就自动添加上了,又因为network是在netfs前面启动的,自然在挂载nfs的时候就正常了。

这样看来,如果需要添加静态路由,使用static-routes文件要比使用rc.local好,而且当改变了网络配置,需要重启network脚本的时候,相应的静态路由是可以自动添加上的,但这时如果使用rc.local的话,在重启network服务的时候,原本添加好的静态路由就消失了。

自动挂载NFS目录的两个办法[技术]

如果使用手工mount的方法访问一个NFS共享, 重新启动系统后这个文件系统必须mount才可以使用, Red Hat Enterprise Linux提供了两种方法来自动的挂载远程文件系统。/etc/fstab和autofs服务.
方法一,/etc/fstab

netfs服务会使用文件/etc/fstab作为参考, 所以像NFS共享的会被自动执行。

如下是一个/etc/fstab中的挂载NFS的一条记录。

使用你的NFS服务器替换如上的 <server> ,

使用NFS输出路径替换如上的 </remote/export> .

使用本地的挂载点目录替换 </local/directory;> 这个目录必须实现手动建立。

如上例子中的选项 nfs 说明了系统使用的文件系统类型。

可以使用nfs的选项替换 <options> ,多个选项之间使用“,”分开,如果需要更多的信息查看man fstab.

如下面的例子:

方法二, autofs 服务:

使用/etc/fstab的一个缺点是:不管用户访问NFS的次数和时间,系统总是会使用资源来维护这个NFS挂载。虽然对于一两个NFS挂载的时候这不是问题,但是如果系统在维护很多NFS挂载的时候,系统性能会受到影响,一个替代方法就是使用基于kernel的自动挂载工具:他可以在需要的时候自动的挂载NFS。

autofs 服务会根据/etc/auto.master文件来控制自动挂载命令:automount的命令可以更加方便的指定挂载点,主机名, 输出目录等等。

autofs的配置文件以父-子关系来组织,主配置文件(/etc/auto.master) 列出了所有的挂载点,然后他会连接到一个特定的映射类型, 这个类型可以是配置文件,程序, NIS映射或者其他挂载方式,auto.master文件包含了如下内容。

<mount-point>用于指定本地挂载点,<map-type>指定如何挂载,最通常的NFS挂载做法是使用一个文件,这个文件通常命名成auto.<mount-point>, <mount-point>是在auto.master指定的挂载点,一个NFS类型的auto.<mount-point>的内容如下:

使用本地挂载点替换 </local/directory;> ,该目录必须手动创建。

可以使用nfs的选项替换 <options> ,多个选项之间使用“,”分开,如果需要更多的信息查看man fstab. 确定在options列表前使用了符号”-“。

使用你的NFS服务器替换如上的 <server> ,

使用NFS服务器的输出路径替换如上的 </remote/export> .

可以使用nfs的选项替换 <options>

autofs配置文件可以用于很多中挂载方式和不同的文件系统上,特使是在NFS的挂载上特别有用,举例来说,有些单位把所有的/home目录集中于一台NFS服务器上, 然后在每个节点上配置auto.master指向auto.home,使得每个节点都可以通过autofs挂载/home目录。所有的用户都可以在任何一台工作站上访问自己/home/下的的数据和配置文件,该案中的auto.master看起来会像如下所示。

这个文件设置了/home/挂载点被配置到了/etc/auto.home文件上,auto.home看起来应该如下:

这个文件显示了如果用户所要访问/home下的一个目录,它应该产生一个到nfs.example.com的NFS mount, mount的选项说明了每个/home下的目录都会使用各自的设定. 如果需要更多的mount选项信息, 可以参考Red Hat Enterprise Linux 3 Reference Guide的 Section 9.4.3 Common NFS Mount Options

有关autofs的更多信息,请参考man手册和安装向导。

注:很多人都会遇到使用了fstab文件后,写好的NFS配置,在重启后却没有自动挂载的情况,首先要检查的是portmap服务是否设置了自动启动,还有另外一个关键的服务就是netfs

本文转自:http://www.redhat.com.cn/kbase/0611/911.php

无DHCP使用kickstart装linux

最近公司idc机房有一批机器准备从装系统,一想到要一台台装,心情顿时坠落到18层地狱,晚上躺床上突然想起了当时学RHCE时老师讲过网络安装和自动安装来,于是第二天就操练起来,基本上用DHCP+kickstart的模式一切都是ok的,安装很是顺利,就准备用这种方式下周去搞呢,结果今天把这方法跟我老大汇报了一下,被狠狠的批了一顿。老大的口径就是,生产环境严厉禁止使用DHCP,毕竟我们的环境不同,我们的idc环境是多个部门混合用的,如果我这边起了DHCP,别的部门同事重启他们的服务器,到时PXE获得了ip,会把我骂死滴。这样看来DHCP是没戏了,那下一步就只能看固定ip的了。

初步设想是在ks.cfg文件中的network部分加入,后来想想这样不行,如果在ks.cfg文件中写入了的话,装出来的机器就都成了相同的ip地址了,而且如果没有DHCP的话,和NFS服务器建立连接时,被安装的服务器是没有ip和其通信的,最后我们老大点拨了一下,可以再输入ks信息的时候把ip分配好

kickstart的内容我就不写出来了,网上应该很多,我只把启动的时候输入的内容写下

linux ksdevice=eth0 ks=nfs:NFS_IP:/path/to/ks.cfg ip=当前server需要配置的ip netmask=your_mask gateway=your_gateway

如此一来,多少台机器都没所谓了

GlusterFS学习手记05-gluster和NFS测试[原创]

对于Glusterfs学习也有了几天了,但对于性能上的评价目前关注的比较少,今天主要才测测Glusterfs和NFS的性能比,但由于手头上条件有限,只能通过虚拟机来测试,数据仅供参考,如有人可以在真实环境测试,还希望发出来供大家参考

我的环境
vmware6.0模拟两个linux

linux01 256MB内存,8G硬盘,centos5,ip:192.168.211.128,用作NFSserver端和Glusterfs的server端
linux02 256MB内存,8G硬盘,centos5,ip:192.168.211.129,用作client

下面就来看下我的测试结果

这张图是NFS的读取测试结果

下面这张是NFS的写入测试结果

然后我把两台虚拟机重启,并启用Glusterfs模式

第一张图是Glusterfs的读取结果

第二张图是写入的测试结果

由上面的结果看,Glusterfs仅仅用于NFS这种模式的情况下,写入速度并不太理想

但Glusterfs的功能不仅仅提供共享存储来用,而是一个存储的聚合,当然以上测试结果未必就很准确,毕竟我的测试条件不行,不过也仅仅是给各位一个启示,请有条件的同志继续完成测试工作吧

官方的glusterfs和NFS的测试结果请看
http://www.gluster.org/docs/index.php/GlusterFS_1.2.1-BENKI_Aggregated_I/O_vs_NFSv4_Benchmark