首页 > 代码库 > NFS网络文件共享服务介绍及案例

NFS网络文件共享服务介绍及案例

1、NFS介绍
1.1、NFS概念描述
    什么是NFS?NFS是Network File System的缩写,它的主要功能是通过网络让不同的主机系统之间可以彼此共享文件或者目。NFS客户端(一般为应用服务器,如Web)可以通过挂载(mount)的方式将NFS服务器端共享的数据文件目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地上看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上确是远端的服务器目录。
1.2、NFS历史

    第一个网络文件系统 — 称为 File Access Listener — 由 Digital Equipment Corporation(DEC)在 1976 年开发。Data Access Protocol(DAP)的实施,这是 DECnet 协议集的一部分。比如 TCP/IP,DEC 为其网络协议发布了协议规范,包括 DAP。

  NFS 是第一个现代网络文件系统(构建于 IP 协议之上)。NFS于1984年由 Sun Microsystems 推出不久即广为业界及学术界所接受。尽管当时不同的大学及实验室已研发了多种分布式文件系统,然而 NFS 是第一个能够于学术及商业上成功应用的产品。其后升阳为了使 NFS 成为一种标准,于1989年正式公开发布其接口,使得更多厂商能够把 NFS 加入其产品之中。NFS 是一个成功的文件共享方法,但它最大的问题是它不太适合于大型的分布式系统。

  标准持续地演化为 NFSv3,在 RFC 1813 中有定义。这一新的协议比以前的版本具有更好的可扩展性,支持大文件(超过 2GB),异步写入,以及将 TCP 作为传输协议,为文件系统在更广泛的网络中使用铺平了道路。在 2000 年,RFC 3010(由 RFC 3530 修订)将 NFS 带入企业设置。Sun 引入了具有较高安全性,带有状态协议的 NFSv4(NFS 之前的版本都是无状态的)。今天,NFS 是版本 4.1(由 RFC 5661 定义),它增加了对跨越分布式服务器的并行访问的支持(称为 pNFS extension)。

2、NFS在企业中的应用场景
    在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件(一般把网站用户上传的文件都放到NFS共享里,例如:BBS产品的图片、附件、头像),NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站公司应用频率很高。大公司或者门户网站除了使用NFS外,还可能使用MFS、GFS、FASTFS、TFS等分布式文件系统,有关分布式文件系统,可参考相关书籍。
 
3、NFS挂载原理详细介绍
    当我们在NFS服务器端设置好一个共享存储目录/vido后,其它的有权限访问NFS服务器端的NFS客户端可以讲这个共享目录/vido,挂载到NFS客户端本地系统上的某个挂载点,不同的客户端的挂载点可以不同。
    当客户端正确挂载完毕后,进入到指定NFS客户端的/v/vido或/vido目录,就可以看到NFS服务器端的/vido共享出来的目录下的所有数据,在客户端服务器上查看,看起来NFS服务器端的/vido目录就相当于NFS客户端本地的磁盘分区或目录一样,几乎感觉不到使用上的区别,根据NFS服务端授予的NFS共享权限以及共享目录的本地系统权限,只要在指定的NFS客户端操作挂载/v/vido或/vido的目录,就可以将数据轻松的存取到NFS服务器端上的/vido目录中了。
    挂载NFS后,NFS客户端本地的挂载内容显示如下所示:
    如上所示,从挂载来看,和本地磁盘分区几乎没有什差别,只是文件系统列的开头是IP地址开头的形式。
    经过上面介绍,我们知道NFS系统是通过网络来进行数据传输的(所以叫网络文件系统嘛!!!)。
 
4、什么是RPC(Remote Procedure Call)
    因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,没启动一个功能就会启动一些端口来传输数据,因此,NFS的功能所对应的端口才无法固定,而是随机取用一些未被使用的端口来作为传输之用。其中Centos5.x随机端口为小于1024的,而Centos6.x随机端口都是较大的。
    因为端口的不固定,这样会造成NFS的客户端和NFS的服务端通信障碍,因为NFS客户端必须知道NFS服务端的数据传输端口才能进行数据传输。
    要解决上面通讯问题困扰,就需要远程过程调用RPC服务来帮忙了。NFS的RPC服务最主要的功能就是记录每个NFS功能对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端。从而可以确保客户端可以连接到正确的NFS端口上去,达到数据传世的目的。RPC服务类似于NFS客户端和NFS服务端的一个中介。
    当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程大致如下几点:
    1)、首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能的询问请求,这时NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的询问请求。
    2)、N FS服务器端的RPC服务找到对应已注册的NFS daemon端口后,通知NFS客户端的RPC服务。
    3)、此时NFS客户端就可获取到正确的端口,然后就直接与NFS daemon联机存取数据了。
    4)、NFS客户端把数据存取成功后,返回给前端访问程序,告知给用户存取结果,作为网站用户,我们就完成了一次存取操作。
    由于NFS的各项功能都需要向RPC服务注册,所以RPC服务才能获取到NFS服务的各项功能对应的端口号、PID、NFS在主机所监听的IP等,而NFS客户端才能够通过向RPC询问,从而找到正确的端口。也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。由上面的描述推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务,NFS服务只有需在服务端后于RPC服务启动,客户端无需启动NFS服务。
    注意:NFS的RPC服务,在Centos5.x下名称为portmap,在Centos6.x下的名称为rpcbind。
 
