NFS
服务简介
NFS
(Network File System,网络文件系统)主要基于TCP/IP
传输的网络共享文件系统协议。
NFS
的主要作用是使不同主机之间能够像访问本地文件一样访问远程服务器上的共享文件。NFS
服务的实现依赖于RPC
机制,用来完成远程到本地的映射过程。
关于NFS
不同版本对传输协议的选择
NFSv2
和NFSv3
支持 UDP
和TCP
两种传输协议,其中UDP
协议适合较低延迟的局域网环境,而TCP
协议适合更高可靠性的传输需求。在 NFSv4
中,为增强安全性和稳定性,仅支持 **TCP
**协议。
RPC
提供了一种标准化的通信方式,允许客户端向服务器请求执行特定的操作,比如文件读取或写入。每次访问操作会通过**RPC
请求**在客户端和服务器之间进行数据交互,从而实现文件系统的远程映射。
NFS
服务器可以让客户端将网络中NFS
服务器的共享目录挂载到本地的文件系统中,看起来是本地的磁盘分区。
NFS的基本概念
NFS
采用了客户机-服务器(Client-Server)模型:
- 服务器端:负责提供共享目录,通常通过配置文件(如Linux上的
/etc/exports
)定义哪些目录可以被访问,并控制访问权限。 - 客户端:通过挂载
mount
操作,将远程NFS
共享目录挂载到自己的本地文件系统中。挂载成功后,用户可以像使用本地文件一样访问这些文件。
NFS
的主要特性
- 透明访问:客户端用户无需了解文件的实际位置,像使用本地文件一样访问。
- 跨平台支持:
NFS
可用于Linux、Unix以及Windows系统,提升系统之间的兼容性。 - 多用户共享:
NFS
允许多个用户同时访问同一目录。 - 基于网络传输:通过
TCP
或UDP
传输数据,支持局域网或广域网内的访问。 - 权限控制:支持用户权限映射(
UID
/GID
映射),确保文件访问安全性。
NFS
的常见应用场景
- 服务器文件共享:为集群服务器或虚拟化平台提供统一的文件存储。
- 数据备份与同步:
NFS
适合用来存储备份文件,或用于集群系统的数据同步。 - 媒体服务器共享:媒体文件存储服务器常用
NFS
来共享视频、音频等资源。 - 开发与测试环境:开发者可以通过
NFS
挂载共享的代码库或测试资源,减少文件复制和同步的麻烦。
NFS的优势与劣势
优势:
- 简化管理:多个用户共享同一个文件系统,无需为每台客户端配置独立的存储。
- 跨平台支持:适用于多种操作系统。
- 透明性:客户端无感知地访问远程文件,类似访问本地文件。
劣势:
- 性能瓶颈:受限于网络带宽,性能不如本地磁盘。
- 安全性问题:NFS的早期版本缺乏完善的加密机制。
- 网络依赖性:网络中断会导致NFS共享不可用。
- 锁定问题:NFS的文件锁管理在不同版本之间存在差异,可能导致并发访问问题。
NFS
和RPC
的启动依赖(端口)
NFS
的设计支持多种功能,每种功能会独立启动,并需要占用多个端口进行数据传输。NFS
功能所使用的端口并不是固定的,每次启动时会随机选择一些未被使用的端口(通常小于1024)。由于端口号随机分配,客户端无法提前知道服务器每个NFS
功能的端口信息,这会导致客户端无法直接连接到所需的NFS
服务。
NFS服务本身的端口是2049
概述
- 随机端口选择的必要性。
RPC
的作用:提供一个固定端口111来进行客户端与服务器的通信。NFS
和RPC
的启动依赖:确保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_squash ,no_root_squash | 若客户端在共享目录里创建的文件的所属者和所属组是root用户 和root组,那么显示文件的属主和属组时有以下两种情况: |
no_root_squash :文件的所属者和所属组是root用户和 root组 | ||
root_squash :将客户端的root用户和组映射为匿名用户和组 ,避免客户端的root用户对共享目录有过高权限(默认的安全设置) | ||
匿名用户ID设置 | anonuid=UID , anongid=GID | 指定匿名用户的UID 和GID ,通常与root_squash 或all_squash 结合使用。默认情况下匿名用户的UID 和GID 为65534(nfsnobody )。可以更改此配置以符合特定安全需求 |
安全与网络控制 | secure ,insecure | secure :仅允许客户端从小于1024的端口连接(默认),确保更高的安全性 |
insecure :允许客户端使用非特权端口连接,适合某些受信任的网络环境 | ||
子目录检查 | no_subtree_check ,subtree_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
是时间长度。该选项影响acregmin
、acregmax
、acdirmin
和acdirmax
四个参数。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:/public
是NFS
服务器的共享路径。
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~