NFS(Network File System)部署方法

运维技术 jikk345 2549℃ 0评论

一、nfs网络文件系统介绍

NFS是Network File system的缩写,主要功能是通过网络让不同主机系统之间可以彼此共享文件或目录。NFS客户端(一般为应用服务器,如web)可以通过挂载(mount)的方式将NFS服务端共享的数据文件目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地上看,NFS服务端共享的目录就你像是客户端自己的磁盘分区或者目录一样,而实际上确是远端的服务器目录。NFS网络文件系统的使用很像WINDOWS系统的网络共享,网络驱动器映射,这也和Linux里的samba服务类似。

二、nfs服务在企业中的应用场景

企业集权架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件(一般把网站用户上传的文件都放到NFS共享里,例如:BBS产口的图片,附件,头像,注意网站BBS程序不要放NFS共享里),NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站公司应用频率很高。大公司或门户除了使用NFS外,还可能会使用MFS、GFS、FASTFS、TFS等分布式文件系统。

三、nfs服务的工作原理深入浅出讲解

什么是RPC?
NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口才无法固定,而是随机用一些未被使用的端口来作为传输之用,其中Centos 5.x随机端口小于1024,而centos 6.x随机端口是较大的
因为端口不固定,这样一来就会造成NFS客户端与NFS服务端的通讯障碍同,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信交互数据。NFS端口传输是不固定的,通过RPC协议来实现,很多网站都用,百度,淘宝。
要解决上面的通讯问题困扰,就需要远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而可以确定客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。这个RPC服务很类似NFS服务和NFS客户端之间的一个中介。
1

2

四、nfs服务手把手实战讲解

1、NFS服务部署服务器准备

服务器系统 主机名
角色
IP
Centos 6.5
Qinglin-BJ
NFS服务端
172.16.168.200
Centos 6.5
Qinglin-BJ2
NFS客户端
172.16.168.210
Centos 6.5     Qinglin-BJ3 NFS客户端 172.16.168.230

2、NFS软件
要部署NFS服务,需要安装下面的软件包
ⓐnfs-utils:这个NFS服务主程序
包括rpc.nfsd、rpc.mountd两个daemons和相关文档说明及执行命令文件等。
ⓑportmap:Centos 5.x下面的RPC的主程序(Centos 6.X下名子为rpcbind)
NFS可以被视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由portmap(或rpcbind)服务来完成的。
因此,在提供NFS服务之前必须先启动portmap(Centos 6.4 下为rpcbind)服务
3、安装NFS软件
准备工作
检查服务器的系统版本、内核版本、检查是三台是否安装nft和rpcbind

[root@Qinglin-BJ ~]# cat /etc/redhat-release 
CentOS release 6.5 (Final)
[root@Qinglin-BJ ~]# uname -r 
2.6.32-431.el6.x86_64
[root@Qinglin-BJ ~]#  rpm -qa nfs-utils rpcbind  ==>验证RPC、NFS,结果成功!
[root@Qinglin-BJ ~]# 

安装RPC服务

[root@Qinglin-BJ ~]# yum install nfs-utils rpcbind -y ==>安装nfs与rpc,三台服务器同时安装,且安装了7个包
Installed:
  nfs-utils.x86_64 1:1.2.3-70.el6                            rpcbind.x86_64 0:0.2.0-12.el6                           
Dependency Installed:
  keyutils.x86_64 0:1.4-5.el6       libevent.x86_64 0:1.4.13-4.el6         libgssglue.x86_64 0:0.1-11.el6           
  libtirpc.x86_64 0:0.2.1-11.el6    nfs-utils-lib.x86_64 0:1.1.5-11.el6    python-argparse.noarch 0:1.2.1-2.1.el6   
Dependency Updated:
  keyutils-libs.x86_64 0:1.4-5.el6                                                                                   
Complete!
[root@Qinglin-BJ ~]# rpm -qa nfs-utils rpcbind           ==>安装完成,并检查是否安装上,并查看版本
rpcbind-0.2.0-12.el6.x86_64
nfs-utils-1.2.3-70.el6.x86_64

4、启动服务
注:必须先启用RPC服务,他是用来问路的
开启rpc服务

[root@Qinglin-BJ ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]    

查看状态,running中

[root@Qinglin-BJ ~]# /etc/init.d/rpcbind status 
rpcbind (pid  1493) is running...

查看进程开启和端口,rpcbind使用的是111端口