5、NFS实战 
5.1.1、NFS服务端环境准备
C6.4 X86_64
NFS客户端
192.168.142.130
C6.4 X86_64
NFS服务端
192.168.142.131
5.1.2、Centos6.4 X86_64模拟环境
    操作系统版本:
 [root@nfsserver ~]# cat /etc/redhat-release 
CentOS release 6.4 (Final)

    内核版本信息:

[root@nfsserver ~]# uname -n
nfsserver
[root@nfsserver ~]# uname -r
2.6.32-358.el6.x86_64
[root@nfsserver ~]# uname -m
x86_64
[root@nfsserver ~]# uname -a
Linux nfsserver 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
 
5.2.1、NFS软件
    要部署NFS服务,需要安装下面的软件包:
  • nfs-utils:NFS服务主程序。包括rpc.nfsd、rpc.mountd两个daemons和相关文档说明及执行命令文件等。
  • rpcbind:Centos6.x下面RPC主程序(Centos5.x下名字为portmap)。
    NFS可以被视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由portmap(rpcbind)来完成的。因此,在提供NFS服务之前必须先启动portm(rpcbind)服务。
 
5.2.2、查看NFS软件包
查看默认情况下NFS软件的安装情况
      
rpm -aq nfs-utils portmap rpcbind

安装NFS方法:

yum groupinstall "NFS file server" -y或yum install nfs-utils rpcbind -y

 

5.3.1、启动NFS相关服务
服务端:
 1 [root@nfsserver ~]# /etc/init.d/rpcbind start   --启动rpcbind服务 2 Starting rpcbind: [ OK ] 3 [root@nfsserver ~]# /etc/init.d/rpcbind status  4 rpcbind (pid 2105) is running... 5 [root@nfsserver ~]# /etc/init.d/nfs start   --启动nfs服务 6 Starting NFS services: [ OK ]  7 Starting NFS quotas: [ OK ]  8 Starting NFS mountd: [ OK ]  9 Starting NFS daemon: [ OK ] 10 Starting RPC idmapd: [ OK ]11 [root@nfsserver ~]# /etc/init.d/nfs status 12 rpc.svcgssd is stopped13 rpc.mountd (pid 2160) is running...14 nfsd (pid 2175 2174 2173 2172 2171 2170 2169 2168) is running...15 rpc.rquotad (pid 2156) is running...16 [root@nfsserver ~]# chkconfig nfs on   --开启nfs服务17 [root@nfsserver ~]# chkconfig rpcbind on  --开启nfs服务18 [root@nfsserver ~]# chkconfig --list nfs 19 nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off 20 [root@nfsserver ~]# chkconfig --list rpcbind 21 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 

客户端:
1 [root@nfsclient ~]# /etc/init.d/rpcbind start   --开启rpcbind服务2 [root@nfsclient ~]# /etc/init.d/rpcbind status 3 rpcbind (pid 2105) is running... 4 [root@nfsclient ~]# chkconfig rpcbind on   --开机启动rpcbind服务5 [root@nfsclient ~]# chkconfig --list rpcbind 6 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 

 
NFS实战总结:
NFS服务端:
1、打印系统版本和内核信息
[root@nfsserver ~]# cat /etc/redhat-release CentOS release 6.4 (Final)[root@nfsserver ~]# uname -r2.6.32-358.el6.x86_64[root@nfsserver ~]# uname -mx86_64[root@nfsserver ~]# uname -aLinux nfsserver 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

 

2、安装rpc服务并检查
[root@nfsserver ~]# rpm -aq nfs-utils portmap rpcbind [root@nfsserver ~]# [root@nfsserver ~]# yum install nfs-utils rpcbind -y  --yum groupinstall "NFS file server"[root@nfsserver ~]# rpm -aq nfs-utils portmap rpcbind rpcbind-0.2.0-11.el6.x86_64 nfs-utils-1.2.3-39.el6_5.3.x86_64

 

