1. NFS服务配置企业案例实践
实例:共享/data目录给192.168.9.0/24整个网段的主机,可读写。
该例将实现把NFS Server上的/data目录共享给192.168.9.0/24整个网段主机,且可读写。
1.1 在NFS Server端执行的操作
1)启动rpcbind及NFS服务,然后加入开机自启动:
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2020-03-02 23:23:32 CST; 15h ago
Main PID: 7206 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─7206 /sbin/rpcbind -w
3月 02 23:23:32 nfs01 systemd[1]: Starting RPC bind service...
3月 02 23:23:32 nfs01 systemd[1]: Started RPC bind service.
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Active: active (exited) since 二 2020-03-03 00:30:55 CST; 14h ago
Main PID: 7428 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
3月 03 00:30:55 nfs01 systemd[1]: Starting NFS server and services...
3月 03 00:30:55 nfs01 systemd[1]: Started NFS server and services.
2)创建需要共享的目录并授权(工作中这里的/data应该是已存在的目录):
[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# touch /data/oldboy.txt
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data ---授权nfsnobody用户和组管理/data
[root@nfs01 ~]# ll -d /data ---养成操作后检查的习惯
drwxr-xr-x 2 nfsnobody nfsnobody 24 2月 20 10:37 /data
---在NFS服务器端把要共享的NFS目录赋予NFS默认用户nfsnobody用户和用户组权限,如不设置这个权限,会导致NFS客户端访问时无法通过NFS本地共享目录权限写入数据。当然也可以给NFS服务器端本地共享目录777的权限,但是工作中最好不要用,因为777的权限太大了。
[root@nfs01 ~]# grep nfsnobody /etc/passwd ---这个nfsnobody类似于rsync服务里的rsync用户
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
3)配置NFS服务配置文件,并在本地查看挂载信息情况:
[root@nfs01 ~]# cat >> /etc/exports<<EOF
> #shared /data by oldboy for students
> /data 192.168.9.0/24(rw,sync)
> EOF
[root@nfs01 ~]# tail -2 /etc/exports ---查看配置结果
#shared /data by oldboy for students
/data 192.168.9.0/24(rw,sync)
[root@nfs01 ~]# systemctl reload nfs ---平滑加载,使修改的配置生效,也可以用exportfs -r命令
[root@nfs01 ~]# showmount -e localhost ---在NFS服务器本地查看挂载情况
Export list for localhost:
/data 192.168.9.0/24
[root@nfs01 ~]# cat /var/lib/nfs/etab ---查看NFS Server配置文件参数(包括默认加载的参数)
/data 192.168.9.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
4)把本地服务器端作为客户端进行挂载测试,执行的命令和结果如下:
[root@nfs01 ~]# mount -t nfs 192.168.9.6:/data /mnt
[root@nfs01 ~]# ls /mnt/
oldboy.txt
[root@nfs01 ~]# df -h | tail -1
192.168.9.6:/data 17G 1.3G 16G 8% /mnt
根据提示挂载是成功的,至此,NFS服务器端配置完毕。
[root@nfs01 ~]# cat /var/lib/nfs/rmtab ---等客户端挂载成功后,通过执行该命令来查看哪些客户端主机挂载了NFS Server。
在此过程中,需要注意以下两点:
1)上文中的配置/oldboy 192.168.9.0/24(rw,sync),其中“24”和“(”之间不能有空格。
2)修改/etc/exports后,需执行systemctl reload nfs或exportfs -r重新加载配置,但不要重启NFS。尤其是在生产环境中。
1.2 在NFS Client端执行的操作
在所有的NFS Client上执行的操作都是相同的。
1)安装客户端软件rpcbind:
[root@web01 ~]# yum install -y rpcbind
[root@web01 ~]# rpm -qa rpcbind
rpcbind-0.2.0-48.el7.x86_64
为了使用showmount命令功能,所有客户端最好都要安装NFS软件。
[root@web01 ~]# yum install -y nfs-utils
[root@web01 ~]# rpm -qa nfs-utils
nfs-utils-1.3.0-0.65.el7.x86_64
2)启动RPC服务(注意,因为是客户端,所以无需启动NFS服务)
[root@web01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl enable rpcbind
[root@web01 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2020-03-04 11:22:09 CST; 24min ago
Main PID: 5896 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─5896 /sbin/rpcbind -w
3月 04 11:22:09 web01 systemd[1]: Starting RPC bind service...
3月 04 11:22:09 web01 systemd[1]: Started RPC bind service.
3)挂载NFS共享目录/data
[root@web01 ~]# showmount -e 192.168.9.6 ---挂载前首先检查客户端是否能够挂载NFS服务器端
Export list for 192.168.9.6:
/data 192.168.9.0/24 ---可以看到服务器端共享了/data目录,访问的IP段是192.168.9.0/24。
如果此时出现如下错误,多数是因为防火墙没关导致的。
[root@web01 ~]# showmount -e 192.168.9.6
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
此时执行如下命令关闭服务器端(NFS01)防火墙。
[root@nfs01 ~]# systemctl stop firewalld
[root@nfs01 ~]# systemctl disable firewalld
[root@nfs01 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@web01 ~]# mount -t nfs 192.168.9.6:/data /mnt ---执行挂载命令挂载
[root@web01 ~]# df -h|tail -1 ---查看挂载后的结果
192.168.9.6:/data 17G 1.3G 16G 8% /mnt
[root@web01 ~]# grep "data" /proc/mounts ---查看proc下的挂载数据
192.168.9.6:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.9.7,local_lock=none,addr=192.168.9.6 0 0
4)从客户端Web01测试读写NFS服务器端数据。
[root@web01 ~]# ls /mnt ---查看挂载后挂载点目录下的数据
oldboy.txt ---这是服务器端事先建立的文件,表示可读
[root@web01 ~]# touch /mnt/oldgirl.txt ---表示可写
[root@web01 ~]# ls /mnt
oldboy.txt oldgirl.txt
[root@web01 ~]# mkdir /mnt/test ---表示可写
[root@web01 ~]# ls -l /mnt
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 2月 20 10:37 oldboy.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 3月 3 17:09 oldgirl.txt
drwxr-xr-x 2 nfsnobody nfsnobody 6 3月 3 17:09 test
---用户和用户组都是nfsnobody。默认所有的客户端写入文件和目录都会被压缩成默认的UID为65534的nfsnobody用户和组。
至此,NFS客户端Web01的部署成功。
2. NFS服务的重点知识梳理
当多个NFS客户端访问服务器端读写文件时,需要具有以下几个权限:
- NFS服务器/etc/exports设置需要开放写入的权限,即服务器端的共享权限。
- NFS服务器实际要共享的NFS目录权限具有写入的权限,即服务器端本地目录的安全权限。
- 每台机器都对应存在和NFS默认配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)。
只有满足上述3个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传的文件的权限,这在大规模的集群环境中作为集群共享存储时尤为重要。
下表列出了常用的重点NFS服务文件或命令。
3. NFS客户端挂载排错思路
当NFS客户端挂载出现故障时,首先把本地服务器端作为客户端进行挂载测试,执行的命令和结果如下:
[root@nfs01 ~]# mount -t nfs 192.168.9.6:/data /mnt
[root@nfs01 ~]# ls /mnt/
oldboy.txt
[root@nfs01 ~]# df -h|tail -1
192.168.9.6:/data 17G 1.3G 16G 8% /mnt
根据提示挂载是成功的。
提示:这步主要检查服务器端的NFS服务自身是不是正常。
然后再确认NFS客户端showmount是否OK。正常情况下如下:
[root@nfs01 ~]# showmount -e 192.168.9.6
Export list for 192.168.9.6:
/data 192.168.9.0/24
如果环境准备不当可能会遇到如下两个报错。
第一个报错及分析解决如下:
[root@web01 ~]# showmount -e 192.168.9.6
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
解答:这个报错往往是由防火墙未关闭也未正确设置导致的,检查办法如下:
1)从客户端ping NFS服务端IP,目的是看物理链路是否通畅。
[root@web01 ~]# ping 192.168.9.6 -c 1
PING 192.168.9.6 (192.168.9.6) 56(84) bytes of data.
64 bytes from 192.168.9.6: icmp_seq=1 ttl=64 time=0.300 ms
--- 192.168.9.6 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.300/0.300/0.300/0.000 ms
2)从客户端telnet服务器端IP端口检查,用于测试NFS服务(RPC服务)是否通畅。
[root@web01 ~]# telnet 192.168.9.6 111
Trying 192.168.9.6...
telnet: connect to address 192.168.9.6: No route to host
---不通,即可怀疑服务器端防火墙拦截了。
第二个报错及分析解决如下:
[root@web01 ~]# showmount -e 192.168.9.6
clnt_create: RPC: Program not registered
解答:“RPC:Program not registered”提示很清楚了,是服务器端RPC服务和NFS服务存在启动顺序问题,即需要先启动rpcbind,后启动NFS。