1、基本概念
NFS(Network File System)网络文件系统,主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。
NFS是通过网络来进行服务器端和客户端之间的数据传输,NFS客户端可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载在NFS客户端本地系统中(某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的NFS服务器的目录。
2、RPC与NFS通讯原理
NFS服务器使用哪个端口来进行数据传输?一般服务器端口开在2049,但NFS支持很多功能,对应不同的应用程序,因此对应多个端口,且不固定。
客户端如何知道NFS服务器端到底使用的是哪个端口呢?–> RPC
RPC(Remote Procedure Call, 远程过程调用)统一管理NFS端口,指定每个NFS功能所对应的port number,让客户端可以连接到正常端口上去。且统一对外的端口是111。
过程如下:当NFS启动后,会随机的使用一些端口,然后NFS就会向RPC去注册这些端口。RPC记录下这些端口,并开启111端口,等待客户端RPC的请求。如果客户端有请求,服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,并以实际端口进行数据的传输。
在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务)如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。
一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行systemctl reload nfs或exportfs –rv即可使修改的/etc/exports生效
3、NFS客户端和NFS服务器通讯过程
-
首先服务器端启动RPC服务,并开启111端口
-
服务器端启动NFS服务,并向RPC注册端口信息
-
客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
-
服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
-
客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
4、NFS server的搭建
(1)使用centos8操作系统的虚拟机搭建方法
服务器端:(已最大安装系统)
①查看自带安装的nfs和rpc情况
[root@tt ~]# rpm -qa nfs*
nfs-utils-2.3.3-35.el8.x86_64
[root@tt ~]# rpm -qa rpcbin*
rpcbind-1.2.5-7.el8.x86_64
②启动nfs-server服务
[root@tt ~]# systemctl enable –now nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
启动RPC服务
[root@tt ~]# systemctl enable rpcbind
查看NFS的版本信息 + 表示支持 – 表示不支持
[root@tt ~]# cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
③创建服务器端的共享目录,作为客户端挂载的远端入口。
修改NFS配置文件,为其配置权限
[root@tt ~]#mkdir /storage
[root@tt ~]#vi /etc/exports
写入:
/storage 192.168.10.*(rw,sync,no_subtree_check,no_root_squash)
*参数说明:
参数
含义
rw
可读写
ro
只读
no_root_squash
客户机用root访问该共享文件夹时,不映射root用户
root_squash
客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
all_squash
客户机上的任何用户访问该共享目录时都映射成匿名用户
anonuid
将客户机上的用户映射成指定的本地用户ID的用户,这个UID必需要存在于你的/etc/passwd当中
Anongid
将客户机上的用户映射成属于指定的本地用户组ID
sync
资料同步写入到内存与硬盘当中
async
资料会先暂存于内存当中,而非直接写入硬盘
insecure
允许从这台机器过来的非授权访问
subtree_check
如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check
和上面相对,不检查父目录权限
subtree_check
如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check
和上面相对,不检查父目录权限
wdelay
如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay
如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide
在NFS共享目录中不共享其子目录
no_hide
共享NFS目录的子目录
secure NFS
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS
通过1024以上的端口发送
fsid 见下方详细说明
fsid 参数具体含义如下:
For NFSv4, there is a distinguished filesystem which is the root of all exported filesystem. This is specified with fsid=root or fsid=0 both of which mean exactly the same thing.
参考链接:https://www.suse.com/support/kb/doc/?id=000017897
若使用参数fsid=0,在挂载时不指定版本,或指定版本但指定挂载路径为之前/etc/exports中设置的共享目录/storage时,nfs会默认使用ver3版本
例如:
/etc/exports中配置为
/storage 192.168.10.*(rw,sync,no_subtree_check,no_root_squash,fsid=0)
在客户端使用命令mount.nfs4 192.168.167.100:/storage /share进行挂载
若使用参数fsid=0,在挂载时指定版本ver4,并指定挂载路径为根目录,则nfs会使用ver4版本
如在客户端使用命令mount.nfs4 192.168.167.100:/ /share 进行挂载
若不使用参数fsid=0,在HC界面直接挂载,不指定版本,则nfs会使用ver4版本(本文在配置时选用的是这种方式,不配置参数fsid=0)
④重启服务
[root@tt ~]# systemctl restart rpcbind
[root@tt ~]# systemctl reload nfs-server
[root@tt ~]# netstat -antp | grep rpc
查看配置
[root@tt ~]# showmount -e
(2)使用Centos8操作系统的虚拟机搭建方法 服务器端:
挂载光驱安装系统时,需要选择SOFTWARE SELECTION中的以下配置:
重启后进入系统
查看自带安装的nfs和rpc情况
其他步骤与hs中搭建一致
备注:防火墙操作 service network restart或者systemctl restart network
在CentOS 8中执行以上命令会报错
正确的命令为nmcli c reload
(3)使用windows server2016操作系统的虚拟机搭建方法
① 创建磁盘:为windows虚拟机新增一个磁盘。
在虚拟机内部,右键开始菜单,选择磁盘管理,初始化磁盘,选择默认选项并确定。
对未分配的该卷新建简单卷,并格式化成NTFS格式
之后右键,将该格式化后的分区标记为活动分区
② 为虚拟机配置ip
为虚拟机配置一个ip地址,能够与使用NFS共享的服务器互通。
③ NFS服务器安装配置
在服务器管理器下点击添加角色和功能。
选择服务器角色,然后勾选NFS服务器,下一步直到安装就可以了。
安装完成后,点击服务器管理器下的文件和存储服务,然后点击共享,在右边的任务下拉菜单中点击新建共享。
选择NFS共享,快速和高级都可以,然后下一步。
在共享位置的地方,可以选择整个分区,也可以点击浏览选择分区下的某个文件夹。
设置一个共享名称,最好用英文,客户端访问的时候比较容易输入也不会出现乱码的情况。
指定身份验证的方法,可以使用kerberos验证,也可以不做验证。
添加权限,也就是谁可以访问NFS,可以是IP地址,工作组,还可以是所有的机器都可以访问,可以分配读写权限也可以分配只读权限。
一直点击下一步,之后确认创建
④ 在需要关联的客户端上上新建NFS存储池使用
可在客户端查看挂载目录
备注:使用windows server2016搭建的nfs存储在使用上存在问题,创建qcow2的精简模式的文件会失败。不推荐使用。
(4)使用ubuntu2204操作系统的虚拟机搭建方法
*使用sudo -s命令进入超级用户权限。否则运行命令时需要在前面加sudo
① 为虚拟机配置静态ip
cd /etc/netplan
vim 00-installer-config.yaml
配置如下:
This is the network config written by ‘subiquity’
network:
ethernets:
ens3:
dhcp4: no
addresses: [192.168.190.88/24]
gateway4: 192.168.190.254
version: 2
② NFS服务器安装与配置
ubuntu默认没有安装nfs,需要先连接外网,下载nfs-kernel-server:
apt-get install nfs-kernel-server
创建共享文件夹
cd /home/gzh/nfstest
mkdir nfstest
配置nfs服务
vim /etc/exports 写入下述配置。具体配置的含义见第一条。
/home/gzh/nfstest *(rw,sync,no_subtree_check,no_root_squash)
挂载目录为/home/gzh/nfstest
重启nfs服务:
/etc/init.d/nfs-kernel-server restart
查看nfs服务状态:
/etc/init.d/nfs-kernel-server status
已搭建好的nfs镜像已上传ftp:
用户名gzh
密码ctsi@Passw0rd
5、相关命令和操作:
mount | grep nfs 查看主机nfs的挂载情况
systemctl status nfs-server 查看nfs服务的启动情况
showmount -e 192.168.190.88 客户端侧查看挂载目录
在客户端使用命令 mount或nfsstat -m 可以查看nfs版本
在服务端使用命令nfsstat -s可以查看nfs版本
扩展:虚拟机永久挂载磁盘
虚拟机搭建NFS客户端时,会受到存储大小的限制,导致存储池比较小。可以不用系统盘,新增较大的磁盘作为共享目录。永久挂载磁盘到共享目录/storage的方式如下:
mkfs.xfs /dev/vdb
mount /dev/vdb /storage
硬盘uuid查看命令:
[root@ceph-3 vms]# blkid /dev/sdb
/dev/sdb: UUID=“2b097401-6f4c-41fa-814d-e96c9a734149” BLOCK_SIZE=“512” TYPE=“xfs”
vim /etc/fstab 中增加:
UUID=2b097401-6f4c-41fa-814d-e96c9a734149 /storage xfs defaults 0 0
需要重启服务
systemctl restart rpcbind
systemctl reload nfs-server
6、版本情况
(1)系统版本对NFS的影响:
RHEL6.5以NFSv3作为默认版本,NFSv3使用TCP、UDP协议(端口号是2049),默认是UDP;
RHEL7和RHEL8以ver4作为默认版本,NFSv4使用TCP协议(端口号是2049)和NFS服务器建立连接。
RHEL7默认的NFS配置文件是/etc/sysconfig/nfs
RHEL8默认的NFS配置文件是/etc/ nfs.conf
(2)X86默认版本
①使用centos8虚拟机默认搭建的nfs,配置/ext/exports中使用fsid=0参数时
关联主机后查到版本是vers=3
192.168.202.34:/storage on /nfs type nfs (rw,nosuid,nodev,noexec,relatime,vers=3,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.202.34,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=192.168.202.34)
且HA迁移时报错:failed to get “write” lock
②当配置nfs服务器参数时,不配置fsid=0,关联主机后查到版本是vers=4.2
(3)ARM默认版本
ARM情况与x86一致
7、存在的问题
(1) NFS异常时阻塞问题
nfs存储异常检测:需要 NFS server异常。可以模拟NFS server虚拟机关机 NFS 服务重启等。观察主机上存储池虚拟机状态。
目前情况的处理办法:
umount -l nfsmount点
通过mount | grep nfs 命令查看nfs mount点
如上图,mount点为/data/vms/qnfs
如果不恢复 使用systemctl restart libvirtd命令重启libvirtd
关联NFS存储池时连接超时
可能原因:nfs server的防火墙没有开放nfs端口。
解决办法:nfs真实端口其实不是111,111端口是rpc的,nfs所有的端口都要报备给rpc, 通过rpc 111端口发出来。但是centos有针对nfs服务的放行。命令:firewall-cmd –permanent –add-service=nfs
或关闭防火墙