[关闭]
@cdmonkey 2015-06-08T01:40:22.000000Z 字数 6870 阅读 878

NFS

网络服务


一、简介

注意,该服务本身并没有提供信息传输的协议和功能,但是却能让我们通过网络进行数据的共享,这是因为它使用了一些其它的协议来负责数据的传输。而这些传输协议就用到了RPC服务。可以说该服务本身就是使用RPC的一个程序,或者说它就是一个“RPC Server”。所以只要用到网络文件系统的地方都要启动RPC服务,不论是服务器端或者客户端。这样服务器和客户端才能通过RPC来实现通信端口的连接。

换句话说:NFS是一个文件系统,而RPC用来负责数据的传输。

服务的守护进程使用2049的TCP和2049的UDP端口,其它的端口号则由rpcbind(即CentOS5.x中的portmap)随机提供,rpcbind自己则监听111端口。

优点:

二、安装

1. 安装并启动服务

使用NFS的第一步是搭建NFS服务器。如果服务器端的系统中没有安装RPC及NFS软件包,我们首先要做的事情就是安装这两个软件。

  1. [root@dakang ~]# yum install -y rpcbind
  2. [root@dakang ~]# yum groupinstall -y "NFS file server"

第二步,启动服务并查看服务状态。

  1. #Start RPC:
  2. [root@dakang ~]# /etc/init.d/rpcbind start
  3. [root@dakang ~]# /etc/init.d/rpcbind status
  4. rpcbind (pid 1000) is running...
  5. #Start NFS:
  6. [root@dakang ~]# /etc/init.d/nfs start
  7. [root@dakang ~]# /etc/init.d/nfs status
  8. rpc.svcgssd is stopped
  9. rpc.mountd (pid 1222) is running...
  10. rpc.rquotad (pid 1218) is running...
  11. nfsd (pid 1237 1236 1235 1234 1233 1232 1231 1230) is running...
  12. #关键服务都以运行。

手动启动的顺序很重要,因为服务要向RPC服务进行注册,所以需要先启动RPC,然后再启动NFS服务。当然最好将这两个服务设置为开机自启动。

  1. [root@dakang ~]# chkconfig nfs on
  2. [root@dakang ~]# chkconfig rpcbind on

2. 查看守护进程

通过执行了上述操作过程,服务已经在服务器上正常运行了。当服务启动后,我们可以查看一下后台都有哪些相关的进程在运行:

  1. [root@dakang ~]# ps aux|egrep "(nfs|rpc)"|grep -v grep
  2. rpc 1000 0.0 0.0 18976 968 ? Ss 09:19 0:00 rpcbind
  3. rpcuser 1018 0.0 0.1 23348 1364 ? Ss 09:19 0:00 rpc.statd
  4. root 1209 0.0 0.0 0 0 ? S 09:19 0:00 [rpciod/0]
  5. root 1210 0.0 0.0 0 0 ? S 09:19 0:00 [rpciod/1]
  6. root 1218 0.0 0.0 107308 276 ? Ss 09:19 0:00 rpc.rquotad
  7. root 1222 0.0 0.1 21656 1040 ? Ss 09:19 0:00 rpc.mountd
  8. root 1228 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd4]
  9. root 1229 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd4_callbacks]
  10. root 1230 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  11. root 1231 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  12. root 1232 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  13. root 1233 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  14. root 1234 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  15. root 1235 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  16. root 1236 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  17. root 1237 0.0 0.0 0 0 ? S 09:19 0:00 [nfsd]
  18. root 1258 0.0 0.0 25164 580 ? Ss 09:19 0:00 rpc.idmapd

说明:

进程 说明
rpcbind RPC服务的主进程。所有依赖于RPC的网络服务都需要向该进程进行注册。
rpc.statd 这个进程可以用来检查文件的一致性。
rpciod/0/1 未知。
rpc.rquotad 这个进程对于远程用户提供用户配额信息。
rpc.mountd 该进程的主要功能是管理NFS文件系统。当客户端顺利通过nfsd服务进程登录服务器后,在访问文件系统之前,还必须通过文件使用权限的验证。该进程会读取配置文件“exports”来分配客户端权限。另外,通过该进程,客户端用户可以知道目前有哪些文件系统已被远程服务端装配并启用。
nfsd4 未知。但一定与NFSv4有关。
nfsd4_callbacks 未知。
nfsd 服务的主进程,该守护进程负责处理远程客户端对NFS文件系统的操作请求。通常会有多个进程副本来处理来自不同客户端的操作请求。
rpc.idmapd 该进程为nfsv4的一个守护进程,并使用/etc/idmapd.conf配置文件。当请求加载nfsv4时,该守护进程负责处理UID和GID的映射。
  1. [root@nono data]# cat /proc/mounts | grep mnt
  2. 10.0.1.106:/data /mnt/data nfs rw,relatime,vers=3,...
  3. #看到了吧,我们默认使用的是版本三。