3、启动RPC及NFS服务并检查
 1 [root@nfsserver ~]# /etc/init.d/rpcbind start  2 Starting rpcbind: [ OK ] 3 [root@nfsserver ~]# ps -ef|grep rpc  4 rpc 2105 1 0 22:06 ? 00:00:00 rpcbind  5 root 2111 1885 0 22:07 pts/0 00:00:00 grep rpc 6 [root@nfsserver ~]# 7 [root@nfsserver ~]# /etc/init.d/rpcbind status  8 rpcbind (pid 2105) is running... 9 [root@nfsserver data]# rpcinfo -p localhost 10 program vers proto port service 11 100000 4 tcp 111 portmapper 12 100000 3 tcp 111 portmapper 13 100000 2 tcp 111 portmapper 14 100000 4 udp 111 portmapper 15 100000 3 udp 111 portmapper 16 100000 2 udp 111 portmapper17  18 [root@nfsserver ~]# /etc/init.d/nfs start 19 Starting NFS services: [ OK ] 20 Starting NFS quotas: [ OK ] 21 Starting NFS mountd: [ OK ] 22 Starting NFS daemon: [ OK ] 23 Starting RPC idmapd: [ OK ]24 [root@nfsserver data]# rpcinfo -p localhost 25 program vers proto port service 26 100000 4 tcp 111 portmapper 27 100000 3 tcp 111 portmapper 28 100000 2 tcp 111 portmapper 29 100000 4 udp 111 portmapper 30 100000 3 udp 111 portmapper 31 100000 2 udp 111 portmapper 32 100011 1 udp 875 rquotad 33 100011 2 udp 875 rquotad 34 100011 1 tcp 875 rquotad 35 100011 2 tcp 875 rquotad 36 100005 1 udp 44185 mountd 37 100005 1 tcp 35754 mountd 38 100005 2 udp 49907 mountd 39 100005 2 tcp 59112 mountd 40 100005 3 udp 50792 mountd 41 100005 3 tcp 60474 mountd 42 100003 2 tcp 2049 nfs 43 100003 3 tcp 2049 nfs 44 100003 4 tcp 2049 nfs 45 100227 2 tcp 2049 nfs_acl 46 100227 3 tcp 2049 nfs_acl 47 100003 2 udp 2049 nfs 48 100003 3 udp 2049 nfs 49 100003 4 udp 2049 nfs 50 100227 2 udp 2049 nfs_acl 51 100227 3 udp 2049 nfs_acl 52 100021 1 udp 50898 nlockmgr 53 100021 3 udp 50898 nlockmgr 54 100021 4 udp 50898 nlockmgr 55 100021 1 tcp 39373 nlockmgr 56 100021 3 tcp 39373 nlockmgr 57 100021 4 tcp 39373 nlockmgr

 

4、设置开机自启动
1 [root@nfsserver ~]# chkconfig nfs on   --开启nfs服务2 [root@nfsserver ~]# chkconfig rpcbind on  --开启nfs服务3 [root@nfsserver ~]# chkconfig --list nfs 4 nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off 5 [root@nfsserver ~]# chkconfig --list rpcbind 6 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 

 
5、配置共享/data目录
1 [root@nfsserver ~]# mkdir /data2 [root@nfsserver ~]# chowm -r nfsclient.nfsclient /data3 [root@nfsserver ~]# cat >>/etc/exports<<EOF4 #shared data for bbs by arvin at 201410105 /data 192.168.142.0/24(rw,sync)6 EOF7 [root@nfsserver ~]# cat /etc/exports 8 #shared data for bbs by arvin at 20141010 9 /data 192.168.142.0/24(rw,sync)

 

6、平滑加载NFS服务并检查服务
[root@nfsserver ~]# /etc/init.d/nfs reload[root@nfsserver ~]# showmount -e localhost Export list for localhost: /data 192.168.142.0/24

 

 

 
NFS客户端:
1、打印系统版本和内核信息
1 [root@nfsclient ~]# cat /etc/redhat-release 2 CentOS release 6.4 (Final)3 [root@nfsclient  ~]# uname -r4 2.6.32-358.el6.x86_645 [root@nfsclient   ~]# uname -m6 x86_64[root@nfsclient ~]# uname -a7 Linux nfsserver 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

2、安装rpc服务并检查
1 [root@nfsclient ~]# rpm -aq nfs-utils portmap rpcbind 2 [root@nfsclient ~]# 3 [root@nfsclient ~]# yum install nfs-utils rpcbind -y  --yum groupinstall "NFS file server"4 [root@nfsclient ~]# rpm -aq nfs-utils portmap rpcbind 5 rpcbind-0.2.0-11.el6.x86_64 6 nfs-utils-1.2.3-39.el6_5.3.x86_64

 

3、启动rpc服务并检查
1 [root@nfsclient  ~]# /etc/init.d/rpcbind start 2 Starting rpcbind: [ OK ]3 [root@nfsclient  ~]# /etc/init.d/rpcbind status 4 rpcbind (pid 2105) is running...

 

4、设置开机自启动并检查
1 [root@nfsclient ~]# chkconfig rpcbind on 2 [root@nfsclient ~]# chkconfig --list rpcbind 3 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 

5、检查服务端NFS是否能成功访问
1 [root@nfsclient ~]# showmount -e 192.168.142.131 2 Export list for 192.168.142.131: 3 /data 192.168.142.0/24

 

6、挂载并测试
1 [root@nfsclient ~]# mount -t nfs 192.168.142.131:/data /mnt 2 [root@nfsclient ~]# df -h 3 Filesystem Size Used Avail Use% Mounted on 4 /dev/sda3 5.8G 1.5G 4.0G 28% / 5 tmpfs 373M 0 373M 0% /dev/shm 6 /dev/sda1 194M 28M 156M 16% /boot 7 192.168.142.131:/data 5.8G 1.6G 4.0G 28% /mnt
自此,配置完成。如果遇到错误:clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host),可能是有雨防火墙设置。请关闭防火墙或者向防火墙配置添加相应端口即可。

NFS网络文件共享服务介绍及案例