第1章 NFS简介

1.1 什么是NFS
NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和linux的samba服务类似,只不过一般情况下,Windows网络共享服务或samba服务用户办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,若是大型网站,那么有可能还会用到更复杂的分布式文件系统Moosefs(mfs)、GlusterFS。
1.2 NFS历史介绍
第一个网络文件系统被称为File Access Listener,由DEC在1976年开发。
NFS是第一个构建在IP协议之上的现代网络文件系统,在20世纪80年代,首先作为实验文件系统,由Sun Microsystems在内部开发完成,NFS协议归属与RFC标准,在随后演化为NFSv2,作为一个标准,由于NFS与其他客户端和服务器的互操作能力很好而发展迅速。
1.3 NFS发展时间表
linux集群搭建之nfs服务的搭建
1.4 NFS企业在企业中的应用场景
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如BBS产品的图片、附件、头像(网站BBS的程序不要放在NFS共享中),然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。
NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高。
1.5 NFS工作流程图
linux集群搭建之nfs服务的搭建
linux集群搭建之nfs服务的搭建
1.6 NFS原理图
linux集群搭建之nfs服务的搭建
注意:NFS的rpc服务,在Centos5系列下名称为portmap,在Centos6系列下名称为rpcbind

第2章 NFS服务的搭建

2.1 部署服务器前的准备

操作系统服务器角色IP地址
CentOS release 6.9 x86_64NFS服务端(nfs-server)内网:172.16.1.31/24 外网:10.0.0.31/24
CentOS release 6.9 x86_64NFS客户端(nfs-client1)内网:172.16.1.41/24 外网:10.0.0.41/24
CentOS release 6.9 x86_64NFS客户端(nfs-client2)内网:172.16.1.8/24 外网:10.0.0.8/24

