【网络运维】Linux:NFS服务器原理及配置
NFS 服务器
NFS 服务介绍
NFS 是Network File System的缩写,即网络文件系统,最早由Sun公司开发,**用来在UNIX&Linux系统间实现磁盘文件共享的一种方法。**它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地看,NFS服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的NFS服务端的目录。
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件。一般是把网站用户上传的文件都放在NFS共享里,例如,BBS产品的图片、附件、头像,特别是中小网站公司应用频率更高。
NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口没有固定住,而是随机取用一些未被使用的小于1024的端口提供服务。但如此一来客户端如何获得服务器端的相关端口呢?
此时我们就得需要远程过程调用(RPC)的服务!RPC最主要的功能是注册每个NFS功能所对应的端口,并且汇报给客户端,让客户端可以连结到正确的端口。RPC定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息。
- NFS 服务器:导出文件系统目录及其内容。
- NFS 客户端:挂载服务器导出的文件系统到本地。
部署服务
NFS服务由nfs-utils软件包提供,RHEL8默认安装了该软件包。
# 安装软件包
[root@server ~]# yum install -y nfs-utils# 准备用户
[root@server ~]# useradd -u 1000 furongwang
[root@server ~]# echo 123 | passwd --stdin furongwang# 准备共享目录
[root@server ~]# mkdir -p /shares/nfs
[root@server ~]# chown furongwang /shares/nfs# 启用并启动服务
[root@server ~]# systemctl enable nfs-server --now # 配置防火墙
[root@server ~]# firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind --add-service=mountd
[root@server ~]# firewall-cmd --reload
配置 NFS 导出
NFS服务器主要配置文件是 /etc/exports,目录 /etc/exports.d中任何以 .exports结尾且不以点(.)开头的文件也会生效。 所有这些文件都使用相同的语法。
提示: 与编辑文件/etc/exports本身相比,在/etc/exports.d中创建或删除文件可能更容易,并且它可以减少一系列相关配置更改意外破坏现有导出的风险。
配置文件中,每一行都声明一个导出点。 第一个字段是要导出到客户端的目录的名称。 该行的其余部分列出了可以访问共享目录的客户端系统以及授予它们的访问权限。
提示: NFS不要使用SMB共享的目录。 如果这样做,则可能会导致文件损坏或其他文件完整性或一致性问题。
配置示例:
- 可解析DNS的主机名,例如client.furongwang.cloud。 在以下示例中,client.furongwang.cloud系统可以挂载/shares/nfs目录。
/shares/nfs client.furongwang.cloud
- DNS解析的主机名,带*通配符。 以下示例允许furongwang.cloud域中的所有系统访问NFS共享。
/shares/nfs *.furongwang.cloud
- IPv4地址。 以下示例允许从10.1.8.11 IP地址访问NFS共享。
/shares/nfs 10.1.8.11
- IPv4网络。 以下示例允许从10.1.8.0/24网络访问NFS共享。 也可以使用10.1.8.0/255.255.255.0 表示法。
/shares/nfs 10.1.8.0/24
/shares/nfs 10.1.8.0/255.255.255.0
- IPv6地址。 以下示例允许具有fde2:6494:1e09:2::20 IPv6地址的客户端系统访问NFS共享。
/shares/nfs fde2:6494:1e09:2::20
- IPv6网络。 以下示例允许fde2:6494:1e09:2::/64 IPv6网络访问NFS共享。
/shares/nfs fde2:6494:1e09:2::/64
- 要与多个客户机系统共享目录,请在目录名称后使用以空格分隔的列表:
/shares/nfs 10.1.8.0/24 client.furongwang.cloud *.example.net
默认情况下,目录以只读模式与客户端共享。 在每个客户定义之后,您可以立即在括号中指定导出选项以覆盖默认值。 客户端定义的末尾和左括号之间必须没有空格。
常用的选项:
-
rw,此选项允许对指定客户端进行读/写访问。 如果没有该选项(或者如果您使用ro代替),则NFS仅授予读取访问权限。 在以下示例中,client.furongwang.cloud具有读/写访问权限,而client2.furongwang.cloud具有只读访问权限。
/shares/nfs client.furongwang.cloud(rw) client2.furongwang.cloud
-
no_root_squash,默认情况下,当客户机上的root用户访问NFS导出时,服务器会将其视为nobody用户(在服务器上定义)的访问。 这意味着,如果客户端上的root用户在导出文件上创建了文件,则该文件将归用户nobody所有。 这也意味着,如果客户机上的root用户尝试读取导出文件,而该文件是没人能读取的用户,则访问将失败。 您可以通过添加no_root_squash选项来禁用该安全保护。
以下示例允许client.furongwang.cloud系统具有对/shares/nfs导出目录的读/写访问权限和实际root用户访问权限。
/shares/nfs client.furongwang.cloud(rw,no_root_squash)
提示: rhel7中使用nfsnobody用户,rhel8中使用nobody用户。
我们使用以下记录:
[root@server ~]# vim /etc/exports
/shares/nfs 10.1.8.0/24(rw)
每当您在/etc/exports或/etc/exports.d/*.exports中更改导出点时,请对NFS服务运行exportfs -r命令确保更改生效,或者运行systemctl reload nfs-server
。
[root@server ~]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av
监视 NFS 导出
使用exportfs命令列出NFS服务器当前导出的目录。
[root@server ~]# exportfs
/shares/nfs 10.1.8.0/24
默认情况下,该命令不显示导出选项。 使用-v选项列出这些选项,包括缺省选项。
[root@server ~]# exportfs -v
/shares/nfs 10.1.8.0/24(sync,...,rw,secure,no_root_squash,...)
客户端挂载
# 安装软件包
[root@client ~]# yum install -y nfs-utils
# 准备用户
[root@client ~]# useradd -u 1000 furongwang
[root@client ~]# echo redhat | passwd --stdin furongwang# 查看服务端提供的共享
[root@client ~]# showmount -e server
Export list for server:
/shares/nfs 10.1.8.0/24# 挂载
[root@client ~]# mkdir /mnt/nfs
[root@client ~]# mount -t nfs server:/shares/nfs /mnt/nfs# root用户不能创建
[root@client ~]# touch /mnt/nfs/root-f1
touch: cannot touch ‘/mnt/nfs/root-f1’: Permission denied# furongwang用户能创建
[furongwang@client ~]$ touch /mnt/nfs/furongwang-f1
持久化挂载
修改 /etc/fstab,最后添加如下记录:
server:/shares/nfs /mnt/nfs nfs defaults 0 0