1.1 NFS服务简介
NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS客户端可以将NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看远程主机的目录就好像是自己的一个磁盘分区一样。
1.2 RPC与NFS通讯原理
NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动。
1、首先服务器端启动RPC服务,并开启111端口;
2、服务器端启动NFS服务,并向RPC注册端口信息;
3、客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口;
4、服务端的RPC(portmap)服务反馈NFS端口信息给客户端;
5、客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
1.3 服务进程功能
nfsd:最主要的NFS服务提供程序,管理客户端是否能够使用服务器文件系统挂载信息,其中还包含判断这个登录用户的ID。
rpc.mountd:主要功能则是管理NFS的文件系统。当client端顺利通过rpc.nfsd登入主机后,在它可以使用NFS服务器提供规定文件之前,还会经过文件使用权限的认证程序。它会去读取NFS的配置文件/etc/exports来对比客户端的权限,当通过这一关之后,client端也就取得使用NFS文件的权限。
rpc.lockd:用于管理文件的锁定方面,当多个客户端同时尝试写入某个文件时就可以对该文件造成一些问题。rpc.lockd则可以用来克服这此问题。但rpc.lockd必须要同时在客户端和服务器端都开启才行。
rpc.statd:用来检查文件的一致性,若发生因为客户端同时使用同一个文件造成文件损坏时,rpc.statd可以用来检测并尝试恢复该文件。
1.4 服务端服务搭建
系统环境如下:
[root@nfs01 ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@nfs01 ~]#
Step1 查看服务端系统是否安装rpcbind和nfs-utils
[root@nfs01 ~]# rpm -qa|grep rpcbind
rpcbind-1.2.5-7.el8.x86_64
[root@nfs01 ~]# rpm -qa|grep nfs-utils
nfs-utils-2.3.3-31.el8.x86_64
[root@nfs01 ~]#
Step2 安装rpcbind和nfs-utils软件
[root@nfs01 ~]# yum install rpcbind nfs-utils -y
Step3 启动并添加开机启动
[root@nfs01 ~]# systemctl start rpcbind.service
[root@nfs01 ~]# systemctl enable rpcbind.service
[root@nfs01 ~]# systemctl start nfs-server.service
[root@nfs01 ~]# systemctl enable nfs-server.service
Step 4查看rpc启动进程信息
通过rpcinfo命令查看未开启nfs-server前rpc进程信息
[root@nfs01 ~]# rpcinfo -p 10.0.0.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
100024 1 udp 44396 status
100024 1 tcp 40333 status
[root@nfs01 ~]#
通过rpcinfo命令查看开启nfs-server前rpc进程信息
[root@nfs01 ~]# rpcinfo -p 10.0.0.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
100024 1 udp 44396 status
100024 1 tcp 40333 status
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
100021 1 udp 45564 nlockmgr
100021 3 udp 45564 nlockmgr
100021 4 udp 45564 nlockmgr
100021 1 tcp 43723 nlockmgr
100021 3 tcp 43723 nlockmgr
100021 4 tcp 43723 nlockmgr
[root@nfs01 ~]#
Step 5客户端软件安装
[root@nfs01 ~]#yum install -y nfs-utils
Step 6服务端配置共享文件
创建nfsnobody用户
[root@nfs01 ~]#useradd -s /sbin/nologin nfsnobody -M
创建共享目录并修改用户组权限
[root@nfs01 ~]#ckdir /data1001
[root@nfs01 ~]#chown nfsnobody.nfsnobody /data1001
编辑exports文件添加共享目录
[root@nfs01 ~]#vim /etc/exports
/data1001 172.16.1.0/24(rw,sync)
通过exportfs -r重发布共享目录
[root@nfs01 ~]# exportfs -v
/data1001 172.16.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
Step 7客户端文件挂载测试
[root@ zabbix ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1001 172.16.1.0/24
/data/zabbix 172.16.1.8
/data/web 172.16.1.7
/data/mysql 172.16.1.51
[root@zabbix ~]# mount -t nfs 172.16.1.31:/data /data1
[root@zabbix ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 381M 0 381M 0% /dev
tmpfs 399M 0 399M 0% /dev/shm
tmpfs 399M 41M 358M 11% /run
tmpfs 399M 0 399M 0% /sys/fs/cgroup
/dev/mapper/cl-root 20G 4.4G 16G 23% /
/dev/mapper/cl-home 8.0G 98M 7.9G 2% /home
/dev/sda1 477M 143M 306M 32% /boot
tmpfs 80M 4.0K 80M 1% /run/user/0
172.16.1.31:/data1001 20G 4.4G 16G 23% /data1
[root@zabbix ~]#
1.5 NFS共享目录权限问题
共享目录权限主要是由exports中目录配置的权限,常用权限如下:
rw:表示可读写权限。
ro:表示只读权限。
sync:请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。(优点:数据安全不会丢。缺点:性能比启用该参数要差)。
async:写入时数据会先写到内存缓冲区,只到硬盘有空档才会再写入磁盘,这样可以提升写入效率!风险:若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS不间断电源)。
no_root_squash:访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限,这个配置原本是为无盘客户端准备的。用户应避免使用。
root_squash:如果访问NFS Server共享目录的用户是root,则它的权限将压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。
all_squash:不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。
系统默认权限如下(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
1.6 NFS维护命令
客户端维护命令
/usr/sbin/showmount 查看服务器端共享的目录信息
[root@ zabbix ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1001 172.16.1.0/24
/data/zabbix 172.16.1.8
/data/web 172.16.1.7
/data/mysql 172.16.1.51
服务端维护命令
/usr/sbin/exportfs 查看服务端共享的目录信息
[root@nfs01 ~]# /usr/sbin/exportfs
/data/mysql 172.16.1.51
/data/web 172.16.1.7
/data/zabbix 172.16.1.8
/data1001 172.16.1.0/24
rpcinfo -p localhost 查看RPC服务的注册信息
[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
100024 1 udp 44396 status
100024 1 tcp 40333 status
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
100021 1 udp 45564 nlockmgr
100021 3 udp 45564 nlockmgr
100021 4 udp 45564 nlockmgr
100021 1 tcp 43723 nlockmgr
100021 3 tcp 43723 nlockmgr
100021 4 tcp 43723 nlockmgr
[root@nfs01 ~]#
exportfs -r 更新exports文件共享目录信息
systemctl restart nfs-server 重启nfs服务
systemctl restart rpcbind 重启rpcbind服务
1.7 生产环境配置注意事项
1-确保所有客户端服务器对NFS共享目录具备相同的用户访问权限
- all_squash把所有客户端都压缩成固定的匿名用户(UID相同);
- anonuid,anongid指定的UID和GID的用户;
2-所有的客户端和服务端都需要有一个相同的GID和UID用户,即nfsnobody(UID必须相同)
- 修改命令usermod -u 1003 nfsnobody && groupmod -g 1003 nfsnobod
3-指定共享目录权限anonuid和anongid
[root@nfs01 data1001]# cat /etc/exports
172.16.1.0/24(rw,sync,root_squash,all_squash,anonuid=1001,anongid=1001)
[root@nfs01 data1001]#
1.8 固定nfs服务端口
NFS启动时会随机启动多个端口并向RPC注册,为了设置安全组以及iptables规则,需要设置NFS固定端口。
NFS服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad这5个服务,其中nfs、portmapper的端口是固定的,另外三个服务的端口是随机分配的,所以需要给mountd,nlockmgr,rquotad设置固定的端口。
在/etc/sysconfig/nfs中添加如下端口配置后重启nfs服务
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004