Linux 共享目录NFS设置
NFS server可以看作是一个FILE SERVER,它可以让你的PC通过网络将远端得NFS SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用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是负责负责信息的传输。
因为我用的是Redhat Linux,所以下面的操作都是在这个系统上的。
一:服务器端的设定(以LINUX为例)
服务器端的设定其实很简单,只需设定一个文件就行,就是/etc/exports这个文件,设定格式如下:
欲分享出去的目录 主机名称1或者IP1(参数1,参数2) 主机名称2或者IP2(参数3,参数4)
上面这个格式表示,同一个目录分享给两个不同的主机,但提供给这两台主机的权限和参数是不同的,所以分别设定两个主机得到的权限。
Exports文件中可以设定的参数主要有以下这些:
参数? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?说明
Ro? ?? ?? ?? ?? ?? ?? ?? ?? ? 该主机对该共享目录有只读权限
Rw? ?? ?? ?? ?? ?? ?? ?? ?? ? 该主机对该共享目录有读写权限
Root_squash? ?? ?? ?? ?客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
No_root_squash? ?? ? 客户机用root访问该共享文件夹时,不映射root用户
All_squash? ?? ?? ?? ?? ? 客户机上的任何用户访问该共享目录时都映射成匿名用户
Anonuid? ?? ?? ?? ?? ?? ???将客户机上的用户映射成指定的本地用户ID的用户
Anongid? ?? ?? ?? ?? ?? ???将客户机上的用户映射成属于指定的本地用户组ID
Sync? ?? ?? ?? ?? ?? ?? ?? ? 资料同步写入到内存与硬盘中
Async? ?? ?? ?? ?? ?? ?? ???资料会先暂存于内存中,而非直接写入硬盘
Insecure? ?? ?? ?? ?? ?? ? 允许从这台机器过来的非授权访问
例如可以编辑/etc/exports为:
/??user01(rw) user02(rw,no_root_squash)? ?表示共享服务器上的根目录(/)只有user01和user02两台主机可以访问,且有读写权限;user01主机用root用户身份访问时,将客户机的root用户映射成服务器上的匿名用户(root_squash,该参数为缺省参数),相当于在服务器使用nobody用户访问目录;user02主机用root用户身份访问该共享目录时,不映射root用户(no_root_squash),即相当于在服务器上用root身份访问该目录
/root/share/??192.168.1.2(rw,insecure,sync,all_squash)??表示共享服务器上的/root/share/目录只有192.168.1.2主机可以访问,且有读写权限;此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用nobody用户访问该目录(若客户机要在该共享目录上保存文件(即写操作),则服务器上的nobody用户对该目录必须有写的权限)
/home/ylw/??*.test.com (rw,insecure,sync,all_squash)? ?表示共享/home/ylw/目录,*.test.com域中所有的主机都可以访问该目录,且有读写权限
/home/share/??.test.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4)? ???表示共享目录/home/share/,*.test.com域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的uid为zh3、gid为wa4的用户
设定好后可以使用以下命令启动NFS:
service nfs restart??
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.1.2:/root/share
exporting *.test.com:/home/ylw
exporting *.test.com:/home/share
reexporting 192.168.1.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.1.2
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.1.12
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数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。
4、/etc/fstab的设定方法
若客户机启动就自动挂载服务器的共享目录,则需修改客户机上的/etc/fstab文件
/etc/fstab格式:(192.168.1.1:/share??/mnt? ? nfs? ?? ?defaults? ?? ???0? ?? ? 2)
? ?? ?? ?? ?? ?? ?Fs_spec? ?? ?? ???fs_file??fs_type? ???fs_options? ?fs_dump??fs_pass
Fs_spec:定义希望加载的文件系统所在的设备或远程文件系统,对于nfs则设为IP:/共享目录
Fs_file:本地挂载点
Fs_type:挂载类型
Fs_options:挂载参数
Fs_dump:该选项被“dump”命令使用来检查一个文件系统该以多快频率进行转储,若不需转储即为0
Fs_pass:该字段被fsck命令使用来决定在启动时需要被扫描的文件系统的顺序,根文件系统“/”对应该字段值为1,其他文件系统为2,若该文件系统无需在启动时被扫描则为0
5、与NFS有关的一些命令介绍
nfsstat:
查看NFS的运行状态,对于调整NFS的运行有很大帮助
rpcinfo:
查看rpc执行信息,可以用于检测rpc运行情况的工具。
三、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安全的方法:
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参数来改变这个端口,这样就可以在一定程度上增强安全性。
五、实例
最后简单讲一下我在服务器上的配置过程
第一步:在服务器上
# vi /etc/exports
/home/ylw? ?? ?www.ylw.com(rw, sync, insecure)
配置好后运行:
# service nfs start
第二步 在客户端
#mount -t nfs www.ylw.com:/home/ylw??/home/ylwclient
没有出错提示,NFS就正常运行了,你在客户机上/home/ylwclient里看到的目录文件其实就是服务器上/home/ylw的内容。
说明:一开始我在配置/etc/exports文件时没有加“insecure"参数,在客户机上mount时,出现提示:
mount:www.ylw.com:/home/ylw failed, reason given by server:权限不够
加上该参数后运行就成功了。
另外:因为linux系统有很强的权限管理,不同的目录属于不同的用户,服务器端与客户端的用户不同,有可能导致虽然已经将服务器端的目录mount到客户端了,但在客户端只能看而不能写,除非你用ROOT帐户进入,这又带来安全问题。我的解决办法是在客户端上建一个与服务器端目录属主ID一样的用户,比如:
服务器端 /home/ylw目录属主为ylw??其ID为 510 (具体看/etc/passwd文件)
在客户端建一用ylwclient,将其ID改为510 且将客户端/home/ylwclient目录的属主改为ylwclient
这样就可真正在像本机目录一样读写操作了。