您的位置:首页 > 运维架构 > Linux

第 四 十 二 天:NFS 的 相 关 问 题

2015-10-27 13:40 501 查看
小Q:众里寻他千百度,暮然回首,那人却在结婚登记处,哈哈......
NFS简介-----------------------------------------------------------

NFS由SUN公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大功能是可以通过网络让不同操作系统的计算机可以共享数据,所以也可以将其看做是一台文件服务器。NFS提供了除Samba之外,Windows与Linux及UNIX与Linux之间通信的方法。
客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。NFS有属于自己的协议与使用的端口号,但是在传送资料或者其他相关信息时候,NFS服务器使用一个称为"远程过程调用"(Remote Procedure Call,RPC)的协议来协助NFS服务器本身的运行。
固定端口-----------------------------------------------------------

修改/etc/service,添加以下内容(端口号必须在1024以下,且未被占用)
mountd 1011/tcp #rpc.mountd
mountd 1011/udp #rpc.mountd
rquotad 1012/tcp #rpc.rquotad
rquotad 1012/udp #rpc.rquotad
重启nfs服务后,端口即固定了。

和nfs相关的端口有:
portmap 111
nfsd 2049
mountd 1011
rquotad 1012
NFS协议-------------------------------------------------------------

使用NFS,客户端可以透明地访问服务器中的文件系统,这不同于提供文件传输的FTP协议。FTP会产生文件一个完整的副本;NFS只访问一个进程引用文件部分,并且一个目的就是使得这种访问透明。这就意味着任何能够访问一个本地文件的客户端程序不需要做任何修改,就应该能够访问一个NFS文件。
NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程。因为两个理由,NFS一般不这样实现。第一访问一个NFS文件必须对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程来完成的;第二,出于效率的考虑,NFS服务器在服务器操作系统中实现。如果NFS服务器是一个用户进程,每个客户端请求和服务器应答(包括读和写的数据)将不得不在内核和用户进程之间进行切换,这个代价太大。第3版的NFS协议在1993年发布,下图所示为一个NFS客户端和一台NFS服务器的典型结构。





(1)访问一个本地文件还是一个NFS文件对于客户端来说是透明的,当文件被打开时,由内核决定这一点。文件被打开之后,内核将本地文件的所有引用传递给名为"本地文件访问"的框中,而将一个NFS文件的所有引用传递给名为"NFS客户端"的框中。
(2)NFS客户端通过其TCP/IP模块向NFS服务器发送RPC请求,NFS主要使用UDP,最新的实现也可以使用TCP。

(3)NFS服务器在端口2049接收作为UDP数据包的客户端请求,尽管NFS可以被实现为使用端口映射器,允许服务器使用一个临时端口,但是大多数实现都是直接指定UDP端口2049。

(4)当NFS服务器收到一个客户端请求时,它将这个请求传递给本地文件访问例程,然后访问服务器主机上的一个本地的磁盘文件。

(5)NFS服务器需要花一定的时间来处理一个客户端的请求,访问本地文件系统一般也需要一部分时间。在这段时间间隔内,服务器不应该阻止其他客户端请求。为了实现这一功能,大多数的NFS服务器都是多线程的--服务器的内核中实际上有多个NFS服务器在NFS本身的加锁管理程序中运行,具体实现依赖于不同的操作系统。既然大多数UNIX内核不是多线程的,一个共同的技术就是启动一个用户进程(常被称为"nfsd")的多个实例。这个实例执行一个系统调用,使其作为一个内核进程保留在操作系统的内核中。

(6)在客户端主机上,NFS客户端需要花一定的时间来处理一个用户进程的请求。NFS客户端向服务器主机发出一个RPC调用,然后等待服务器的应答。为了给使用NFS的客户端主机上的用户进程提供更多的并发性,在客户端内核中一般运行着多个NFS客户端,同样具体实现也依赖于操作系统。

portmap/rpcbind的作用------------------------------------------