2.2 NFS服务端的配置
2.2.1 检查操作系统的环境
[root@nfs01 ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@nfs01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@nfs01 ~]# uname -m 
x86_64
2.2.2 NFS服务端需要安装的软件包
nfs-utils:nfs服务的主程序,包括rpc.nfsd、rpc.mountd两个daemons和相关的文档说明及执行命令文件等
rpcbind:centos6下面的rpc主程序(centos5下的是portmap)
2.2.3 安装相应的软件包及检查
安装:
[root@nfs01 ~]# yum install nfs-utils rpcbind -y
检查:
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
注意:在安装完该软件包后会自动创建nfsnobody用户
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
2.2.4 启动NFS相关的服务
2.2.4.1 启动rpcbind服务并进行检查
启动:
[root@nfs01 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
检查:
[root@nfs01 ~]# /etc/init.d/rpcbind status 
rpcbind (pid 2309) is running...
查看rpc的端口:
[root@nfs01 ~]# netstat -tnulp|grep rpc 端口为111
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 2309/rpcbind 
tcp 0 0 0.0.0.0:35957 0.0.0.0:
 LISTEN 1221/rpc.statd 
tcp 0 0 :::14282 ::: LISTEN 1221/rpc.statd 
tcp 0 0 :::111 :::
 LISTEN 2309/rpcbind 
udp 0 0 0.0.0.0:49347 0.0.0.0: 1221/rpc.statd 
udp 0 0 127.0.0.1:973 0.0.0.0:
 1221/rpc.statd 
udp 0 0 0.0.0.0:111 0.0.0.0: 2309/rpcbind 
udp 0 0 0.0.0.0:788 0.0.0.0:
 2309/rpcbind 
udp 0 0 :::111 ::: 2309/rpcbind 
udp 0 0 :::10354 :::
 1221/rpc.statd 
udp 0 0 :::788 :::* 2309/rpcbind
查看端口映射情况:
[root@nfs01 ~]# 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
注意:在未启动nfs服务时,不能看到nfs端口的映射情况
2.2.4.2 启动nfs服务并进行检查
启动:
[root@nfs01 ~]# /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 ]
检查:
[root@nfs01 ~]# /etc/init.d/nfs status 
rpc.svcgssd is stopped
rpc.mountd (pid 2432) is running...
nfsd (pid 2448 2447 2446 2445 2444 2443 2442 2441) is running...
rpc.rquotad (pid 2427) is running...
查看端口映射情况:
[root@nfs01 ~]# 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 28839 mountd
100005 1 tcp 34541 mountd
100005 2 udp 12297 mountd
100005 2 tcp 38042 mountd
100005 3 udp 54557 mountd
100005 3 tcp 11471 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 9683 nlockmgr
100021 3 udp 9683 nlockmgr
100021 4 udp 9683 nlockmgr
100021 1 tcp 4166 nlockmgr
100021 3 tcp 4166 nlockmgr
100021 4 tcp 4166 nlockmgr
注意:此时有了端口映射
 【特别注意】必须先启动rpcbind服务之后,才能启动nfs服务
原因:nfs可以视为一个rpc程序,在启动任何一个rpc程序之前,需要做好端口和功能的映射工作,这个映射工作就是由rpcbind服务来完成的,因此在提供nfs服务之前,必须要先启动rpcbind服务
2.2.4.3 检查nfs和rpc进程
[root@nfs01 ~]# ps -ef |grep nfs 
root 2900 2 0 19:05 ? 00:00:00 [nfsiod]
root 3133 2 0 19:40 ? 00:00:00 [nfsd4]
root 3134 2 0 19:40 ? 00:00:00 [nfsd4_callbacks]
root 3135 2 0 19:40 ? 00:00:00 [nfsd]
root 3136 2 0 19:40 ? 00:00:00 [nfsd]
root 3137 2 0 19:40 ? 00:00:00 [nfsd]
root 3138 2 0 19:40 ? 00:00:00 [nfsd]
root 3139 2 0 19:40 ? 00:00:00 [nfsd]
root 3140 2 0 19:40 ? 00:00:00 [nfsd]
root 3141 2 0 19:40 ? 00:00:00 [nfsd]
root 3142 2 0 19:40 ? 00:00:00 [nfsd]
root 3221 2130 0 19:41 pts/0 00:00:00 grep nfs
[root@nfs01 ~]# ps -ef |grep rpc 
rpcuser 1221 1 0 10:37 ? 00:00:00 rpc.statd
root 1270 2 0 10:37 ? 00:00:00 [rpciod/0]
rpc 2309 1 0 14:27 ? 00:00:00 rpcbind
root 3121 1 0 19:40 ? 00:00:00 rpc.rquotad
root 3126 1 0 19:40 ? 00:00:00 rpc.mountd
root 3173 1 0 19:40 ? 00:00:00 rpc.idmapd
root 3223 2130 0 19:42 pts/0 00:00:00 grep rpc
2.2.5 将相关的服务添加到开机自启动中
【方法1】
将nfs服务加入并检查:
[root@nfs01 ~]# chkconfig nfs on 
[root@nfs01 ~]# chkconfig --list nfs 
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
将rpcbind服务加入并检查:
[root@nfs01 ~]# chkconfig rpcbind on 
[root@nfs01 ~]# chkconfig --list rpcbind 
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
【方法2】
加入:
[root@nfs01 ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local
[root@nfs01 ~]# echo "/etc/init.d/nfs start" >>/etc/rc.local
查看:
[root@nfs01 ~]# tail -2 /etc/rc.local 
/etc/init.d/rpcbind start
/etc/init.d/nfs start
【注意】
在实际的生产环境中用方法2而不用方法1,因为可以方便运维人员的管理
2.2.6 配置nfs服务的配置文件/etc/exports

默认情况下该配置文件是空的:
[root@nfs01 ~]# ll -h /etc/exports 
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
编辑该配置文件:
[root@nfs01 ~]# vim /etc/exports
查看:
[root@nfs01 ~]# cat /etc/exports 
#share /data by oldboy for bingbing at 2018-3-12
/data 172.16.1.0/24(rw,sync)
【注意】
 该配置文件默认是存在,只不过是空文件而已,在172.16.1.0/24(rw,sync)中24和(之间不能有空格
 查看NFS服务器配置的参数(包含默认的参数)的文件/var/lib/nfs/etab

2.2.6.1 nfs配置文件的格式
NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)或者
NFS共享的目录 NFS客户端地址(参1,参2,……)
上述各列参数的含义:

 NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。/etc/exports配置文件格式书写详细如下表

常用格式说明实例
配置案例1/data 172.16.1.0/24(rw,sync) 允许客户端读写,并且数据同步写到服务器的磁盘里
配置案例2/data 172.16.1.0/24(rw,sync,all_squash,anonuid=888,anongid=888) 允许客户端读写,并且数据同步写到服务器的磁盘里,并且指定客户端的uid和gid,早期生产环境中的一种配置,适合多客户端共享一个NFS单目录,如果所有服务器的nfsnodoby账户的UID相同,则本案例就没什么意义了
配置案例3/data 172.16.1.0/24(ro) 只读共享,用途:例如在生产环境中开发人员有查看服务器日志的需求,但是又不希望给开发服务器的权限,那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器日志目录(NFS共享目录)的权限,但是,这不是唯一的方法喲

 NFS 客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段的地址,还可以用”*”来匹配所有的客户端服务器,这里所谓的客户端一般为前端的业务服务器,例如web服务。详细说明如下表

客户端地址具体地址说明
授权单一客户端访问NFS172.16.1.41一般情况下,生产环境中此配置不多
授权整个网段访问NFS172.16.1.0/24指定网段为生产环境中最常见的配置,配置简单、维护方便
授权整个网段可访问NFS172.0.0.*指定网段的另外写法(不推荐使用)
授权某个域名客户端访问nfs.lzhnb.com生产环境中一般不使用
授权整个域名客户端访问*.lzhnb.com生产环境中一般不使用

 NFS配置参数权限,具体如下表

参数名称参数用途
rw(熟记)表示可读写权限
sync(熟记)请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回,优点:数据安全不会丢,缺点:性能比不启用该参数要差
async(熟记)写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源)
all_squash(熟记)不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用,在生产环境中配置NFS的重要技巧:1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同)
anonuid(熟记)参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好
anongid(熟记)同anonuid,区别是把uid(用户id)换成gid(组id)
ro表示只读权限