[root@Qinglin-BJ ~]#  ps -ef|grep rpcbind
rpc       1493     1  0 22:08 ?        00:00:00 rpcbind
root      1515  1299  0 22:10 pts/0    00:00:00 grep --color=auto rpcbind
[root@Qinglin-BJ ~]# lsof -i:111
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1493  rpc    6u  IPv4  14734      0t0  UDP *:sunrpc 
rpcbind 1493  rpc    8u  IPv4  14737      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1493  rpc    9u  IPv6  14739      0t0  UDP *:sunrpc 
rpcbind 1493  rpc   11u  IPv6  14742      0t0  TCP *:sunrpc (LISTEN)
[root@Qinglin-BJ ~]# netstat -lntup|grep 111
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1493/rpcbind        
tcp        0      0 :::111                      :::*                        LISTEN      1493/rpcbind        
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1493/rpcbind        
udp        0      0 :::111                      :::*                                    1493/rpcbind  

存放NFS端口的容器

[root@Qinglin-BJ ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

此错误就是RPC服务没开或故障

[root@qinglin]# rpcinfo -p localhost           
rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused 

开启nfs服务

[root@Qinglin-BJ ~]# /etc/init.d/nfs start 
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

检查NFS进程和端口,注nfs的主端口是2049端口

[root@Qinglin-BJ ~]# ps -ef|grep nfs
root      1571     2  0 22:15 ?        00:00:00 [nfsd4]
root      1572     2  0 22:15 ?        00:00:00 [nfsd4_callbacks]
root      1573     2  0 22:15 ?        00:00:00 [nfsd]
root      1574     2  0 22:15 ?        00:00:00 [nfsd]
root      1575     2  0 22:15 ?        00:00:00 [nfsd]
root      1576     2  0 22:15 ?        00:00:00 [nfsd]
root      1577     2  0 22:15 ?        00:00:00 [nfsd]
root      1578     2  0 22:15 ?        00:00:00 [nfsd]
root      1579     2  0 22:15 ?        00:00:00 [nfsd]
root      1580     2  0 22:15 ?        00:00:00 [nfsd]

[root@Qinglin-BJ ~]# netstat -lntup|grep 2049
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 :::2049                     :::*                        LISTEN      -                   
udp        0      0 0.0.0.0:2049                0.0.0.0:*                               -                   
udp        0      0 :::2049                     :::*    

查询rpc已经记录nfs信息,rpc每次重启,nfs都会向rpc汇报,如果重启rpc也要重新启动nfs。

[root@Qinglin-BJ ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  57248  mountd
    100005    1   tcp  47526  mountd
    100005    2   udp  60275  mountd
    100005    2   tcp  60162  mountd
    100005    3   udp  58413  mountd
    100005    3   tcp  33192  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  34664  nlockmgr
    100021    3   udp  34664  nlockmgr
    100021    4   udp  34664  nlockmgr
    100021    1   tcp  45641  nlockmgr
    100021    3   tcp  45641  nlockmgr
    100021    4   tcp  45641  nlockmgr

开机自启动nfs与rpc,一般情况下,rpc是需要先启动的,所以确认一下开机启动的级别
rpcbind,init运行级别2345都开机启动,13是开始顺序,87是停止顺序

[root@Qinglin-BJ ~]# vim /etc/init.d/rpcbind 
#! /bin/sh
#
# rpcbind       Start/Stop RPCbind
#
# chkconfig: 2345 13 87

NFS,init运维级别没有设置,30是开机开始顺序,60是停止顺序

[root@Qinglin-BJ ~]# vim /etc/init.d/nfs
#!/bin/sh
#
# nfs           This shell script takes care of starting and stopping
#               the NFS services.
#
# chkconfig: - 30 60

设置开机自启动,并检查nfs和rpc

[root@Qinglin-BJ ~]# chkconfig nfs on
[root@Qinglin-BJ ~]# chkconfig rpcbind on
[root@Qinglin-BJ ~]# chkconfig --list nfs 
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@Qinglin-BJ ~]# chkconfig --list rpcbind
rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off

5、实战配置NFS服务端
(1)NFS服务端配置文件路径为:/etc/export,并且默认是空的
提示:NFS默认的配置/etc/export,默认是没有内容的,需要进行配置。有些linux版本也可能不提供
/etc/export配置文件,这时需要手动去创建。

[root@Qinglin-BJ ~]# ls -l /etc/exports 
-rw-r--r--. 1 root root 0 Jan 12  2010 /etc/exports

(2)exports配置文件格式
常用的一般是下列第二种。
3
实战修改exports文件
服务端:创建共享并测试本机挂载

[root@Qinglin-BJ ~]# vim /etc/exports   ==>编辑该文件
/data 172.16.168.*(rw,sync)             ==>/data是可以让客户挂载使用的本地目录,172.16.168.*是用来允许该网段访问的,*也可以换成0但是要带上/24的子网,rw读写,sync同步写入到硬盘
[root@Qinglin-BJ ~]# mkdir /data -p     ==>创建/data目录,这个目录是一定真实存在的,不然会报错
[root@Qinglin-BJ ~]# /etc/init.d/nfs reload    ==>平滑重启服务,并不影响用户
[root@Qinglin-BJ ~]# exportfs -rv              ==>和上条/etc/init.d/nfs reload等价,-r也是平滑重启,-v是显示输出
exporting 172.16.168.*:/data
[root@Qinglin-BJ ~]# showmount -e localhost    ==>检查本机是否可以挂载
Export list for localhost:                  
/data 172.16.168.*                              ==>结果已经出来了,可以挂载这个/data并允许的目录,如果客户端无法客户入,可能是本地文件目录权限问题
[root@Qinglin-BJ ~]# mount -t nfs 172.16.168.200:/data /mnt/    ==>mount -t是文件类型,nfs类型,ip:nfs可挂载目录,/mnt本机挂载点
[root@Qinglin-BJ ~]# df -h                                      ==>可以看到nfs挂载点已经挂载到本机上了
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              18G  1.9G   15G  12% /
tmpfs                 495M     0  495M   0% /dev/shm
/dev/sda1             194M   29M  155M  16% /boot
172.16.168.200:/data   18G  1.9G   15G  12% /mnt

客户端:挂载服务器,并模拟他们以后是web客户端。
注:以下是两台客户端同步操作

[root@Qinglin-BJ2 ~]# /etc/init.d/rpcbind start          ==>开启rpcbind服务,不用开启nfs,但是不装nfs不能用nfs工具
Starting rpcbind:                                          [  OK  ]
[root@Qinglin-BJ2 ~]# chkconfig rpcbind on               ==>开机自启动
[root@Qinglin-BJ2 ~]# chkconfig --list rpcbind           ==>检查
rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@Qinglin-BJ2 ~]# showmount -e 172.16.168.200        ==>查看NFS服务器
Export list for 172.16.168.200: 
/data 172.16.168.*
[root@Qinglin-BJ2 ~]# mount -t nfs 172.16.168.200:/data /mnt/   ==>挂载到本地mnt下
[root@Qinglin-BJ2 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              18G  4.4G   13G  26% /
tmpfs                 495M     0  495M   0% /dev/shm
/dev/sda1             194M   29M  155M  16% /boot
172.16.168.200:/data   18G  1.9G   15G  12% /mnt
[root@Qinglin-BJ2 ~]# cat /proc/mounts                ==>查看Mount的nfs挂载详细内容
172.16.168.200:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.168.210,minorversion=0,local_lock=none,addr=172.16.168.200 0 0
[root@Qinglin-BJ2 ~]# cd /mnt/
[root@Qinglin-BJ2 mnt]# ls                            ==>已经可以看到data的内容了
123   a      b.txt       MYSQLfor64Bit@19_412275.exe  qinglin.txt
1234  a.txt  index.html  qinglin1.txt                 seq.txt

排错思路:
(1)客户端已经开启rpc服务,却不能访问nfs,是由于nfs服务器iptables开启的原因,可以关掉也可允许111端口访问

[root@Qinglin-BJ2 ~]# showmount -e 172.16.168.200   
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)  ==>iptables引起
在nfs服务器上关闭iptables 
[root@Qinglin-BJ ~]# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
客户端再进行showmount -e
[root@Qinglin-BJ2 ~]# ping 172.16.168.200          ==>测试网络连通性
PING 172.16.168.200 (172.16.168.200) 56(84) bytes of data.
64 bytes from 172.16.168.200: icmp_seq=1 ttl=64 time=0.871 ms
[root@Qinglin-BJ2 ~]# telnet 172.16.168.200 111    ==>telnet111端口
Trying 172.16.168.200...
[root@Qinglin-BJ2 ~]# showmount -e 172.16.168.200
Export list for 172.16.168.200:
/data 172.16.168.*

(2)无法写入内容或删除,是由于权限的问题,由于之前exports定义的内容很少,所以/data的uid和gid都是root,而nfs则是下面的的65534

[root@Qinglin-BJ mnt]# cat /var/lib/nfs/etab 
/data   172.16.168.*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

解决方法就是将data目录改变属主nfs客户端就可以正常读写了

[root@Qinglin-BJ /]# chown -R nfsnobody.nfsnobody /data/
[root@Qinglin-BJ /]# ll /data/
total 408
-rw-r--r--. 1 nfsnobody nfsnobody      0 May  9 23:56 123

(3)注意事宜,开机自启动如果挂载一定要将/etc/rc.local里,linux里,fstab是先启动的,网络是后启动的,网络还没启动fatab是无法挂载的。本地磁盘是无所谓的。

[root@Qinglin-BJ2 mnt]# echo "/bin/mount -t nfs 172.16.168.200:/data /mnt/" >>/etc/rc.local 
[root@Qinglin-BJ2 mnt]# tail -1 /etc/rc.local 
/bin/mount -t nfs 172.16.168.200:/data /mnt/

转载请注明:清麟博客 » NFS(Network File System)部署方法

喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址