加载中...

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

posted @ 2021-08-03 15:59  沾沾自喜的混子  阅读(956)  评论(0编辑  收藏  举报