2.2.7 创建共享目录
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x. 2 root root 4096 Nov 19 10:45 /data/
2.2.8 更改共享目录的权限
[root@nfs01 ~]# chown -R nfsnodoby.nfsnodoby /data
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Mar 12 19:27 /data
2.2.9 重新加载NFS服务
[root@nfs01 ~]# /etc/init.d/nfs reload
【注意】
 /etc/init.d/nfs reload<==>fexportfs -rv
 修改完/etc/exports配置后,需要重新加载NFS服务
 用yum/rpm包安装的软件,用service和/etc/init.d/服务名启动是一样的
2.2.10 检查有权限挂载的服务器是否能够挂载
【方法1】利用showmount来进行检查
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
或者
[root@nfs01 ~]# showmount -e localhost 
Export list for localhost:
/data 172.16.1.0/24
【注意】
 出现上面信息是,说明服务器可以挂载
 测试的IP地址为NFS服务器的IP地址
【方法2】可以在把NFS服务器当做客户端来进行挂载测试
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt 挂载
[root@nfs01 ~]# df -h 查看
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
[root@nfs01 ~]# umount /mnt 测试完后取消挂载
[root@nfs01 ~]# df -h 
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
2.3 NFS客户端的配置
2.3.1 检查操作系统的环境
[root@ client1 ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@ client1 ~]# uname -r
2.6.32-696.el6.x86_64
[root@ client1 ~]# uname -m 
x86_64
2.3.2 安装客户端软件rpcbind和nfs-utils
安装:
[root@client1 ~]# yum install nfs-utils rpcbind -y
检查:
[root@ client1 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
【注意】
 安装nfs-utils软件的目的是为了使用showmount等功能,所以客户端最好也装上,但是不启动NFS服务
2.3.3 启动RPC服务并进行查看
启动:
[root@client1 ~]# /etc/init.d/rpcbind start 
Starting rpcbind: [ OK ]
检查:
[root@ client1 ~]# /etc/init.d/rpcbind status 
rpcbind (pid 2370) is running...
2.3.4 检查能否访问服务端
【方法1】
[root@ client1 ~]# showmount -e 172.16.1.31 此ip地址为服务器端的ip地址
Export list for 172.16.1.31:
/data 172.16.1.0/24
出现上面的情况说明可以访问服务端
【方法2】
[root@ client1 ~]# telnet 172.16.1.31 111 111为rpc服务的端口
Trying 172.16.1.31...
Connected to 172.16.1.31.
Escape character is '^]'.
出现上面的情况说明可以访问服务端
2.3.5 挂载NFS共享目录
挂载:
[root@ client1 ~]# mount -t nfs 172.16.1.31:/data /mnt
查看:
[root@ client1 ~]# df -h 
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
查看:
[root@ client1 ~]# mount 
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
172.16.1.31:/data on /mnt type nfs (rw,vers=4,addr=172.16.1.31,clientaddr=172.16.1.8)
2.3.6 测试读写数据
2.3.6.1 在/mnt目录下创建测试文件
[root@ client1 ~]# cd /mnt/
[root@ client1 mnt]# touch test.txt
[root@ client1 mnt]# ls
test.txt
2.3.6.2 在NFS服务端/data目录下进行查看
[root@nfs01 ~]# cd /data
[root@nfs01 data]# ls
test.txt
至此NFS客户端挂载成功
2.3.7 将挂载命令加入开机自启动
[root@client1 ~]# echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
[root@client1 ~]# tail -1 /etc/rc.local
mount -t nfs 172.16.1.31:/data /mnt

第3章 NFS重点知识总结

3.1 NFS常见进程详解
3.1.1 查看NFS进程
[root@nfs01 ~]# ps -ef|grep -E "rpc|nfs"
rpcuser 1221 1 0 10:37 ? 00:00:00 rpc.statd 检查文件的一致性
root 1270 2 0 10:37 ? 00:00:00 [rpciod/0]
rpc 2309 1 0 14:27 ? 00:00:00 rpcbind
root 2900 2 0 19:05 ? 00:00:00 [nfsiod]
root 3121 1 0 19:40 ? 00:00:00 rpc.rquotad 磁盘配额进程
root 3126 1 0 19:40 ? 00:00:00 rpc.mountd 权限管理验证
root 3133 2 0 19:40 ? 00:00:00 [nfsd4]
root 3134 2 0 19:40 ? 00:00:00 [nfsd4_callbacks]
root 3135 2 0 19:40 ? 00:00:00 [nfsd] nfs主进程管理登入ID身份 认证等
root 3136 2 0 19:40 ? 00:00:00 [nfsd]
root 3137 2 0 19:40 ? 00:00:00 [nfsd]
root 3138 2 0 19:40 ? 00:00:00 [nfsd]
root 3139 2 0 19:40 ? 00:00:00 [nfsd]
root 3140 2 0 19:40 ? 00:00:00 [nfsd]
root 3141 2 0 19:40 ? 00:00:00 [nfsd]
root 3142 2 0 19:40 ? 00:00:00 [nfsd]
root 3173 1 0 19:40 ? 00:00:00 rpc.idmapd name mapping daemon
root 3271 2130 0 20:15 pts/0 00:00:00 grep -E rpc|nfs
3.1.2 NFS服务启动的进程说明

服务或进程名用途说明
nfsd(rpc.nfsd)主要功能是用来管理NFS客户端是否能够登入NFS服务端主机,其中还包括登入者的ID判别等
mountd(rpc.mountd)主要功能是管理NFS文件系统,特别注意的是:NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关
rpc.lockd(非必要)可用来锁定文件,用于多客户端同时写入
rpc.statd(非必要)检查文件的一致性,与rpc.lockd有关
rpc.idmapd名字映射后台进程

3.3 NFS客户端挂载命令

挂载命令挂载的格式类型NFS服务器提供的共享目录NFS客户端的挂载点
mount-t nfs172.16.1.31:/data/mnt (该目录必须存在)

3.4 多个NFS客户端访问服务器的读写文件时必须要有的权限
 NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限
 NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限
 每台服务器都对应存在和NFS默认配置UID的相同UID的账户nfsnodoby(确保所有所有客户端的访问权限统一,否则每台机器都需要同时建立相同UID用户,并覆盖NFS的默认用户配置)
只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中最为集群共享存储时尤为重要
第4章 错误重现及客户端排错思路
4.1 错误重现
4.1.1 服务端的防火墙未关闭
 【错误实例】
[root@web01 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
linux集群搭建之nfs服务的搭建
并且再出现这种错误时,在客户端不能用df -h命令
 【解决方法】
只需关掉NFS服务端的防火墙即可
[root@nfs01 ~]# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@nfs01 ~]# /etc/init.d/iptables status 
iptables: Firewall is not running.
 【测试】
在NFS客户端在进行测试
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.1.2 NFS服务端的共享目录权限不够
 【错误实例】
在NFS客户端挂载目录下创建文件被拒绝出现下面的错误
[root@client1 ~]# cd /mnt/
[root@client1 mnt]# touch oldboy.txt
touch: cannot touch `oldboy.txt': Permission denied
linux集群搭建之nfs服务的搭建
 【解决方法】
在客户端修改共享目录的权限
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 root root 4096 Mar 13 20:07 /data
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Mar 13 20:07 /data
 【测试】
在NFS客户端挂载目录下创建文件
[root@client1 ~]# cd /mnt/
[root@client1 mnt]# touch oldboy.txt
在NFS服务端共享目录下查看
[root@nfs01 ~]# cd /data
[root@nfs01 data]# ls
oldboy.txt test.txt
4.1.3 NFS服务端启动顺序有问题
 【错误实例】
[root@client1 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Program not registered
linux集群搭建之nfs服务的搭建
 【解决方法】
在NFS端重新启动服务,先启动rpcbind服务,在启动nfs服务
[root@nfs01 ~]# /etc/init.d/rpcbind start 
Starting rpcbind: [ OK ]
[root@nfs01 ~]# /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 ]
 【测试】
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.1.4 NFS服务端的nfs服务未开启
 【错误实例】
[root@client1 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Program not registered
linux集群搭建之nfs服务的搭建
 【解决方法】
在NFS服务端开启nfs服务器
[root@nfs01 ~]# /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 ]
 【测试】
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.2 排错思路
4.2.1 首先确认NFS服务器端的服务或配置是否OK
[root@nfs01 ~]# showmount -e localhost 
Export list for localhost:
/data 172.16.1.0/24
4.2.2 在NFS服务器端测试能否挂载
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt 
[root@nfs01 ~]# df -h 
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
4.2.3 从客户端pingNFS服务端的ip
[root@client1 ~]# ping 172.16.1.31
PING 172.16.1.31 (172.16.1.31) 56(84) bytes of data.
64 bytes from 172.16.1.31: icmp_seq=1 ttl=64 time=2.39 ms
64 bytes from 172.16.1.31: icmp_seq=2 ttl=64 time=0.528 ms
这是通的情况
 执行这步的主要目的是看物理链路是否通
4.2.4 从客户端telnet服务器端IP端口检查
[root@client1 ~]# telnet 172.16.1.31 111
Trying 172.16.1.31...
Connected to 172.16.1.31.
Escape character is '^]'
这是通的情况
 执行这步的主要目的是用于测试NFS服务或RPC服务是否通
第5章 生产环境高级案例配置实战
5.1 NFS服务端的配置
5.1.1 建立用户组zuma,并指定GID为888,所有的客户端也执行同样的操作
[root@nfs01 ~]# groupadd zuma -g 888
5.1.2 建立用户zuma,指定UID为888,并加入zuma组,所有的客户端也执行同样的操作
[root@nfs01 ~]# useradd zuma -u zuma -g 888
[root@nfs01 ~]# id zuma 查看建立的用户及用户组
uid=888(zuma) gid=888(zuma) groups=888(zuma)
5.1.3 配置/etc/exports配置文件并检查
[root@nfs01 ~]# vim /etc/exports
[root@nfs01 ~]# cat /etc/exports 
#share /data by oldboy for bingbing at 2018-3-12
/data 172.16.1.0/24(rw,sync)
#####
/data1 172.16.1.0/24(rw,sync,all_squash,anonuid=888,anongid=888)
5.1.4 创建共享目录并检查
[root@nfs01 ~]# mkdir -p /data1
[root@nfs01 ~]# ll -d /data1
drwxr-xr-x 2 root root 4096 Mar 12 20:00 /data1
5.1.5 给共享目录服务权限并检查
[root@nfs01 ~]# chown -R zuma.zuma /data1
[root@nfs01 ~]# ll -d /data1
drwxr-xr-x 2 zuma zuma 4096 Mar 12 20:00 /data1
5.1.6 重新加载NFS服务器
[root@nfs01 ~]# /etc/init.d/nfs reload
5.1.7确认NFS服务端的服务或配置是否OK
[root@nfs01 ~]# showmount -e localhost 
Export list for localhost:
/data1 172.16.1.0/24
/data 172.16.1.0/24
至此NFS服务端配置完成
5.2 NFS客户端的配置
5.2.1 建立用户组zuma,并指定GID为888,同服务端的操作步骤
[root@client1 ~]# groupadd zuma -g 888
5.2.2 建立用户zuma,指定UID为888,并加入zuma组,同服务端的操作步骤
[root@client1 ~]# useradd zuma -u 888 -g zuma 
[root@client1 ~]# id zuma 查看
uid=888(zuma) gid=888(zuma) groups=888(zuma)
5.2.3 创建挂载目录并检查
[root@client1 ~]# mkdir /test
[root@client1 ~]# ll -d /test 
drwxr-xr-x 2 root root 4096 Mar 14 10:18 /test
5.2.3 检查是否启动rpcbind服务
[root@client1 ~]# /etc/init.d/rpcbind status 
rpcbind (pid 1204) is running... 说明正在运行
5.2.4 测试NFS服务端是否可以挂载
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1 172.16.1.0/24
/data 172.16.1.0/24 说明可以挂载
5.2.5 挂载并进行查看
[root@client1 ~]# mount -t nfs 172.16.1.31:/data1 /test 挂载
[root@client1 ~]# df -h 查看
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
172.16.1.31:/data1 8.8G 1.5G 6.9G 18% /test
5.2.6 在挂载目录下创建测试文件
[root@client1 ~]# cd /test/
[root@client1 test]# touch test.txt 
[root@client1 test]# ls
test.txt
5.2.7 在服务端共享目录下进行查看
[root@nfs01 ~]# cd /data1
[root@nfs01 data1]# ls
test.txt
至此指定NFS共享用户zuma共享/data1目录的配置完

 

Centos7安装配置NFS服务和挂载

 

现在有3台服务器 s1(主),s2(从), s3(从)需要实现文件实时同步,我们可以安装Nfs服务端和客户端来实现!



一、安装 NFS 服务器所需的软件包:

yum install -y nfs-utils
二、编辑exports文件,添加从机

  
vim /etc/exports
/home/nfs/ 192.168.248.0/24(rw,sync,fsid=0)
同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中

rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录

三、启动nfs服务

先为rpcbind和nfs做开机启动:(必须先启动rpcbind服务)

 
systemctl enable rpcbind.service
systemctl enable nfs-server.service
然后分别启动rpcbind和nfs服务:

 
systemctl start rpcbind.service
systemctl start nfs-server.service
确认NFS服务器启动成功:

 
rpcinfo -p
检查 NFS 服务器是否挂载我们想共享的目录 /home/nfs/:

exportfs -r
#使配置生效

exportfs
#可以查看到已经ok
/home/nfs 192.168.248.0/24

四、在从机上安装NFS 客户端

首先是安裝nfs,同上,然后启动rpcbind服务

先为rpcbind做开机启动:

systemctl enable rpcbind.service

然后启动rpcbind服务:

systemctl start rpcbind.service

注意:客户端不需要启动nfs服务

检查 NFS 服务器端是否有目录共享:showmount -e nfs服务器的IP

showmount -e 192.168.248.208
Export list for 192.168.248.208:
/home/nfs 192.168.248.0/24
在从机上使用 mount 挂载服务器端的目录/home/nfs到客户端某个目录下:


cd /home && mkdir /nfs
mount -t nfs 192.168.248.208:/home/nfs /home/nfs

df -h 查看是否挂载成功。

 

http://blog.csdn.net/taiyang1987912/article/details/41696319

http://www.linuxidc.com/Linux/2015-05/117378.htm

 

 

复制代码
 [root@localhost ~]# showmount -e 172.19.162.102
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) 解决方法: [root@pro-www-m root]# rpcinfo -p 172.19.162.102
   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
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  31206  nlockmgr
    100021    3   udp  31206  nlockmgr
    100021    4   udp  31206  nlockmgr
    100021    1   tcp  31241  nlockmgr
    100021    3   tcp  31241  nlockmgr
    100021    4   tcp  31241  nlockmgr iptables -I INPUT -p tcp -s 172.19.162.100 --dport 111 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 111 -j ACCEPT iptables -I INPUT -p tcp -s 172.19.162.100 --dport 2049 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 2049 -j ACCEPT iptables -I INPUT -p tcp -s 172.19.162.100 --dport 20048 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 20048 -j ACCEPT iptables -I INPUT -p tcp -s 172.19.162.100 --dport 31206 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 31206 -j ACCEPT
复制代码