目录
前言
环境:centos 7.9
什么是nfs网络文件共享服务
NFS是Network File System
的缩写,中文意识是网络文件系统,它的主要功能是在网络(一般局域网)间让不同的主机同享文件或目录,NFS客户端可以通过挂载的方式将NFS服务端共享的目录挂载到本地客户端的系统中(就是某一个挂载点下),这样在本地客户端看来NFS服务端的共享目录就好像自己的磁盘分区或目录一样,而实际上却是远端的NFS服务器的目录。
其实NFS就像Windows下目录共享功能,在Windows服务器中共享某一个目录,然后另外一台Windows客户端就能在“我的电脑”通过映射网络驱动器的方式,再分配一个盘符,这样就生成了一个映射盘,这个映射盘内容就是Windows服务器中共享目录的内容了。
RPC服务
NFS所支持的功能非常多,而不同的功能都会使用不同的程序来启动,而不同的程序就会有不同的端口,因此NFS的端口就无法固定,这样一来就造成了NFS客户端与NFS的服务端通信故障,为了解决这个问题,就有了RPC(Remote Procedure Call)服务来帮忙,RPC服务最主要的功能是记录每个NFS功能对应的端口,并且在NFS客户端请求NFS服务端时将端口和信息准确的传递,从而达到数据的交互,我们可以简单的理解RPC为NFS客户端和NFS服务端的中介,就像租房,顾客找到中介说要租房,中介介绍房子,中介就相当RPC,房子的所有者就相当于NFS服务端,顾客租房找中介,中介要预先有房子主人的信息才能将房源信息告诉顾客。
说明:在启动NFS服务前,必须先启动RPC服务,因为NFS服务启动时要向RPC服务注册,所以必须先启动RPC服务,如果RPC服务重启了,那么原来注册的端口数据也会丢失,因此NFS服务也必须重启才能重新向RPC注册端口信息,而如果仅仅是修改了NFS服务的配置信息,是不需要重启NFS或RPC服务的,直接nfs reload即可或exportfs -rv 即可使配置文件/etc/exportfs立即生效。
yum安装NFS服务
rpc是由rpcbind服务来提供的,这里就通过yum方式来安装nfs和rpc
yum -y install nfs-utils rpcbind
启动RPC、NFS服务:
#启动rpcbind.service,rpcbind.service监听111端口
systemctl enable --now rpcbind.service
#启动NFS服务
systemctl enable --now nfs-server.service
#查看nfs服务向RPC服务注册的端口信息,发现很多端口
rpcinfo -p localhost
nfs服务默认需要启动的服务或进程至少有NFS quotas(rpc.rquotad)、NFS daemom(nfsd)、NFS mountd(rpc.mountd)
还可以通过ps -ef| egrep "rpc|nfs"
查看,如下:
[root@node2 ~]# 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
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100024 1 udp 50678 status
100024 1 tcp 35897 status
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
100003 3 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 57905 nlockmgr
100021 3 udp 57905 nlockmgr
100021 4 udp 57905 nlockmgr
100021 1 tcp 36191 nlockmgr
100021 3 tcp 36191 nlockmgr
100021 4 tcp 36191 nlockmgr
nfsd:主要功能是管理NFS客户端是否能够登陆NFS服务器主机,包括身份ID判别等;
rpc.mountd:主要功能是管理NFS文件系统,当客户端登陆进来后,它会读取/ect/exports配置文件来对比客户端的权限,如果通过了,客户端就能正
常取得使用服务端文件的权限了;
rpc.rquotad:主要功能是管理磁盘配额;
rpc.lockd:可以用来锁定文件,用于多客户端同时写入,此功能非必要;
rpc.statd:检查文件的一致性,与rpc.lockd相关,此功能非必要;
rpc.idmapd:名字映射后台服务;
配置文件/etc/exports讲解
刚安装好的NFS服务其默认配置文件是:/etc/exports
,此文件是空的,需要用户自行配置,配置格式如下:
NFS共享目录 NFS客户端IP(参1,参2,参3,.....)
执行man exports
可以查看更具体的使用方法,有多个共享目录的话就写多行;
下面演示一下范例并讲一下NFS客户端地址的几种写法:
1、/data 192.168.118.0/24(rw,sync)
#以上命令表示服务端共享目录是/data,注意被共享的目录一定要使用绝对路径,192.168.118.63/24表示客户端地址是192.168.118.*网段,24表示
255.255.255.0,注意24与后面的括号不要有空格,rw表示运行读写,sync表示数据同步写入服务端磁盘;192.168.118.0/24这种写法可以授权整个网
段都能访问NFS服务端,是企业中较为常用的写法;
2、/data 192.168.118.63(rw,sync)
#以上命令根示例1差不多,只是这条命令仅表示192.168.118.63客户端能访问;
3(有异常,用第1条吧)、/date 192.168.118.*(rw,sync)
#跟1类似,也可以权限整个网段,但不推荐这样写;正常的写法:/date 192.168.118.0/24(rw,sync)
4、/data *(rw,sync)
#星号表示所有主机
5、如果是k8s测试集群用途的nfs,可以这样配置
/k8s *(rw,sync,no_root_squash)
配置好NFS服务后,可以查看NFS配置的参数以及默认自带的参数:cat /var/lib/nfs/etab
NFS配置权限常用参数说明
rw:Read-write,表示可读可写;
ro:Read-only,表示只读;
sync:客户端请求写入磁盘时,数据同步写入到服务端磁盘才返回,优点:数据安全不丢失,缺点:性能比不启用该参数要差;
async:写入数据时先写入内存缓冲区,直到磁盘有空档才写入磁盘,优点:可以提升写入效率,缺点:服务端异常关机内存数据会丢失;
no_root_squash:访问共享目录的用户如果是root,它对该共享目录具有 root 的权限,不安全,不建议使用;
root_squash:访问共享目录的用户如果是root,则它的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nfsnobody 身份;
all_squash:无论访问共享目录的用户身份如何,他的权限都被压缩成匿名用户,同时他的 UID 与 GID 都会变成 nfsnobody 身份;
anonuid:参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。但是,UID必
须存在于/etc/passwd中。在多NFS Clients时,如多台Web Server共享一个NFS目录,通过这个参数可以使得不同的NFS Clients写入的数据对所有
NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可;
anongid:同anonuid,区别就是把uid(用户id)换成gid(组id);
编辑/etc/exports配置文件
#创建共享目录
mkdir -p /data/k8s_data
# 输入共享目录以及授权客户端访问,保存退出,注意括号(前后不要有空格
# 注意如果是为k8s安装nfs,参数加一个no_root_squash,安装mysql有用
cat >> /etc/exports <<'EOF'
/data/k8s_data 192.168.118.0/24(rw,sync,no_root_squash)
EOF
#使配置立即生效,也可以systemctl reload nfs-server.service
exportfs -rv
#查看NFS配置的参数以及默认自带的参数,显示使用的用户为匿名用户
cat /var/lib/nfs/etab
#查看安装nfs服务默认生成的用户
grep -i nfs /etc/passwd
#把共享目录授权给上面查到的用户
chown -R nfsnobody:nfsnobody /data/k8s_data
客户端挂载服务端的共享目录
#客户端也要安装nfs-utils,主要是为了有mount.nfs、showmount命令
yum -y install nfs-utils
#不用启动nfs-server服务
systemctl disable --now nfs-server.service
#客户端查看服务端有哪些共享目录
showmount -e 192.168.118.130
#客户端挂载NFS服务端的共享目录
mount.nfs 192.168.118.130:/data/k8s_data /mnt
#查看挂载的结果
df -Th
#设置客户端开机自动挂载NFS服务端共享目录
echo "/bin/mount.nfs 192.168.118.130:/data/k8s_data /mnt " >> /etc/rc.local
# 记得加权限
chmod a+x /etc/rc.local
chmod a+x /etc/rc.d/rc.local
客户端卸载挂载
客户端取消挂载nfs目录,其实和平时取消挂载磁盘一样,即直接使用umount取消挂载即可,如下:
umount /mnt
NFS服务的重点知识梳理
多个客户端可以共同挂载一个远程的nfs共享目录,当多个NFS客户端访问服务器端的读写文件时,需要具有以下几个权限:
1、NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限。
2、NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限。
3、每台机器都对应存在和NFS默认配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)。
只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中作为集群共享存储时尤为重要。
重点NFS服务文件及命令
1、主配置文件:/etc/exports文件,一行为单位,一个共享目录就写一行;
2、完整参数配置文件:/var/lib/nfs/etab,存放NFS服务完整的参数;
3、/usr/sbin/exportfs命令:NFS服务的管理命令,修改主配置文件后直接使用该命令使配置生效,exportfs -rv 等价于systemctl reload nfs-server.service;
4、/usr/sbin/showmount命令:常用于在客户端查看NFS服务端配置及挂载情况,语法:showmount -e ip
总结
1、服务端安装rpc、nfs服务
yum install rpcbind nfs-utils -y
#必须先启动rpcbind 服务
systemctl start rpcbind.service
#然后再启动nfs服务
systemctl start nfs-server.service
#设置开机自启
systemctl enable rpcbind.service
#设置开机自启
systemctl enable nfs-server.service
2、编辑NFS服务端配置文件/etc/exports
NFS共享目录 NFS客户端地址(参1,参2,参3,.....) #这是书写格式,有多个共享目录就写多行
# 创建共享目录
mkdir -p /data/k8s_data
cat >> /etc/exports <<'EOF'
/data/k8s_data 192.168.118.0/24(rw,sync,no_root_squash)
EOF
3、客户端安装rpc服务
#客户端安装nfs-utils服务,提供mount.nfs、showmount命令
yum install nfs-utils -y
#可以不用启动nfs-utils
systemctl disable --now nfs-utils
showmount -e 192.168.118.140 #客户端查看NFS服务端有哪些共享目录
mount -t nfs 192.168.118.140:/data/k8s_data /mnt #客户端挂载NFS服务端的共享目录
df -h #查看挂载的结果,已正常挂载
ls /mnt #进入挂载点查看编辑文件
echo "/bin/mount -t nfs 192.168.118.140:/data/k8s_data /mnt " >> /etc/rc.local #设置客户端开机自动挂载NFS服务端共享目录
# 记得加权限
chmod a+x /etc/rc.local
chmod a+x /etc/rc.d/rc.local
4、客户端卸载nfs目录
#卸载
umount /mnt