Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2384939
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: 系统运维

2010-08-11 14:13:32

在AIX上mount Linux操作系统的nfs文件系统的错误处理过程

因为重启AIX操作系统,刚开始执行以下mount一个网络文件系统nfs的命令怎么也不成功

test_stb>#mount /oraclebak
mount: giving up on:
        db_bakup:/disk1
vmount: Not owner

查找资料后发现,linux操作系统在响应AIX操作系统的mount请求时,需要用到此nfs保留端口,该端口在默认情况下是不会开放的。
test_stb>#nfso -o nfs_use_reserved_ports=1
Setting nfs_use_reserved_ports to 1

最后执行mount命令成功
test_stb>#mount /oraclebak

这是第一个问题,还有一些问题需要说明的是:

比如说我在AIX操作系统的oracle用户想对mount上来的远程nfs文件系统进行读写操作,则必须在Linux操作系统上设置应的读写权限才行。

首先在AIX操作系统oracle用户下执行此命令:

test_stb:/home/oracle>$id
uid=208(oracle) gid=207(DBA) groups=1(staff)

然后到Linux操作系统下相应目录执行如下命令:

cd /

chown -R 208:207 disk1

上面这些步骤的含义为:当AIX的oracle用户想写一块数据到db_bakup:/disk1里 的一个文件时,首先将自己用户的id号发送到Linux服务器验证其读写合法性.它是以id号为准,并不是以用户名,组名为准,比如说执行以下命令后,仍 然不能对远程文件夹下的内容进行读写操作:

cd /

chown -R oracle:DBA disk1

第三步:还要在Linux操作系统下以root用户在/etc/exports文件里添加如下内容

/disk1 test_stb(rw,async)

第四步:在/etc/hosts文件里添加test_stb的IP地址

其实这些东西只有了解了过后,使用起来才会觉得特别简单,也没有多少可研究的。但如果不明白,花很多时间也搞不定这些简单的事的。

Solaris NFS 配置步骤

nfs服务器运行两个守侯进程:mountd 和 nfsd.

用到的文件是:

  1. /etc/rc3.d/S15nfs.server  
  2. /etc/dfs/dfstab  
  3. /etc/dfs/sharetab  
  4. /etc/rmtab

nfs客户机上运行的守侯进程是:statd 和 lockd.

用到的文件是:

  1. /etc/vfstab  
  2. /etc/mnttab 

nfs客户机使用命令是:mount umount mountall umountall

2 nfs服务器设置

nfs服务器需要运行两个守侯进程mountd和nfsd来工作.当nfs客户机试图访问一个远程的nfs服务器资源.nfs客户机通过mount 命令请求与 nfs服务器的mountd守侯进程进行连接.当nfs服务器响应客户机时候,返回给可户机一个信息.客户机把这个信息写到本地的/etc/mnttab 文件中.这个信息是服务器中共享文件和目录的信息.它是资源信息的编码:磁盘设备号、节点生成号、节点号等.这个是唯一的.

一旦可户机得到请求信息,nfs服务器上的mountd进程就会在服务器本地的/etc/rmtab文件中添加一条信息.这是为了保持对当前加载可户机上文件的跟踪.这个文件为每一个被加载资源添加一个条目,格式是:

  1. remote hostname: local filename name 

注意:mountd每一次重新启动和可户机发一个卸载请求,都会更新服务器的/etc/rmtab文件中的旧条目.

3 共享设置命令.

明白了以上的道理,下面说具体的操作了.Solaris nfs服务器使用/usr/sbin/share命令为客户机共享资源.

命令详解:

  1. # share ---显示所有可以安装的资源,不管它是否已经被安装.  
  2.  
  3. # share [ -F filesystem ] [ -o options ] [-d description ] pathname-to-resource 

指定共享文件.

* -F file system type 指定被公享的文件系统类型.
* -o options 指定客户对资源访问的类型.
* -d description 功享资源的简单描述.当你share命令不带任何参数运行,他就会被显示.
* pathname-to-resource 在服务器上共享的资源名字.
*-o 指定了允许客户访问共享资源的用户也权限.

具体如下:

rw 表示用户可读/写,是默认植.
rw=client1:client2 指定用户可以有读/写权限.可以有很多用户,用冒号分隔.
ro 表示只读.
ro=client1:client2 指定用户client1和client2只读.client1可以是用户名,也可以是ip地址,或者一个网段.例如:ro=@202.99.88.0/24
root=client:client2 指定client1和client2上的root用户对共享资源有超级用户的权限.但是,他的优先级小于Solaris nfs服务器的本地权限.

例如:用户peng有个目录/exprot/home/games要共享.

  1. # share -F nfs -o rw=lnx3000:race , ro=@202.88.99.0/24:sune450 ,root=mmmmn -d "i love MM !" /export/home/peng/games 

运行结果:共享/exprot/home/peng/games目录,名字是lnx3000和race的两台主机有读/写权 限;202.88.99.0这个c类网的机器和sun450这个主机只有读的权限;mmmmn这台主机的root用户可以对共享资源有超级用户访问权限. 但是声名一点,要是我给共享目录/exprot/home/peng/games目录只读,mmmmn的root权限也没有用,只能只读.因为服务器本地 权限大于任何share的权限.

取消share资源.

  1. # unshare [ -F nfs ] path-to-resource  
  2.  
  3. * -F nfs 指定系统类型,默认.  
  4. * path-to-resource 指定共享路径. 

例如:

  1. # unshare /export/home/peng/games 

取消这个共享资源了.

4 开机自动共享资源.

以上的命令方法,在机器重新启动的时候,设置消失.如何保留和开机自动启动Solaris nfs共享.我们可以用/etc/dfs/dfstab文件来实现自动共享文件.只要主机启动进入运行级别3,nfs资源共享自动启动.

1、编辑/etc/dfs/dfstab文件,添加:

  1. share [ -F filesystem ] [ -o options ] [-d description ] pathname-to-resource 

这个和命令行是一样的

2、# /etc/init.d/nfs.server start

这样就ok了.

3、手工快速命令.

  1. # shareall --共享所有列在/etc/dfs/dfstab中的共享资源.  
  2. # unshareall --取消所有列在/etc/dfs/dfstab中的共享资源. 

资源查看.

  1. # dfshares 




linux NFS 配置步骤

简单的说,就是以下2步:
  1. 编辑 /etc/exports 文件
  2. service portmap restart 和 service nfs restart
 
 一:服务器端的设定(以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、showmount命令对于NFS的操作和查错有很大的帮助,所以我们先来看一下showmount的用法
 -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在复杂的网络环境中保持最好的传输稳定性。可以参考这篇文章:
 
 版本的选择
 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作为登陆验证系统
 
阅读(2304) | 评论(0) | 转发(0) |
0

上一篇:浅析ldd命令

下一篇:Linux 动态库剖析

给主人留下些什么吧!~~