第1章 NFS介绍
1.1 什么是NFS
NFS是Network File System的缩写,中文意思是网络文件系统
它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录
NFS==网络共享文件系统
互联网中小型网站集群架构后端常用NFS进行数据共享
如果大型网站,那么有可能还会用到更复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS
扩展:NFS网络文件系统很像Windows系统的网络共享,但是无法部署在windows系统上,NFS服务
只能应用在Linux系统上,FTP 、Samba服务均都支持Linux和window
1.2 NFS在企业中的应用场景
1.2.1 为什么要用这个NFS软件?
实现web集群中服务器数据一致性
a. 实现数据信息的共享
b. 实现数据信息的一致

NFS在网络文件共享服务作用总结:

  1. 负载均衡设备会将访问流量,进行分流,但不便于文件和数据的互相访问;
  2. 利用服务器间的数据同步可以使用户之间数据互访,但同步管理操作过于复杂;
  3. 利用NFS服务器可以统一管理数据,使用户之间可以顺利互访
    1.3 共享存储服务分类
    硬件存储:IBM oracle(sun)EMC(去IOE)
    软件存储:NFS mfs ftp samba
    第2章 NFS共享系统原理
    2.1 NFS系统挂载结构

    简单描述NFS工作原理:

    1. 部署好NFS服务,在NFS服务端创建一个video共享目录
    2. web服务器(NFS客户端)创建一个本地video目录,作为一个挂载点
    3. web服务器通过mount命令实现网络挂载,将nfs服务器上video目录挂载到本地video目录挂载点上
    4. web服务器(NFS客户端)上在video目录中,增加 删除 修改数据的操作,都等价于在NFS服务端
      video 目录中的操作
      2.2 什么是RPC(Remote Procedure Call)
      2.2.1 简单理解

    根据上图可以简单理解RPC相当于中介服务:
    默认NFS服务启动会产生多个进程,多个端口号信息,并且产生的多个端口号信息会在服务重启时,发生变化,因此不便于nfs客户端进行连接访问
    在拥有rpc服务端之后,可以让nfs客户端直接访问rpc服务,提供中介服务,便于nfs客户端进行连接访问
    2.2.2 没有RPC服务的状况
    因每个服务进程对应的端口号不同,并且是随机的,所有对于客户端来说不知道该访问哪个端口。

2.2.3 有RPC服务的情况
NFS服务端的每个服务进程都会向RPC服务进程注册,客户端也只需访问RPC服务的111端口即可,由RPC服务来告诉客户端访问服务的端口号。

2.2.4 标准工作流程图

NFS服务工作流程图:

  1. 启动rpc服务,建立中介服务
  2. 启动nfs服务,开启进程信息(房源信息),向rpc服务进行注册
  3. rpc服务接收到nfs服务进程信息(房源信息)
  4. nfs客户端向rpc服务发出请求(访问共享目录)
  5. rpc服务响应nfs客户端请求
  6. nfs客户端与nfs服务端共享目录建立网络连接,实现数据网络存储

