NFS服务简介

NFS(Network File System,网络文件系统)主要基于TCP/IP传输的网络共享文件系统协议。

NFS的主要作用是使不同主机之间能够像访问本地文件一样访问远程服务器上的共享文件。NFS 服务的实现依赖于RPC机制,用来完成远程到本地的映射过程。

关于NFS不同版本对传输协议的选择

NFSv2NFSv3 支持 UDPTCP 两种传输协议,其中UDP协议适合较低延迟的局域网环境,而TCP协议适合更高可靠性的传输需求。在 NFSv4 中,为增强安全性和稳定性,仅支持 **TCP**协议。

RPC提供了一种标准化的通信方式,允许客户端向服务器请求执行特定的操作,比如文件读取或写入。每次访问操作会通过**RPC请求**在客户端和服务器之间进行数据交互,从而实现文件系统的远程映射。

NFS 服务器可以让客户端将网络中NFS 服务器的共享目录挂载到本地的文件系统中,看起来是本地的磁盘分区。

在这里插入图片描述


NFS的基本概念

NFS采用了客户机-服务器(Client-Server)模型

  • 服务器端:负责提供共享目录,通常通过配置文件(如Linux上的/etc/exports)定义哪些目录可以被访问,并控制访问权限。
  • 客户端:通过挂载mount操作,将远程NFS共享目录挂载到自己的本地文件系统中。挂载成功后,用户可以像使用本地文件一样访问这些文件。

NFS的主要特性

  1. 透明访问:客户端用户无需了解文件的实际位置,像使用本地文件一样访问。
  2. 跨平台支持NFS可用于Linux、Unix以及Windows系统,提升系统之间的兼容性。
  3. 多用户共享NFS允许多个用户同时访问同一目录。
  4. 基于网络传输:通过TCPUDP传输数据,支持局域网或广域网内的访问。
  5. 权限控制:支持用户权限映射(UID/GID映射),确保文件访问安全性。

NFS的常见应用场景

  1. 服务器文件共享:为集群服务器或虚拟化平台提供统一的文件存储。
  2. 数据备份与同步NFS适合用来存储备份文件,或用于集群系统的数据同步。
  3. 媒体服务器共享:媒体文件存储服务器常用NFS来共享视频、音频等资源。
  4. 开发与测试环境:开发者可以通过NFS挂载共享的代码库或测试资源,减少文件复制和同步的麻烦。

NFS的优势与劣势

优势:

  • 简化管理:多个用户共享同一个文件系统,无需为每台客户端配置独立的存储。
  • 跨平台支持:适用于多种操作系统。
  • 透明性:客户端无感知地访问远程文件,类似访问本地文件。

劣势:

  • 性能瓶颈:受限于网络带宽,性能不如本地磁盘。
  • 安全性问题:NFS的早期版本缺乏完善的加密机制。
  • 网络依赖性:网络中断会导致NFS共享不可用。
  • 锁定问题:NFS的文件锁管理在不同版本之间存在差异,可能导致并发访问问题。

NFSRPC的启动依赖(端口)

NFS的设计支持多种功能,每种功能会独立启动,并需要占用多个端口进行数据传输。NFS功能所使用的端口并不是固定的,每次启动时会随机选择一些未被使用的端口(通常小于1024)。由于端口号随机分配,客户端无法提前知道服务器每个NFS功能的端口信息,这会导致客户端无法直接连接到所需的NFS服务。

NFS服务本身的端口是2049

概述

  1. 随机端口选择的必要性
  2. RPC的作用:提供一个固定端口111来进行客户端与服务器的通信。
  3. NFSRPC的启动依赖:确保RPC先启动,避免服务注册信息丢失。

为了解决这个问题,NFS依赖于 RPC(Remote Procedure Call,远程过程调用)服务。当服务器启动NFS时,NFS的各个功能会随机选择端口并向RPC注册,使RPC知道每个功能对应的端口号。RPC服务通过固定端口111监听客户端请求,当客户端想要访问NFS服务时,会先通过RPC查询对应功能的端口号,再通过该端口连接NFS服务,从而实现通信。

注意:由于NFS启动时必须向RPC注册端口信息,因此,RPC服务需要在NFS启动之前启动。如果RPC在运行中被重新启动,则原先注册的NFS端口信息会丢失,导致客户端连接失败。这种情况下,NFS服务也需要重新启动,以便重新向RPC注册端口信息。


NFS的安装与配置文件解析(Linux环境-RHEL系统**)**

1. 安装NFS服务

dnf install nfs-utils

2. 配置共享目录

编辑/etc/exports文件,格式如下


<共享目录路径> <允许的客户端网段>(<选项1>,<选项2>,...)								
  • 客户端网段也可以用*:表示所有主机

常用配置选项参数

