ubuntu server 10.4下NFS服务的配置

原文地址:http://xuchengji.blog.51cto.com/160472/397588


前言:

1,NFS与samba有什么区别?

(1)NFS基于RPC协议,samba应用SMB协议。

(2)NFS(Network File System)主要用在UNIX/LINUX操作系统之间共享文件,Samba即可以用在unix/linux操作系统之间,也可以用在unix/linux与微软的操作系统(windows)之间。经过google看到现在windows 7支持NFS了,但是中文会乱码,不支持UTF-8。

我知道的就这么多。

2,为什么NFS需要使用RPC协议?

因为 NFS 用来传输的 端口 是随机选择小于 1024 以下的端口来使用的,这样就使的客户端不知道服务端使用哪个端口,所以此时就得要远程过程调用 (Remote Procedure Call, RPC) 的协议来辅助。

3,RPC协议的功能及如何工作?

RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的端口上去。 那 RPC 又是如何知道每个 NFS 的端口呢?这是因为当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的端口, 所以当然可以让 NFS 的启动更为轻松愉快了

4,为什么先启动RPC,后启动NFS?

因为启动NFS时,就要向RPC进行注册,如果RPC没有先启动,NFS当然就注册不成功,客户端无法获取服务端的端口号,NFS就无法正常工作。所以,RPC先于NFS启动。另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,他管理的所有程序都需要重新启动以重新向 RPC 注册。

5,NFS对文件权限的控制是如何进行的?会发生哪些问题,这些问题会产生什么结果?如何解决这些问题?

NFS服务器是以用户在客户端机器中的UID,与以自己的 /etc/passwd, /etc/group 来查询对应的UID进行比对,进行文件权限的控制;这样一来,就会发生以下问题:

(1)用户A的UID在NFS服务器的/etc/passwd, /etc/group 中刚好存在。

那A就能访问具有相应权限的文件

(2)用户A的UID在NFS服务器的/etc/passwd, /etc/group 中不存在。

那A就变成匿名用户

(3)用户A的UID是NFS服务器上B的UID

那A就能访问B所具有权限的文件。

(4)特殊用户root如何处理

在默认的情况下,变成匿名用户。关于root ,在/etc/exports中有两个相关的设置

no_root_squash:

登入 NFS 主机使用分享目录的用户,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限! 这个项目『极不安全』,不建议使用!

root_squash: 
在登入 NFS 主机使用分享之目录的用户如果是 root 时,那么这个使用者的权限将被压缩成为匿名用户

解决以上用户账号不同步的问题,有以下三种方法:

(1)手工同步/etc/passwd文件

(2)使用LDAP服务

(3)使用NIS服务

6,在NFS服务端,客户端都需要安装哪些软件包?

在ubuntu 操作系统下,NFS服务端需要nfs-kernel-server,nfs-common,portmap;客户端需要nfs-common,portmap。

实例应用 :

配置一台NFS服务器(IP地址为192.168.2.87),共享一个目录nfstest,从客户端访问的用户都被映射成NFS服务器中UID=1000的用户admin01,可以读写文件。

1,配置NFS服务器

(1)安装NFS

#sudo apt-get install nfs-kernel-server

NFS01

可以看出,同时也会安装相关的nfs-common,portmap软件包。

(2)配置 /etc/exports文件

#mkdir nfstest

#sudo vim /etc/exports

nfs03 

#sudo /etc/init.d/nfs-kernel-server restart

注释:

/home/admin01/nfstest 就是要共享出来的目录或文件

* 代表所有的主机,这里可以是一个IP(192.168.2.32)或是主机名或是域名*.labtest.com,也可以是一个范围(192.168.2.0/24)

rw:read-write,可擦写的权限;

ro:read-only,只读的权限;

sync:数据同步写入到内存与硬盘当中;

async:数据会先暂存于内存当中,而非直接写入硬盘!

no_root_squash: 
登入 NFS 主机使用分享目录的用户,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限! 这个项目『极不安全』,不建议使用!

root_squash: 
在登入 NFS 主机使用分享之目录的用户如果是 root 时,那么这个使用者的权限将被压缩成为匿名用户,通常他的 UID 与 GID 都会变成 nobody(nfsnobody) 那个系统账号的身份;

all_squash: 
不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!

anonuid: 
anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是您可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于您的 /etc/passwd 当中!

anongid:同 anonuid ,但是变成 group ID 就是了!

这是几个比较常见的权限参数,如果你有兴趣玩其他的参数时,请自行 man exports 可以发现很多有趣的数据

2,客户端,使用传统的方法挂载

#sudo apt-get install nfs-common

nfs04

会安装相应的软件包portmap

查看NFS服务器上共享出来的文件

#sudo showmount –e 192.168.2.87

挂载到本地的nfs目录上

#sudo mount 192.168.2.87:/home/admin01/nfstest nfs

nfs05

一个简单的NFS应用就完成了。

在客户端是以xcj用户访问,但在NFS服务器端test的拥有者及组都是UID=1000,GID=1000的admin01

3,在客户端使用autofs,把服务器端的nfstest目录挂载到客户端的/home/xuchengji/tempnfs上。

使用autofs要达到目的是:

(1)让客户端在有使用到 NFS 文件系统的需求时才挂载

(2)并且不需要事先建立挂载点

(3)另外,当 NFS 文件系统使用完毕后,让 NFS 自动卸除,以避免可能的 RPC 错误

安装autofs

#sudo apt-get install autofs

配置auto.master

#sudo vim /etc/auto.master

nfs06

auto.nfstest这个文件名可以自定

建立/etc/auto.nfstest文件

#sudo vim /etc/auto.nfstest

nfs07

这时只要访问tempnfs,就会自动挂载上NFS服务器的上nfstest

#sudo /etc/init.d/autofs restart

#cd tempnfs

结束语:

NFS服务配置起来还是比较简单的,使用也很方便,但是客户端与服务端的账号同步的问题较难处理,能把LDAP或NIS结合进来是个不错的选择。autofs使用起来,真的是不错。

 

本文的相关理论主要来源于《鸟哥的linux私房菜》的NFS

本文出自 “匠人” 博客,请务必保留此出处http://xuchengji.blog.51cto.com/160472/397588

在介绍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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值