portmap 在新版CentOS系统里叫做 rpcbind ,它主要功能是把RPC程序号转化为Internet的端口号。
portmap/rpcbind 默认会随系统安装的时候一起安装,这样启动它(centos/redhat): /etc/init.d/ portmap start 新版CentOS /etc/init.d/rpcbind start. 它同时监听 tcp和udp的111端口

当一个RPC服务器启动时,会选择一个空闲的端口号并在上面监听(每次启动后的端口号各不相同),同时它作为一个可用的服务会在portmap进程注册。一个RPC服务器对应惟一一个RPC程序号,RPC服务器告诉portmap进程它在哪个端口号上监听连接请求和为哪个RPC程序号提供服务。经过这个过程,portmap进程就知道了每一个已注册的RPC服务器所用的Internet端口号,而且还知道哪个程序号在这个端口上是可用的。portmap进程维护着一张RPC程序号到Internet端口号之间的映射表,它的字段包括程序号、版本号、所用协议、端口号和服务名,portmap进程通过这张映射表来提供程序号-端口号之间的转化功能,如果portmap进程停止了运行或异常终止,那么该系统上的所有RPC服务器必须重新启动。首先停止NFS服务器上的所有NFS服务进程,然后启动portmap进程,再启动服务器上的NFS进程。

但portmap只在第一次建立连接的时候起作用,帮助网络应用程序找到正确的通讯端口,但是一旦这个双方正确连接,端口和应用就绑定,portmap也就不起作用了。但对其他任何第一次需要找到端口建立通讯的应用仍然有用。

简单的说,portmap就是应用和端口的婚姻介绍人,双方成事了以后,媒婆就没用了。
NFS优化服务----------------------------------------------------

找到下面这行
[ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=8
修改为
[ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=32
默认的内核参数为:

cat /proc/sys/net/core/rmem_default
126976
cat /proc/sys/net/core/rmem_max
131071
cat /proc/sys/net/core/wmem_default
126976
cat /proc/sys/net/core/wmem_max
131071
修改为:
echo 262144 > /proc/sys/net/core/rmem_default
echo 262144 > /proc/sys/net/core/rmem_max
echo 262144 > /proc/sys/net/core/wmem_default
echo 262144 > /proc/sys/net/core/wmem_max
------------------------------------练习题------------------------------------------
1. NFS配置,需要安装哪些包?
nfs-utils 和 rpcbind
2. 如果不开启rpcbind服务,就启动NFS,会怎么样?

如果不开启rpcbind服务,会报错:rpc.nfsd: writing fd to kernel failed: error 111 (Connection refused)
3. NFS配置文件中,no_root_squash, all_squash, root_squash 分表表示什么含义?

no_root_squash: 在客户端不限制root账号,客户端上root账号对nfs共享目录拥有至高权限
all_squash : 在客户端上限制所有账户,如果不指定anonuid/anongid则默认会把所有账户限定为
nfsnobody
root_squash: 在客户端上限制root账户而不限定其他普通用户,如果不指定anonuid/anongid则默认
会把所有账户限定为nfsnobody
4. 用什么命令来查看某个服务器上的NFS共享信息?

showmount -e 服务端ip
5. 如何把远程的共享NFS挂载到本地?如何查看本机已经共享的NFS资源?

mount -t nfs 服务端ip:/共享目录 /mnt
df -h 查看
6. 在NFS服务器上,假如更改了配置文件,如何不重启NFS服务使配置生效?

exportfs -arv a=全部挂载;r=重新挂载;u=卸载某目录;v=显示共享目录
7. 挂载NFS时,经常加上一个选项 -o nolock, 它的作用是什么呢?

-o nolock 是为了不加文件锁。
8. 请根据需求写成相应的配置:把/data/123/目录共享,针对192.168.10.0/24网段,限制客户端上所有用户,并限定为uid=800,gid=800

/data/123 192.168.10.0/24(rw,sync,all_squash,anonuid=800,anongid=800)
9. 有两种方法可以让客户端开机后自动挂载NFS,是哪两种方法?

第一种方法:把挂载的命令加入到 /etc/rc.local中
第二种方法:在/etc/fstab中加入一行 (服务端IP:/共享目录/ /挂载点 nfs nolock 0 0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux nfs