发现了问题,为什么进程类表中会出现多个“nfsd”进程?可以参考下面网址中的内容:
http://docs.oracle.com/cd/E19253-01/819-7059/rfsrefer-11/

文中提到:“与旧版本的该守护进程不同的是,nfsd不会产生用于处理并发请求的多个副本。当使用ps指令检查进程列表时,将仅显示正在运行的守护进程的一个副本。”这里提到的旧版,应该就是指目前我们正在使用的版本三。所以通过上面的进程列表可以看到,守护进程nfsd有好几个副本,而每一个进程同时只处理一个客户端的操作申请,因此在一台网络文件系统服务器上可能会启动多个这样的进程。

3. 版本

既然提到了NFSv4,那我们就来简要的了解一下该服务的各个版本:

http://blog.csdn.net/ycnian/article/details/8515517

4. 服务所涉及到的文件

三、配置

1. 创建共享目录

通过前面的操作,服务软件已经安装,服务进程也已经开始运行,那么接下来要做的就是按实际需求编辑配置文件。该服务的主配置文件是“exports”,其配置格式为:

  1. #shared /data for bbs by oldboy at 2014-08-28
  2. /data 10.0.1.0/24(rw,sync)

注意:在发布共享目录的格式中除了共享目录是必跟参数外,其他参数都是可选的。并且共享目录与客户端之间及客户端与客户端之间需要使用空格符,但是客户端与参数之间是不能有空格。

  1. #shared /data for bbs by oldboy at 2014-08-28
  2. /data 10.0.1.0/24(rw,sync) *(ro)
  3. #上面的配置内容表示,当客户端IP地址属于10.0.1.0/24网段,则挂载该共享目录后针对这个目录具有可读可写的权限;而这个网段之外的主机针对该共享目录只有读的权限。
  4. #可以看到,每一个配置行可以有多个客户端目标,只需用空格符隔开即可。
  5. #注意,通配符仅能用在主机名上,而不能用在IP地址上。
  6. #如果把共享目录仅提供给单一主机,则只需提供正确的IP地址即可:
  7. /oldboy 192.168.1.122(rw,sync)

2. 指定端口

这一步不是必需的,如果不指定端口,则服务在默认情况下有许多进程是没有固定端口的。这样的话就会为防火墙的配置带来麻烦。要把每个启动的服务端口固定下来,需要编辑下面的配置文件:

  1. [root@NFS-C ~]# vim /etc/sysconfig/nfs
  2. #自定义以下端口,然而不能和其他端口冲突:
  3. RQUOTAD_PORT=5001
  4. LOCKD_TCPPORT=5002
  5. LOCKD_UDPPORT=5002
  6. MOUNTD_PORT=5003
  7. STATD_PORT=5004

3. 服务重启

当我们重新编辑主配置文件后,并不能立即生效,需要将服务进行重新加载。

  1. #平滑重启:
  2. [root@dakang ~]# /etc/init.d/nfs reload

注意,服务器端要正常关机需要停止RPC、NFS服务:

  1. [root@dakang ~]# service nfs stop
  2. [root@dakang ~]# service rpcbind stop

4. 检测共享目录

配置文件重新加载后,就意味着我们配置的共享目录正式生效,我们可以在服务端和客户端分别对共享目录进行检测。

  1. #服务器端的自我检测,可以看到,在服务器上检测到共享的文件系统已经生效。
  2. [root@dakang ~]# showmount -e localhost
  3. Export list for localhost:
  4. /data 10.0.1.0/24

5. 查看配置参数

配置文件/var/lib/nfs/etab记录了NFS共享目录的完整权限设定值:

  1. #查看挂载参数:
  2. [root@dakang ~]# cat /var/lib/nfs/etab
  3. /data 10.0.1.0/24(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,
  4. no_all_squash,no_subtree_check,secure_locks,acl,
  5. anonuid=65534,anongid=65534)

查看登录过的客户信息:

  1. [root@dakang ~]# cat /var/lib/nfs/xtab

网络文件系统共享权限参数:

[图]

四、身份验证

1. 身份验证参数

