第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在网络文件共享服务作用总结:
- 负载均衡设备会将访问流量,进行分流,但不便于文件和数据的互相访问;
- 利用服务器间的数据同步可以使用户之间数据互访,但同步管理操作过于复杂;
-
利用NFS服务器可以统一管理数据,使用户之间可以顺利互访
1.3 共享存储服务分类
硬件存储:IBM oracle(sun)EMC(去IOE)
软件存储:NFS mfs ftp samba
第2章 NFS共享系统原理
2.1 NFS系统挂载结构简单描述NFS工作原理:
- 部署好NFS服务,在NFS服务端创建一个video共享目录
- web服务器(NFS客户端)创建一个本地video目录,作为一个挂载点
- web服务器通过mount命令实现网络挂载,将nfs服务器上video目录挂载到本地video目录挂载点上
- 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服务工作流程图:
- 启动rpc服务,建立中介服务
- 启动nfs服务,开启进程信息(房源信息),向rpc服务进行注册
- rpc服务接收到nfs服务进程信息(房源信息)
- nfs客户端向rpc服务发出请求(访问共享目录)
- rpc服务响应nfs客户端请求
- nfs客户端与nfs服务端共享目录建立网络连接,实现数据网络存储
当访问程序通过NFS客户端向NFS服务器存取文件时,其请求数据流程大致如下:
- 首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
- NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)。
- 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据。
- 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 - 定义共享目录 ---------> /data
- 定于允许使用共享目录的主机或网段地址信息
- 定义共享目录权限信息(注意:“24和(”之间没有空格)
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs01 ~]# vim /etc/exports01.定义共享目录 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.
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的重要技巧
- 确保所有客户端服务器对NFS共享目录具备相同的用户访问权限。
a. all_squash把所有客户端都压缩成固定的匿名用户(UID相同)
b. 就是anonuid,anongid指定的UID和GID的用户 - 所有的客户端和服务器端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)
总结:
- rw参数:可读写
- ro参数:只读
/data 172.16.1.0(ro,sync,all_squash) :ro权限给开发人员用于读取配置文件,而不能修改 - sync参数的作用:同步,保证数据的可靠性
- async参数:ups AB双路电源
5.3.2 用户压缩映射相关参数 - no_all_squash参数:所有用户都不映射(什么身份过来就是什么身份)
- all_squash参数:所有用户都映射(成指定nfsnobody)
- root_squash参数:root用户映射(成指定nfsnobody)
- no _root_squash参数:不对root用户映射(进来NFS服务器后是root身份,权限 很大)
注意:
/etc/init.d/nfs reload ---平滑重启(只是重新加载了配置文件,已有的连接不会断开)
/etc/init.d/nfs restart ---重启(重新将服务关闭再开启,已有的连接会断开)
5.4 企业生产环境常见NFS案例
5.5 企业实战需求
- /data/共享目录权限固定为www用户管理
- 在nfs配置文件中,设置all_squash全部用户都映射参数
- 让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配置文件 - 查看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) - 编辑配置文件:vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=502,anongid=502) - 平滑重启:
/etc/init.d/nfs reload
anonuid和anongid参数作用说明:
将客户端所有用户,映射为指定用户,而不再是默认nfsnobody用户了
ps:两点注意- 客户端要有nfs配置文件anonuid或者anongid指定用户,此处是www
- 客户端和服务端创建默认映射用户,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工作原理
- 什么是rpc服务
rpc服务类似于中介,nfs服务将启动的进程和端口信息,向rpc服务进行注册
nfs客户端向rpc服务发出请求,进行共享目录挂载,从而实现通过网络存储数据信息 - 服务端做了三件事:
①. 首先启动rpc服务
②. 其次启动nfs服务
③. nfs服务向rpc服务进行注册,只注册一次(如果nfs服务进行了重启,会再次注册) - 客户端做了三件事:
①. 启动rpc服务(可以不用启动)
②. 利用tcp协议,与nfs服务端rpc服务(111端口)建立网络连接
③. 利用mount命令进行网络存储设备挂载
1.1.3 NFS服务部署流程 - 服务端部署流程:
- 检查服务软件是否正确安装,进行软件安装
- 编写nfs配置文件
- 创建共享存储目录,并进行授权
- 启动nfs相关服务(先启动rpcbind服务 再启动nfs服务)
- 检查服务启动情况
rpcinfo -p 172.16.1.31 ---检查nfs服务是否向rpc服务进行注册
showmount -e 172.16.1.31 ---检查nfs服务端是否有可以使用的共享目录 - 客户端部署流程:
- 检查服务软件是否正确安装,进行软件安装
- 检查服务启动情况
rpcinfo -p 172.16.1.31 ---检查nfs服务是否向rpc服务进行注册
showmount -e 172.16.1.31 ---检查nfs服务端是否有可以使用的共享目录 -
进行网络挂载
mount -t nfs 172.16.1.31:/data /mnt
1.1.4 NFS配置文件编写说明- 配置共享目录信息
- 设置允许网络共享目录的主机或网络信息
- 设置共享目录权限和相关参数
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 【错误出现原因】 - nfs服务先启动了,rpcbind服务后启动了
- 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 【错误出现原因】 - 可能nfs客户端挂载和nfs服务端共享目录有网络数据传输
- 你所处的目录路径,就是在挂载点之中
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 共享目录权限总结:
- 共享目录权限和配置文件中权限参数设置有关
- 共享目录权限和目录本身权限有关
- 共享目录权限和客户端挂载参数有关
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系统应用的优点
- 简单,易操作
- NFS内的数据是在文件系统之上的,可以看得见的。
- 部署方便,可控制,配置文件一条命令即可搞定,
- 可靠性高
- 服务非常稳定
3.7 NFS系统应用缺点 - 存在单点故障(NFS服务器宕机了,其他用户都不能访问了)
- 不适用于高并发(2千万以上访问量)
- 没有认证(基于IP和主机名),安全性低
- NFS数据是明文的(一般内网通信)
- 其他与架构有关,比如客户端与服务端的耦合性(实时同步可解耦)
应用建议:
对于大中小网站(参考点2000万/日 PV以下)线上应用,都有用武之地,门户网站也会有应用,生产场景应用多将数据的访问往前推,即尽量将静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。
- 服务非常稳定