选项参数作用说明
访问权限rw,ro该目录共享的权限是可读写还是只读,但最终能否读写,还是与 文件系统的rwx有关
数据同步模式sync,async**sync**代表数据会同步写入到内存与硬盘中,确保数据一致性
**async**则代表数据会 先暂存于内存当中,而非直接写入硬盘。可以提高写入性能,但可能导致意外断电或系统故障时数据丢失。适合非关键数据共享
用户权限映射root_squashno_root_squash若客户端在共享目录里创建的文件的所属者和所属组是root用户 和root组,那么显示文件的属主和属组时有以下两种情况:
no_root_squash:文件的所属者和所属组是root用户和 root组
root_squash:将客户端的root用户和组映射为匿名用户和组 ,避免客户端的root用户对共享目录有过高权限(默认的安全设置)
匿名用户ID设置anonuid=UID , anongid=GID指定匿名用户的UIDGID,通常与root_squashall_squash结合使用。默认情况下匿名用户的UIDGID为65534(nfsnobody)。可以更改此配置以符合特定安全需求
安全与网络控制secure ,insecuresecure:仅允许客户端从小于1024的端口连接(默认),确保更高的安全性
insecure:允许客户端使用非特权端口连接,适合某些受信任的网络环境
子目录检查no_subtree_checksubtree_check**no_subtree_check😗*禁用子目录检查以提高性能,是非常常用的优化配置,特别适用于共享的目录与子目录在同一文件系统上的情况。
subtree_check:启用子目录检查,检查客户端是否有权限访问共享目录下的子目录。适合复杂目录结构,但会增加开销。

NFS服务器配置文件/etc/exports中其余可选的配置选项及其说明

用户权限映射选项

  • all_squash:将所有客户端用户(包括非root用户)映射为匿名用户。
  • no_all_squash:允许所有客户端用户保持原始用户身份(默认)。

传输选项

  • wdelay:服务器等待其他相关的写操作到达,再一起处理,提高磁盘写入性能(默认启用)。
  • no_wdelay:立即处理写操作请求,适用于sync选项配置的共享目录,确保写操作的快速执行。

跨文件系统选项

  • crossmnt:允许客户端跨文件系统边界访问共享目录中的挂载点(适用于共享目录内有其他挂载文件系统的情况)。
  • nohide:在NFS客户端视图中显示挂载在NFS导出的共享目录下的其他文件系统。注意,这种方式在NFSv4中不被支持。

文件锁定选项

  • lock:允许客户端对NFS共享目录中的文件进行锁定操作(默认)。
  • nolock:禁用文件锁定功能,这个选项可以用于不支持文件锁的系统。

数据缓存选项

  • noac:关闭客户端的属性缓存,确保客户端对文件属性的请求每次都直接从服务器获取,适用于文件属性变化频繁的情况。
  • actimeo=N:设置客户端的文件属性缓存时间,以秒为单位,N是时间长度。该选项影响acregminacregmaxacdirminacdirmax四个参数。
  • acregmin=N:最小缓存时间(秒)用于普通文件属性。
  • acregmax=N:最大缓存时间(秒)用于普通文件属性。
  • acdirmin=N:最小缓存时间(秒)用于目录属性。
  • acdirmax=N:最大缓存时间(秒)用于目录属性。

配置文件示例

以下是一个典型的/etc/exports配置文件示例,结合了多个选项:

# 共享 /srv/shared 目录,允许特定网段内所有客户端读写访问
/srv/shared 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)

# 共享 /home/public 目录,只允许单个IP访问,设置为只读
/home/public 192.168.1.50(ro,sync,secure)

# 共享 /mnt/backup 目录,映射所有用户到匿名用户,允许所有客户端访问
/mnt/backup *(rw,sync,all_squash,anonuid=65534,anongid=65534,async)

# 共享 /var/www 目录,允许指定主机名访问,启用文件锁定
/var/www client1.example.com(rw,sync,subtree_check,lock)

NFS服务配置简单流程

服务端配置过程

#**临时禁用防火墙和 SELinux**
systemctl stop firewalld 
setenforce 0
#启动服务
systemctl start nfs-server
#创建共享目录
mkdir /public
touch /public/{1..10}
#配置 /etc/exports 文件
vim /etc/exports 

/public *(ro)
#刷新/应用配置
exportfs -r

客户端操作流程

#创建/选择挂载点
mkdir /nfs
#将服务器上的共享目录 /public 挂载到本地 /nfs 目录
mount 192.168.26.130:/public /nfs

#查看共享文件系统
showmount -e 192.168.26.130
#或
df -h

注意事项

  • 多次挂载:一个挂载点可以同时挂载多个文件系统,但后面挂载的文件系统会覆盖前面的内容。
  • 环境配置:需要在服务器临时关闭防火墙和**SELinux服务**
  • 配置更新:修改配置后需要重新加载配置文件,以应用新的配置
  • root 用户映射:在 NFS 中,客户端的 root 用户默认会被映射为 nobody 用户。如果需要保留 root 权限,可以在服务端的 /etc/exports 中添加 no_root_squash 参数。