使用root用户登录服务器,在启动身份压缩并制定用户和组的情况下:

  1. [root@dakang data]# cat /etc/exports
  2. #shared /data for bbs by oldboy at 2014-08-28
  3. /data 10.0.1.0/24(rw,all_squash,anonuid=600,anongid=600)
  4. #配置为任何用户均压缩身份,指定的用户为:nfsboy(uid=600)、nfsboy(gid=600)。
  5. [root@dakang data]# ll
  6. total 0
  7. -rw-r--r--. 1 nfsboy nfsboy 0 Aug 29 12:53 006_root_creat.txt
  8. -rw-rw-r--. 1 nfsboy nfsboy 0 Aug 29 13:03 007_cdmonkey.txt
  9. #以上两个文件分别为客户端的root用户和一个普通用户所创建,但在服务器端看来,两个文件的属主和属组均为指定的用户nfsboy。

在客户端查看:

  1. [root@moban data]# ll
  2. -rw-r--r--. 1 600 600 0 Aug 29 2014 006_root_creat.txt
  3. -rw-rw-r--. 1 600 600 0 Aug 29 2014 007_cdmonkey.txt
  4. #在客户端查看一下,结果刚刚创建的两个文件的属主和属组都变成了600,一定是因为目前客户端主机内并没有相应的用户和用户组。
  5. #我很奇怪,如果客户端正好有号码都是600的用户和组,那将会如何显示。

那么如何保留超级用户权限?

  1. /data 10.0.1.0/24(rw,no_root_squash,anonuid=600,anongid=600)
  2. #我们将服务器端的配置进行了更改。
  3. #我们允许超级用户登录后保留其权限,即不对其身份进行压缩。
  4. ----------------------
  5. [root@dakang data]# ll
  6. -rw-r--r--. 1 root root 0 Aug 29 13:20 008_root_creat.txt
  7. #客户端的超级管理员用户创建的文件其属主与属组被保留了。

使用普通用户身份登录服务器:

  1. /data 10.0.1.0/24(rw)
  2. #上面是目前的配置,有关用户身份验证的配置均采用默认值:root_squash,no_all_squash
  3. ----------------------
  4. [root@dakang data]# ll
  5. -rw-rw-r--. 1 556 558 0 Aug 29 14:13 001_cdmonkey.txt
  6. #该文件是普通用户cdmonkey所创建,在服务器端来看,虽然保留了普通用户的UID和GID,但由于服务器上没有与之相对应的用户和组,所以就只能显示号码了。
  7. #普通用户所创建的文件将会是无属主无属组的。

其他的实验就不做了,参见身份验证流程图。
[图]

2. 共享目录的权限

一般情况下由服务器本地的管理员用户创建的共享目录权限默认为:755

drwxr-xr-x. 2 root root

那么除非是客户端的管理员用户被保留了身份,它能够顺利读写外,其他的远程用户要么是匿名用户nfsnobody,要么是被指定的用户,要么是服务器端的普通用户或者是仅仅保留了UID和GID的流浪型用户。总之,在共享目录的属主和属组保持不变的情况下,对于共享目录来说这些远程用户都属于是“其他用户”,所以最后的三个权限位是很重要的。既然是共享,而且还有配置文件中的权限参数(rw/ro)控制,所以共享目录权限设置为777问题是不大的。

3. 服务配置的要点

  1. [root@dakang ~]# man exports

五、客户端挂载

1. 临时挂载

  1. [root@moban ~]# mount -t nfs 10.0.0.200:/data /mnt/data
  2. #最好把文件系统的类型(nfs)写上。

2. 挂载参数

当客户端进行挂载共享目录时,可以同时指定一些挂载参数,这些参数只是客户端在进行挂载时的参数,与服务器端的配置没有关系。

  1. [root@nono data]# mount
  2. ......
  3. 192.168.0.100:/data on /mnt/data type nfs (rw,addr=192.168.0.100)
  4. ----------------------
  5. #通过挂载指令,我们能够看到的挂载参数极其有限。我们可以通过下面的方法查看:
  6. [root@nono ~]# cat /proc/mounts | grep mnt
  7. 10.0.1.106:/data /mnt/data nfs
  8. rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,
  9. proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.0.1.106,
  10. mountvers=3,mountport=54734,mountproto=udp,local_lock=none,
  11. addr=10.0.1.106 0 0
  12. #上面显示的均为挂载后的默认参数。

客户端挂载共享文件目录时还有一些其他的参数:

六、排错

故障现象:

  1. [loguser@view 192.168.40.141]$ cd posp
  2. -bash: cd: posp: Stale NFS file handle

http://blog.itechol.com/space-33-do-blog-id-5650.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注