NFS生产环境部署调优
1、NFS简介
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS主要分为服务端和客户端,服务端需要配置rpcbind和NFS服务并启动,客户端只需启动rpcbind服务无需部署NFS客户端,rpcbind系统默认都是启动的。
2、NFS服务端部署
2.1 检查rpcbind
[root@100 ~]# rpm -qa|grep rpcbind
rpcbind-0.2.0-49.el7.x86_64
如果没有就需要安装一下
[root@100 ~]# service rpcbind status
Redirecting to /bin/systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-07-28 10:41:38 CST; 1 day 4h ago
Process: 3488 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 3508 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─3508 /sbin/rpcbind -w
Jul 28 10:41:37 100 systemd[1]: Starting RPC bind service...
Jul 28 10:41:38 100 systemd[1]: Started RPC bind service.
2.2 检查nfs服务
默认已安装
[root@100 ~]# rpm -qa|grep nfs
nfs-utils-1.3.0-0.68.el7.x86_64
libnfsidmap-0.25-19.el7.x86_64
2.3 创建共享目录
[root@100 ~]# mkdir /share
2.4 配置exports
[root@100 ~]# vim /etc/exports
/share 10.4.7.*(rw,sync,no_root_squash)
使配置生效
[root@100 ~]# exportfs -r
注释:
/share:表示共享的目录
10.4.7.*:表示允许访问NFS服务的客户端地址网段
(rw,sync,no_root_squash):客户端权限
权限说明:
rw:read-write,可读写,注意仅仅这里设置成读写客户端还不能正常读写,还要正确的配置共享目录的权限才可以;
ro:read-only,只读权限;
sync:文件通知写入硬盘和内存;
Async:文件暂时存于内存,不直接写入内存;
no_root_squash:NFS客户端使用root连接时,对于共享目录也具有root权限(不安全);
root_squash:NFS客户端使用root用户连接时,对于共享目录具有匿名用户的权限;
all_squash:不论客户端使用什么身份连接,对共享目录都只拥有匿名用户的权限;
anonuid:匿名用户的UID值,这个UID的值必须真实存在于/etc/passwd中一般与all_squash一起使用;
anongid:匿名用户的GID值
2.5 启动nfs并加入开机自启
[root@100 ~]# systemctl start nfs
[root@100 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@100 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since Thu 2021-07-29 16:18:25 CST; 51s ago
Process: 6926 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 6909 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 6907 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 6909 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
Jul 29 16:18:25 100 systemd[1]: Starting NFS server and services...
Jul 29 16:18:25 100 systemd[1]: Started NFS server and services.
2.6 修改主机名映射
[root@100 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.4.7.100 nfs_server
[root@100 ~]# hostnamectl set-hostname nfs_server
注意,nfs会根据主机名进行鉴别,如果未设置主机名映射可能会出现如下报错
[root@100 ~]# showmount -e
clnt_create: RPC: Port mapper failure - Unable to send: errno 22 (Invalid argument)
2.7 自检服务
查看共享目录和允许被访问的客户端
[root@100 ~]# showmount -e
Export list for nfs_server:
/share 10.4.7.*
查看哪些客户端挂载了
[root@100 ~]# showmount -a
All mount points on nfs_server:
3、客户端连接
3.1 查看客户端rpcbind服务
[root@101 ~]# rpm -qa|grep rpcbind
rpcbind-0.2.0-49.el7.x86_64
[root@101 ~]#
[root@101 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-07-29 13:53:07 CST; 2h 38min ago
Process: 850 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 860 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─860 /sbin/rpcbind -w
Jul 29 13:53:06 101 systemd[1]: Starting RPC bind service...
Jul 29 13:53:07 101 systemd[1]: Started RPC bind service.
3.2 查看连接NFS服务端的权限
[root@101 ~]# showmount -e 10.4.7.100
Export list for 10.4.7.100:
/share 10.4.7.*
3.3 创建挂载目录
[root@101 ~]# mkdir /client
3.4 测试连接及挂载方式
[root@101 ~]# mount -t nfs 10.4.7.100:/share /client
[root@101 ~]# cd /client/
[root@101 client]# mkdir test1
查看信息
[root@101 /]# mount|grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
10.4.7.100:/share on /client type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.4.7.101,local_lock=none,addr=10.4.7.100)
只有nfs3版本才可以使用-a查看正在挂载的挂载点
使用nfsstat可以查看系统可以使用的nfs的版本及详情
[root@100 ~]# nfsstat
[root@101 ~]# umount /client
[root@101 ~]# mount -t nfs -o nfsvers=3 10.4.7.100:/share /client
[root@101 ~]# mount|grep nfs
10.4.7.100:/share on /client type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.4.7.100,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=10.4.7.100)
[root@101 ~]# showmount -a 10.4.7.100
All mount points on 10.4.7.100:
10.4.7.101:/share
测试读写情况
[root@101 ~]# cd /client/
[root@101 client]# mkdir test1
[root@101 client]# echo 222 > test1/2
[root@101 client]# ls
test test1
[root@101 client]# cat test/a
test
测试没问题,退出
[root@101 ~]# umount /client
4、生产优化
4.1 nfs端口优化
NFS端口的分配有下面三种:
- TCP/UDP 111 – RPC 4.0 portmapper;
- TCP/UDP 2049 – NFSD (nfs server);
- Mount端口—系统 RPC服务在 nfs服务启动时默认会为 mountd动态选取一个随机端口(32768--65535)来进行通讯,我们可以在/etc/sysconfig/nfs文件中定义端口。
生产环境中由于不同网段之前都会被网络个隔开,所以我们主机之间调用服务时都需要开通特定端口的网络策略,但是nfs连接使用的都是随机端口,无法开通策略。所以统一网段可以进行mount挂载,但是不同网段可能会出现如下报错:
rpc mount export: RPC: Timed out
最大的可能就是网络不通,所以我们需要固定nfs的连接端口
编辑配置文件,固定端口
vim /etc/sysconfig/nfs
RQUOTAD_PORT=6005
LOCKD_TCPPORT=6004
LOCKD_UDPPORT=6004
MOUNTD_PORT=6002
STATD_PORT=6003
STATD_OUTGOING_PORT=6006
重启nfs服务
[root@100 ~]# systemctl restart nfs
开通对应的网络策略(客户端到服务端的111/2049/6002-6006以及111/2049的UDP端口)后测试mount挂载
4.2 优化权限
生产环境中使用root用户连接是不安全的,所以我们需要配置只允许特定的用户和用户组进行访问
nfs服务端配置优化
[root@100 ~]# vim /etc/exports
/share 10.4.7.*(rw,sync,all_squash,anonuid=1010,anongid=1010)
注释:
- all_squash:表示所有客户端登录后都会被映射为匿名用户;
- anonuid=1010:表示匿名用户的uid=1010;
- anongid=1010:表示匿名用户的gid=1010。
只需要重新生效一下,不需要重启nfs服务
[root@100 ~]# exportfs -r
客户端挂载后测试
[root@101 ~]# mount -t nfs 10.4.7.100:/share /client
[root@101 ~]# cd /client/
[root@101 client]# ls
test test1
[root@101 client]# mkdir 2
mkdir: cannot create directory ‘2’: Permission denied
权限分析:
已知目前服务端与客户端都有wyg这个用户,且uid=1000,gid=1000
[root@100 ~]# id wyg
uid=1000(wyg) gid=1000(wyg) groups=1000(wyg)
之所以Permission denied是因为共享文件的目录权限是wyg的为uid=1000,gid=1000
[root@100 /]# ll|grep share
drwxr-xr-x 4 wyg wyg 31 Aug 2 11:28 share
需要修改服务端的wyg用户为1010
[root@100 ~]# usermod -u 1010 wyg
[root@100 share]# groupmod -g 1010 wyg
[root@100 share]# id wyg
uid=1010(wyg) gid=1010(wyg) groups=1010(wyg)
[root@100 /]# chown -R wyg:wyg /share/
客户端重新挂载
[root@101 ~]# umount /client
[root@101 ~]# mount -t nfs 10.4.7.100:/share /client
先用root测试
[root@101 client]# mkdir 1
[root@101 client]# ll
total 0
drwxr-xr-x 2 1010 1010 6 Aug 2 17:13 1
drwxr-xr-x 2 1010 1010 6 Aug 2 17:03 test
drwxr-xr-x 2 1010 1010 15 Aug 2 11:27 test1
再用wyg测试
[root@101 client]# su - wyg
Last login: Mon Aug 2 17:03:01 CST 2021 on pts/0
[wyg@101 ~]$
[wyg@101 ~]$ cd /client/
[wyg@101 client]$ ls
1 test test1
[wyg@101 client]$
[wyg@101 client]$ mkdir 2
[wyg@101 client]$ ll
total 0
drwxr-xr-x 2 1010 1010 6 Aug 2 17:13 1
drwxrwxr-x 2 1010 1010 6 Aug 2 17:15 2
drwxr-xr-x 2 1010 1010 6 Aug 2 17:03 test
drwxr-xr-x 2 1010 1010 15 Aug 2 11:27 test1
发现他们创建的文件夹的属性都是uid=1010,gid=1010
生产上本地服务一般都用普通用户启动,为防止本服务调用共享目录数据时无权限,所以客户端的wyg普通用户也应该和服务端的wyg属性保持一致
修改客户端wyg的属性
[root@101 client]# usermod -u 1010 wyg
[root@101 client]# groupmod -g 1010 wyg
[root@101 client]# ll /client/
total 0
drwxr-xr-x 2 wyg wyg 6 Aug 2 17:13 1
drwxrwxr-x 2 wyg wyg 6 Aug 2 17:15 2
drwxr-xr-x 2 wyg wyg 6 Aug 2 17:03 test
drwxr-xr-x 2 wyg wyg 15 Aug 2 11:27 test1
总结:
nfs挂载后用的都是/etc/exports中设置的gid和uid,所以共享目录的gid和uid属性必须和/etc/exports中设置的一样,不然会有权限问题;
服务端和客户端不一定要有对应的gid和uid用户,但是为方便管理,服务端和客户端都有同样的用户,并且用户的uid和gid相同,/etc/exports配置成普通用户的权限
4.3 加入开机自动挂载
[root@101 ~]# vim /etc/fstab
10.4.7.100:/share /client nfs defaults,_rnetdev 0 0
注释:
- ,_rnetdev表示主机无法挂载直接跳过,避免无法挂载造成主机无法启动;
- 第一个0表示不备份文件系统;
- 第二个0表示不检测磁盘。
5、参考文档
NFS服务的端口分配 - 追忆丶年华 - 博客园
https://www.cnblogs.com/xiaoleiel/p/8340406.html
NFS各个版本之间的比较_ycnian-CSDN博客_nfsv3和nfsv4的区别
https://blog.csdn.net/ycnian/article/details/8515517
nfs不同版本的挂载与解析 - Linux运维 - 运维网 - iyunv.com
https://www.iyunv.com/thread-404799-1-1.html