配置autofs自动挂载

autofs 是一种自动挂载文件系统的工具,可以根据实际使用情况动态地挂载和卸载网络文件系统(如 NFS)。它的优点是可以在客户端需要访问时才挂载资源,在使用完后自动卸载,从而避免由于网络问题导致的挂载卡顿问题。下面是配置 autofs 自动挂载 NFS 的步骤:

1. 安装 autofs 服务

在客户端安装 autofs

dnf install autofs -y

2. 配置 /etc/auto.master

/etc/auto.master 文件是 autofs 的主配置文件,用于定义哪些目录需要自动挂载。该文件每一行定义一个挂载点和对应的映射文件。例如:

vim /etc/auto.master

#/misc   /etc/auto.misc
/test/nfsdir /etc/auto.nfs

  • /test/nfsdir 是自动挂载点,访问此目录时,autofs 会根据 /etc/auto.nfs 文件中的定义来执行挂载。

3. 配置 /etc/auto.nfs

创建 /etc/auto.nfs 文件以定义 NFS 服务器的挂载路径:

vim /etc/auto.nfs

在该文件中添加以下内容:

public   -fstype=nfs,rw   192.168.26.130:/public

解释:

  • public 是子目录名,当访问 /test/nfsdir/public 时会自动挂载。
  • fstype=nfs,rw 指定文件系统类型为 NFS,并设置为读写模式(若只读可设置 ro)。
  • 192.168.26.130:/publicNFS服务器的共享路径。

4. 启动并启用 autofs 服务

使用以下命令启动并设置 autofs 开机自启:

systemctl start autofs
systemctl enable autofs

5. 测试自动挂载

现在,当访问 /nfsdir/public 时,系统会自动挂载 192.168.26.130:/public。可以使用以下命令来验证是否成功:

ls /nfsdir/public

如果配置正确,此时会自动挂载该目录并显示其内容。若闲置一段时间未使用,autofs 会自动卸载该挂载点,以释放系统资源。

总结

autofs 的配置通过以下几个步骤完成:

  • 配置 /etc/auto.master 文件定义挂载点。
  • 配置 /etc/auto.nfs 文件定义 NFS 挂载规则。
  • 启动并验证 autofs 的自动挂载效果。

autofs 会在访问时自动挂载 NFS 文件系统,并在闲置后自动卸载,提高了网络文件系统的使用效率和稳定性。

启动autofs服务前后对比演示

未启动服务查询挂载

[root@localhost ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  1.8G     0  1.8G    0% /dev/shm
tmpfs                  724M  9.6M  714M    2% /run
/dev/mapper/rhel-root   17G   15G  2.4G   86% /
/dev/nvme0n1p2         960M  292M  669M   31% /boot
/dev/loop0             9.9G  9.9G     0  100% /media
/dev/nvme0n1p1         599M  7.0M  592M    2% /boot/efi
tmpfs                  362M   52K  362M    1% /run/user/42
tmpfs                  362M   36K  362M    1% /run/user/0

未启动服务查看目录

[root@localhost ~]# ls /test/nfsdir/public
ls: 无法访问 '/test/nfsdir/public': 没有那个文件或目录

#可以看到为启动自动挂载情况下,无法查看对应目录

启动服务

[root@localhost ~]# systemctl start autofs

启动服务后未激活自动挂载

[root@localhost ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  1.8G     0  1.8G    0% /dev/shm
tmpfs                  724M  9.6M  714M    2% /run
/dev/mapper/rhel-root   17G   15G  2.4G   86% /
/dev/nvme0n1p2         960M  292M  669M   31% /boot
/dev/loop0             9.9G  9.9G     0  100% /media
/dev/nvme0n1p1         599M  7.0M  592M    2% /boot/efi
tmpfs                  362M   52K  362M    1% /run/user/42
tmpfs                  362M   36K  362M    1% /run/user/0

激活自动挂载

[root@localhost ~]# ls /test/nfsdir/public
1  10  2  3  4  5  6  7  8  9

查看自动挂载结果

[root@localhost ~]# df -h
文件系统                容量  已用  可用 已用% 挂载点
devtmpfs                4.0M     0  4.0M    0% /dev
tmpfs                   1.8G     0  1.8G    0% /dev/shm
tmpfs                   724M  9.7M  714M    2% /run
/dev/mapper/rhel-root    17G   15G  2.4G   86% /
/dev/nvme0n1p2          960M  292M  669M   31% /boot
/dev/loop0              9.9G  9.9G     0  100% /media
/dev/nvme0n1p1          599M  7.0M  592M    2% /boot/efi
tmpfs                   362M   52K  362M    1% /run/user/42
tmpfs                   362M   36K  362M    1% /run/user/0
192.168.26.130:/public   17G   16G  921M   95% /test/nfsdir/public