当访问程序通过NFS客户端向NFS服务器存取文件时,其请求数据流程大致如下:

  1. 首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
  2. NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)。
  3. 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据。
  4. NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果,作为网站用户,就完成了一次存取操作。
    更多的NFS相关信息可以参考:
    http://www.citi.umich.edu/projects/nfsv4/linux/
    http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html
    http://www.ibm.com/developerworks/cn/linux/l-network-filesystems/
    http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
    第3章 NFS网络共享文件系统服务部署流程
    3.1 NFS服务端部署流程
    3.1.1 第一个里程:检查nfs服务相关软件是否安装
    rpm -qa|grep -E "nfs-utils|rpcbind"
    yum install -y nfs-utils rpcbind
    [root@nfs01 ~]# rpm -qa|grep -E "nfs-utils|rpcbind"
    [root@nfs01 ~]# yum install -y nfs-utils rpcbind
    [root@nfs01 ~]# rpm -qa|grep -E "nfs-utils|rpcbind"
    nfs-utils-lib-1.1.5-13.el6.x86_64
    rpcbind-0.2.0-13.el6_9.1.x86_64
    nfs-utils-1.2.3-75.el6_9.x86_64
    3.1.2 第二个里程:编写nfs服务配置文件
    NFS服务的默认配置文件/etc/exports是安装完软件就有的,并且默认是空的,需要用户自行配置。
    vim /etc/exports
  5. 定义共享目录 ---------> /data
  6. 定于允许使用共享目录的主机或网段地址信息
  7. 定义共享目录权限信息(注意:“24和(”之间没有空格)
    /data 172.16.1.0/24(rw,sync,all_squash)
    [root@nfs01 ~]# vim /etc/exports

    01.定义共享目录 02.定于允许使用共享目录的主机或网段地址信息(03.定义共享目录权限信息)

    /data 172.16.1.0/24(rw,sync,all_squash)
    3.1.3 第三个里程:创建共享目录
    mkdir /data
    chown -R nfsnobody.nfsnobody /data/
    [root@nfs01 ~]# mkdir /data
    [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/
    [root@nfs01 ~]# ll /data/ -d
    drwxr-xr-x 2 nfsnobody nfsnobody 4096 Jan 24 12:11 /data/
    nfsnobody是默认用户
    3.1.4 第四个里程:启动nfs相关服务
    /etc/init.d/rpcbind start
    /etc/init.d/nfs start
    [root@nfs01 wuhuang]# /etc/init.d/rpcbind start
    Starting rpcbind: [ OK ]
    [root@nfs01 wuhuang]# /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 ]
    注意:要先启动rpcbind ,后启动 nfs

3.1.5 第五个里程:本地检查测试
rpcinfo -p 172.16.1.31 ---检查rpc服务中是否有注册的进程服务和对应端口号信息
showmount -e 172.16.1.31 ---检查是否有可以共享的目录
[root@nfs01 wuhuang]# rpcinfo -p 172.16.1.31
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 62058 mountd
100005 1 tcp 53154 mountd
100005 2 udp 22521 mountd
100005 2 tcp 30878 mountd
100005 3 udp 56674 mountd
100005 3 tcp 12281 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 9976 nlockmgr
100021 3 udp 9976 nlockmgr
100021 4 udp 9976 nlockmgr
100021 1 tcp 24261 nlockmgr
100021 3 tcp 24261 nlockmgr
100021 4 tcp 24261 nlockmgr
[root@nfs01 wuhuang]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
3.2 NFS客户端部署流程
3.2.1 第一个里程碑:确认是否安装nfs服务相关软件
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install nfs-utils rpcbind -y
[root@backup ~]# rpm -qa|grep -E "nfs-utils|rpcbind"
nfs-utils-lib-1.1.5-13.el6.x86_64
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
3.2.2 第二个里程碑:检查局域网中是否存在共享存储服务(目录)
rpcinfo -p 172.16.1.31 ---rpcinfo命令需要安装rpcbind软件才能拥有
showmount -e 172.16.1.31
[root@backup ~]# rpm -qf which rpcinfo
rpcbind-0.2.0-13.el6_9.1.x86_64
[root@backup ~]# rpm -qf which showmount
nfs-utils-1.2.3-75.el6_9.x86_64
[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
3.2.3 第三个里程碑:实现共享目录应用(网络挂载应用)
当客户端没有安装nfs相关软件
挂载失败:没有安装nfs相关软件
[root@wuhuang ~]# mount -t nfs 172.16.1.31:/data/ /mnt/
mount: wrong fs type, bad option, bad superblock on 172.16.1.31:/data/,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount. helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so
当客户端安装了nfs相关软件
挂载成功:安装好nfs先关软件
[root@backup ~]# mount -t nfs 172.16.1.31:/data/ /mnt/
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 1.5G 17G 9% /
tmpfs 238M 0 238M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
172.16.1.31:/data/ 20G 1.5G 17G 9% /mnt
第4章 NFS服务常见进程详解
[root@nfs01 ~]# ps -ef |egrep "rpc|nfs"
rpc 1833 1 0 10:41 ? 00:00:00 rpcbind
root 1869 2 0 10:41 ? 00:00:00 [rpciod/0]
root 1878 1 0 10:41 ? 00:00:00 rpc.rquotad < -磁盘配额进程(remote quote server)
root 1883 1 0 10:41 ? 00:00:00 rpc.mountd < - 权限管理验证等(NFS mount daemon)
root 1890 2 0 10:41 ? 00:00:00 [nfsd4]
root 1891 2 0 10:41 ? 00:00:00 [nfsd4_callbacks]
root 1892 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主进程
root 1893 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主进程,管理登录,
ID身份判别
root 1894 2 0 10:41 ? 00:00:00 [nfsd]
root 1895 2 0 10:41 ? 00:00:00 [nfsd]
root 1896 2 0 10:41 ? 00:00:00 [nfsd]
root 1897 2 0 10:41 ? 00:00:00 [nfsd]
root 1898 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主进程
root 1899 2 0 10:41 ? 00:00:00 [nfsd]
root 1930 1 0 10:41 ? 00:00:00 rpc.idmapd < - name mapping daemon 用户压缩/用户映射(记录)
root 2509 1231 0 17:42 pts/0 00:00:00 egrep rpc|nfs

服务或进程名
用途说明
nfsd(rpc.nfsd)
rpc.nfsd的主要功能是管理NFS客户端是否能够登入NFS服务器端主机,其中还包括登入者的ID判别等

mountd (rpc mountd)
rpc.monutd的主要功能则是管理NFS文件系统,当NFS客户端顺利通过rpc.nfsd登入NFS服务器端主机时,在使用NFS服务器提供数据之前,它会读NFS的配置文件/etc/esports来对比NFS客户端的权限,通过这一关之后,还要经过NFS服务器端本地文件系统使用权限(就是owner、group、other权限)等认证程序。如果都通过了,NFS客户端就可以取得使用NFS服务器端文件的权限。
注意:这个/etc/exports文件也是我们用来管理NFS共享目录的使用权限与安全设置的地方,特别强调,NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关

rpc.lockd (非必要)
用来锁定文件,用于多客户端同时写入
rpc.statd(非必要)
检查文件的一致性,与rpc.lockd有关。c 、d 两个服务需要客户端,服务器端同时开启才可以;rpc.statd监听来自其他主机重启的通知,并且管理当本地系统重启时主机列表
rpc.idmapd
名字映射后台进程
重点掌握:
rpc.statd主要作用:检查数据存储的一致性
rpc.rquotad主要作用:控制磁盘配额
rpc.mountd主要作用:核对/etc/exports配置文件中的权限,和NFS服务器端本地文件系统权限
rpc.idpamd主要作用:实现用户压缩/映射(经用户压缩后,身份转换为nfsnobody)
第5章 NFS服务配置文件格式信息说明
/etc/exports文件配置格式为:
NFS共享目录 NFS客户端地址1(参数1,参数2,...) 客户端地址2(参数1,参数2,...)

NFS 共享目录 NFS客户端地址(参数1,参数2,...)
查看exports语法文件格式帮助的方法为:
执行man exports 命令,然后切换到文件结尾,可以快速查看如下样例格式:
EXAMPLE

sample /etc/exports file

   /               master(rw) trusty(rw,no_root_squash)
   /projects       proj*.local.domain(rw)
   /usr            *.local.domain(ro) @trusted(rw)
   /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
   /pub            *(ro,insecure,all_squash)
   /srv/www        -sync,rw server @trusted @external(ro)
   /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
   /build          buildhost[0-9].local.domain(rw)

5.1 NFS共享目录:
为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
5.2 NFS客户端地址
为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址。还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务的业务服务器,例如:web服务。

5.3 权限参数集
对授权的NFS客户端的访问权限设置。
nfs权限(共享目录) nfs配置的/etc/exports /data 172.16.1.0/24(rw)
本地文件系统权限, 挂载目录的权限rwxr-xr-x root root /data
5.3.1 重要配置文件参数说明——权限相关
参数名称
参数用途
rw < -重点掌握
read-write,表示可读可写模式---设置共享目录读写模式
ro
read-only,表示只读权限---设置共享目录只读模式

sync < -重点掌握
请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。
优点:数据安全不会丢;缺点:性能比不启动该参数要差
---采用同步方式存储数据,存储数据到硬盘中

async < -重点掌握
写入时数据会先写到内存缓冲区,直到硬盘有空挡才会写人磁盘,这样可以提升写入效率!风险为若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS,AB(双路电源)不间断电源)!
停电---ups---发电机
---采用异步方式存储数据,存储数据到内存中
no_root_squash
保持root用户不进行压缩
访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限,这个配置原本是为无盘客户端准备的,用户应避免使用。
root_squash
如果访问NFS Server共享目录的用户是root,则它的权限将被压缩成匿名用户,同时,它的UID和GID通常会变为nfsnobody账号身份

all_squash < -重点掌握
不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用
在生产中配置NFS的重要技巧

  1. 确保所有客户端服务器对NFS共享目录具备相同的用户访问权限。
    a. all_squash把所有客户端都压缩成固定的匿名用户(UID相同)
    b. 就是anonuid,anongid指定的UID和GID的用户
  2. 所有的客户端和服务器端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)

总结:

  1. rw参数:可读写
  2. ro参数:只读
    /data 172.16.1.0(ro,sync,all_squash) :ro权限给开发人员用于读取配置文件,而不能修改
  3. sync参数的作用:同步,保证数据的可靠性
  4. async参数:ups AB双路电源
    5.3.2 用户压缩映射相关参数
  5. no_all_squash参数:所有用户都不映射(什么身份过来就是什么身份)
  6. all_squash参数:所有用户都映射(成指定nfsnobody)
  7. root_squash参数:root用户映射(成指定nfsnobody)
  8. no _root_squash参数:不对root用户映射(进来NFS服务器后是root身份,权限 很大)

注意:
/etc/init.d/nfs reload ---平滑重启(只是重新加载了配置文件,已有的连接不会断开)
/etc/init.d/nfs restart ---重启(重新将服务关闭再开启,已有的连接会断开)

5.4 企业生产环境常见NFS案例

5.5 企业实战需求

  1. /data/共享目录权限固定为www用户管理
  2. 在nfs配置文件中,设置all_squash全部用户都映射参数
  3. 让nfs客户端可以向共享目录存储数据
    5.5.1 第一个里程:设置/data/权限信息
    chown -R www.www /data/
    [root@nfs01 ~]# chown -R www.www /data/
    [root@nfs01 ~]# ll -d /data/
    drwxr-xr-x 2 www www 4096 Jan 25 21:04 /data/
    5.5.2 第二个里程:编写nfs配置文件
  4. 查看www用户的UID,GID信息
    id www
    [root@nfs01 ~]# useradd -s /sbin/nologin -M www -u 502
    [root@nfs01 ~]# id www
    uid=502(www) gid=502(www) groups=502(www)
  5. 编辑配置文件:vim /etc/exports
    /data 172.16.1.0/24(rw,sync,all_squash,anonuid=502,anongid=502)
  6. 平滑重启:
    /etc/init.d/nfs reload
    anonuid和anongid参数作用说明:
    将客户端所有用户,映射为指定用户,而不再是默认nfsnobody用户了
    ps:两点注意
    1. 客户端要有nfs配置文件anonuid或者anongid指定用户,此处是www
    2. 客户端和服务端创建默认映射用户,uid和gid信息需要保持一致,即客户端的www用户的UID和
      GID也要是502

5.5.3 第三个里程:重新挂载共享目录
(1) 先卸载 umount /mnt
(2) 再挂载 mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 1.5G 17G 9% /
tmpfs 238M 0 238M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
172.16.1.31:/data 20G 1.5G 17G 9% /mnt
5.5.4 第四个里程:进行数据存储测试
创建测试文件查看属主信息是否为www
[root@backup mnt]# touch /mnt/wuhuang.txt
[root@backup mnt]# ll /mnt/wuhuang.txt
-rw-r--r-- 1 www www 0 Jan 25 21:04 /mnt/wuhuang.txt
服务端
[root@nfs01 ~]# ll /data/wuhuang.txt
-rw-r--r-- 1 www www 0 Jan 25 21:04 /data/wuhuang.txt

第1章 回顾及练习
1.1 回顾总结
1.1.1 NFS存储服务是什么?
网络文件系统,实现数据共享统一一致
1.1.2 NFS工作原理

  1. 什么是rpc服务
    rpc服务类似于中介,nfs服务将启动的进程和端口信息,向rpc服务进行注册
    nfs客户端向rpc服务发出请求,进行共享目录挂载,从而实现通过网络存储数据信息
  2. 服务端做了三件事:
    ①. 首先启动rpc服务
    ②. 其次启动nfs服务
    ③. nfs服务向rpc服务进行注册,只注册一次(如果nfs服务进行了重启,会再次注册)
  3. 客户端做了三件事:
    ①. 启动rpc服务(可以不用启动)
    ②. 利用tcp协议,与nfs服务端rpc服务(111端口)建立网络连接
    ③. 利用mount命令进行网络存储设备挂载
    1.1.3 NFS服务部署流程
  4. 服务端部署流程:
  5. 检查服务软件是否正确安装,进行软件安装
  6. 编写nfs配置文件
  7. 创建共享存储目录,并进行授权
  8. 启动nfs相关服务(先启动rpcbind服务 再启动nfs服务)
  9. 检查服务启动情况
    rpcinfo -p 172.16.1.31 ---检查nfs服务是否向rpc服务进行注册
    showmount -e 172.16.1.31 ---检查nfs服务端是否有可以使用的共享目录
  10. 客户端部署流程:
  11. 检查服务软件是否正确安装,进行软件安装
  12. 检查服务启动情况
    rpcinfo -p 172.16.1.31 ---检查nfs服务是否向rpc服务进行注册
    showmount -e 172.16.1.31 ---检查nfs服务端是否有可以使用的共享目录
  13. 进行网络挂载
    mount -t nfs 172.16.1.31:/data /mnt
    1.1.4 NFS配置文件编写说明

    1. 配置共享目录信息
    2. 设置允许网络共享目录的主机或网络信息
    3. 设置共享目录权限和相关参数
      1.1.5 配置文件中重要参数说明
      rw ---共享目录权限为读写
      ro ---共享目录权限为只读
      sync ---将数据同步存储到硬盘中(经过内存之后存储到硬盘)
      async ---将数据异步存储到内存中
      root_squash ---root进行压缩映射
      no_root_squash ---root用户不进行压缩映射
      all_squash ---全部用户进行压缩映射
      no_all_squash ---全部用户不进行压缩映射
      anonuid ---修改默认映射用户信息,将默认nfsnobody映射用户变为指定用户
      说明:实现用户灵活压缩映射的进程rpc.idmapped
      为什么默认映射用户是nfsnobody?
      [root@nfs01 ~]# cat /etc/exports
      /data 172.16.1.0/24(rw,sync,all_squash)
      [root@nfs01 ~]# id nfsnobody
      uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
      [root@nfs01 ~]# cat /var/lib/nfs/etab ---etab文件为nfs默认配置记录文件
      /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,all_squash)
      说明:在默认配置记录文件中,已经默认指明,默认映射用户为nfsnobody
      知识点总结:
      man exports查阅更多exports参数说明
      配置好NFS服务后,通过cat /var/lib/nfs/etab命令可以看到NFS配置的参数以及默认自带的参数
      1.2 测验连接nfs服务配置
      1.2.1 要求:共享不同的两个目录,分别赋予读和写权限
      服务端上面要求:
      nfs服务器172.16.1.31,共享下面两个目录:
      /data/w 要求的权限可读写,同步数据,所有用户都压缩为匿名用户
      /data/r 要求的权限为只读,同步数据,所有用户都压缩为匿名用户
      客户端上面要求:
      backup服务器 把NFS服务器的/data/r 挂载到/data/r
      web01服务器 把NFS服务器的/data/w 挂载到/data/w
      1.2.2 服务端部署过程
      第一个里程:编写nfs配置文件
      vim /etc/exports
      /data/w 172.16.1.0/24(rw,sync,all_squash)
      /data/r 172.16.1.0/24(ro,sync,all_squash)
      第二个里程:创建配置文件中指定的共享目录,并进行授权
      mkdir /data/{w,r} -p
      chown -R nfsnobody.nfsnobody /data/{w,r}
      第三个里程:重启nfs服务(平滑重启)
      /etc/init.d/nfs reload
      第四个里程:检查是否生成新的共享目录信息
      showmount -e 172.16.1.31
      Export list for 172.16.1.31:
      /data/r 172.16.1.0/24
      /data/w 172.16.1.0/24
      1.2.3 客户端部署过程:(web01 和backup两台客户机)
      第一个里程:确认是否安装好了nfs服务相关软件
      yum install -y nfs-utlis rpcbind
      rpm -qa|grep -E "nfs-utils|rpcbind"
      第二个里程:进行网络挂载
      web01:
      mkdir /data/w -p
      mount -t nfs 172.16.1.31:/data/w /data/w

    backup:
    mkdir /data/r -p
    mount -t nfs 172.16.1.31:/data/r /data/r
    第三个里程:检查测试
    web01:对共享目录有读写权限
    backup:对共享目录只有只读权限
    [root@backup r]# touch test.txt
    touch: cannot touch `test.txt': Read-only file system

    说明强调:在nfs服务端配置共享目录时,会遵循目录的继承条件
    当上一级共享目录为读写时,下一级共享目录就算为只读模式,也会继承上一级目录的权限
    第2章 NFS服务常见故障排查
    2.1 【第一个常见错误】
    2.1.1 【错误出现提示】
    ls: cannot open directory .: Stale file handle
    提示文件句柄错误:
    2.1.2 【错误出现原因】
    客户端原有挂载的共享目录,在服务端已经取消共享了,但客户端并没有进行卸载
    2.1.3 【错误解决方法】
    在nfs客户端,将不存在共享目录进行卸载
    如果通过df -h命令无法查询到不存在的共享目录的挂载点信息,可以通过一个特殊文件获取
    nfs客户端查看文件:cat /proc/mounts ---nfs客户端挂载默认配置记录文件
    nfs服务端查看文件:cat /var/lib/nfs/etab ---nfs服务端默认配置记录文件
    2.2 【第二个常见错误】
    2.2.1 【错误出现提示】
    客户端挂载报错“No such file or directory”
    [root@backup ~]# showmount -e 172.16.1.31
    Export list for 172.16.1.31:
    /data 172.16.1.0/24
    [root@backup ~]# mount -t nfs 172.16.1.31:/data/ /mnt/
    mount.nfs: mounting 172.16.1.31:/data/ failed, reason given by server: No such file or directory
    2.2.2 【错误出现原因】
    NFS服务端没有共享目录/data。
    2.2.3 【错误解决方法】
    在NFS服务端,创建即可。
    2.3 【第三个常见错误】
    2.3.1 【错误出现提示】
    [root@nfs-client1 ~]# showmount -e 10.0.0.7
    clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
    2.3.2 【错误出现原因】
    nfs服务端防火墙开启了,阻止了连接rpc 111端口的请求
    2.3.3 【错误解决方法】
    将nfs服务端防火墙服务关闭,或者配置允许用户主机访问111端口策略
    2.4 【第四个常见错误】
    2.4.1 【错误出现提示】
    [root@nfs-client1 ~]# showmount -e 10.0.0.7
    clnt_create: RPC: Program not registered
    2.4.2 【错误出现原因】

  14. nfs服务先启动了,rpcbind服务后启动了
  15. nfs服务停止了
    说明:rpc服务中没有nfs服务注册的信息了
    2.4.3 【错误解决方法】
    重新先启动rpcbind服务,在启动nfs服务
    2.5 【第五个常见错误】
    2.5.1 【错误出现提示】
    卸载挂载设备时显示device is busy
    [root@nfs-client mnt]# umount /mnt
    umount.nfs: /mnt: device is busy
    umount.nfs: /mnt: device is busy
    2.5.2 【错误出现原因】
  16. 可能nfs客户端挂载和nfs服务端共享目录有网络数据传输
  17. 你所处的目录路径,就是在挂载点之中
    2.5.3 【错误解决方法】
    umount -lf /data/r
    -l Lazy unmount --- 懒惰卸载
    -f Force unmount --- 表示强制卸载
    2.6 【第六个常见错误】
    2.6.1 【错误出现提示】
    共享目录挂载很卡
    2.6.2 【错误原因说明】
    当nfs服务端服务进行重启的时候(不是平滑重启),nfs服务会进入一个90s无敌时间
    nfs服务重启就好比发出一个大招, 要有90秒冷却时间
    在系统配置中/etc/sysconfig/nfs中指定了无敌时间的配置参数
    NFSD_V4_GRACE=90
    NFSD_V4_LEASE=90
    NLM_GRACE_PERI0D=90
    2.7 NFS报错排查思路
    2.7.1 排查nfs服务端是否存在问题
    rpcinfo -p 172.16.1.31
    showmount -e 172.16.1.31
    本地挂载测试:mount -t nfs 172.16.1.31:/data /mnt (挂载成功,进入mnt目录创建文件 删除文件测试一下)
    2.7.2 排查nfs客户端是否存在问题
    rpcinfo -p 172.16.1.31
    showmount -e 172.16.1.31
    网络挂载测试:mount -t nfs 172.16.1.31:/data /mnt (挂载成功,进入mnt目录创建文件 删除文件测试一下)
    第3章 NFS服务的重点知识梳理
    3.1 权限相关
    3.1.1 NFS客户端访问服务端的权限
    当多个NFS客户端访问服务器端的读写文件时,需要具有以下几个权限:
    ① NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限。
    ② NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务器端本地目录的安全权限。
    ③ 每台机器对应存在和NFS默认配置UID的相同UID 65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)
    3.1.2 共享目录权限总结
    1)与服务端配置文件中权限参数设置有关
    2)本地共享目录本身权限有关
    3)与客户端挂载参数有关
    3.2 相关执行配置文件
    /usr/sbin/exportfs ---可以管理nfs服务运行状态 可以配置共享目录
    /usr/sbin/exportfs -r ---nfs服务平滑重启命令
    /usr/sbin/exportfs -v #显示共享详细信息
    注:一般组合用/usr/sbin/expostfs -rv
    [root@nfs01 ~]# /usr/sbin/exportfs -rv
    exporting 172.16.1.0/24:/data/r
    exporting 172.16.1.0/24:/data/w
    3.2.1 扩展:exportfs
    man exportfs
    NAME
    exportfs - maintain table of exported NFS file systems
    用于管理当前的NFS共享的文件系统列表,exportfs -rv=/etc/init.d/nfs reload 加载配置生效;启动了NFS服务之后,如果修改了/etc/exports,就需要重新启动nfs,使修改的配置文件生效,就可以用exportfs命令完成。
    [root@nfs01 ~]# exportfs -o rw,sync 172.16.1.0/24:/data < - 利用exportfs命令指定要共享的目 录,并指定共享给那些客户端地址
    [root@nfs01 ~]# showmount -e 172.16.1.31 exportfs命令创建共享目录,是临时生效
    Export list for 172.16.1.31:
    /data 172.16.1.0/24
    /data/r 172.16.1.0/24
    /data/w 172.16.1.0/24

3.3 NFS客户端开机自启动挂载
3.3.1 利用/etc/rc.local文件实现自动挂载
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
3.3.2 利用/etc/fstab文件实现自动挂载
vim /etc/fstab
挂载什么 挂载到哪 类型 挂载参数 是否备份 是否检查磁盘
172.16.1.31:/data /mnt nfs defaults 0(dump) 0(fsck)
需要netfs服务的配合:chkconfig netfs on
说明:netfs服务作用:在网络服务启动之后,让系统重新读取加载/etc/fstab文件(因为默认情况 /etc/fstab会先启动,network服务会后启动,导致网络自动挂载不上,所以需要让netfs服务在network服务后启动一下)

查看命令的启动顺序:
[root@backup ~]# head /etc/init.d/netfs

chkconfig: 345 25 75

description: Mounts and unmounts all Network File System (NFS), \

[root@backup ~]# head /etc/init.d/network

network Bring up/down networking

chkconfig: 2345 10 90

[root@backup ~]# ll /etc/rc.d/rc3.d/|grep local ---网络服务启动后加载rc.local文件
lrwxrwxrwx. 1 root root 11 Dec 8 12:38 S99local -> ../rc.local
注:S99表示最后加载这个配置文件
3.4 NFS客户端挂载参数说明
3.4.1 共享目录权限总结:

  1. 共享目录权限和配置文件中权限参数设置有关
  2. 共享目录权限和目录本身权限有关
  3. 共享目录权限和客户端挂载参数有关
    3.4.2 查看客户端挂载历史记录与默认参数
    cat /proc/mounts
    3.4.3 客户端前台和后台挂载
    mount -t nfs -o fg 172.16.1.31:/data /mnt --- 前台挂载(默认)
    mount -t nfs -o bg 172.16.1.31:/data /mnt --- 后台挂载
    3.4.4 软挂载和硬挂载
    soft 软挂载 :一直尝试挂载,超时后退出(timeout后有可能丢失数据,不推荐使用)
    hard 硬挂载:一直尝试挂载,不停止(一般配合intr参数使用),默认为head
    hard+intr =soft软挂载
    3.4.5 rsize和wsize的作用
    rsize ---设定数据读取到内存中,内存中预留空间大小
    wsize ---设定数据存储到内存中,内存中预留空间大小
    设置大一点,提升NFS传输的能力(设置的值为2的倍数,centos6默认为130721)
    类似于缓存区,会影响客户端和服务端缓存数据的存储量,最大传输速率越快,根据网络传输带宽决定大小,不要超过带宽

3.4.6 suid的作用
让普通用户执行命令时相当于root用户,一般用于脚本(默认值)
如目录和目录下的文件都是suid,root和普通用户都可以访问,其他的情况普通用户都不能访问。

3.4.7 exec和noexec的作用
相当于x权限,如果是noexec,用户则没有执行权限
3.4.8 user和nouser的作用
是否允许普通用户挂载或卸载文件系统(默认不允许,root才行)
3.4.9 auto和noauto的作用
执行mount -a 时,是否自动挂载(默认为auto)
3.4.10 atime 和noatime、nodiratime的作用
每次访问数据时,会同步更新访问文件的Inode时间戳。
高并发环境使用noatime,nodiratime,提升系统I/O性能
3.4.11 remount的作用
重新挂载,针对于已经挂载的设备或目录
例:mount -t nfs -o remount,ro 172.16.1.31:/data /mnt

3.5 NFS客户端优化挂载的参数
Centos6优化参数:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodevp,rsize=131072,wsize=131072 172.16.1.31:/data /mnt
经过实际测试,默认参数性能也不错:mount -t nfs 172.16.1.31:/data /mnt
3.6 NFS系统应用的优点

  1. 简单,易操作
  2. NFS内的数据是在文件系统之上的,可以看得见的。
  3. 部署方便,可控制,配置文件一条命令即可搞定,
  4. 可靠性高
    1. 服务非常稳定
      3.7 NFS系统应用缺点
    2. 存在单点故障(NFS服务器宕机了,其他用户都不能访问了)
    3. 不适用于高并发(2千万以上访问量)
    4. 没有认证(基于IP和主机名),安全性低
    5. NFS数据是明文的(一般内网通信)
    6. 其他与架构有关,比如客户端与服务端的耦合性(实时同步可解耦)
      应用建议:
      对于大中小网站(参考点2000万/日 PV以下)线上应用,都有用武之地,门户网站也会有应用,生产场景应用多将数据的访问往前推,即尽量将静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。