NFS 服务器
摘要:本文全面介绍了 NFS(Network File System)网络文件系统,涵盖其核心概念、架构原理、版本发展、工作原理、传输特性、优势与局限性,并提供了详细的部署配置实践指南。NFS 作为经典的网络文件共享协议,可实现局域网内不同主机间的文件透明访问,广泛应用于企业服务器集群和局域网文件共享场景。文章详细讲解了 NFSv3 和 NFSv4 的特性差异,基于 RPC 的工作流程,以及 UDP/TCP 双协议传输支持。实践部分包括服务端安装配置、共享目录导出、客户端挂载、权限管理和持久化配置等完整操作步骤,帮助读者快速掌握 NFS 服务的部署与应用。
一、NFS 服务介绍
NFS(Network File System,网络文件系统)是一款经典的网络文件共享协议,核心作用是实现局域网内不同主机之间的文件资源共享。通过NFS,客户端可以直接挂载远程服务器的共享目录,像访问本地磁盘一样读写远程文件,实现跨设备、跨系统的文件透明访问,是企业服务器集群、局域网文件共享中最常用的存储技术之一。
1.NFS 起源与版本发展
NFS 由 Sun Microsystems(太阳微系统公司)于20世纪80年代研发,最初专为UNIX系统设计,用于解决多台UNIX主机之间的文件互通问题。凭借架构简单、部署轻便、传输高效的特点,快速成为行业通用的网络共享标准,后续逐步适配Linux、macOS等主流系统。
经过多年迭代,NFS 形成两个主流商用版本,特性差异明显:
- NFSv3:目前兼容性最强、使用最广泛的经典版本。支持大文件传输、异步读写,适配绝大多数老旧硬件和网络环境,部署简单、稳定性高,但安全性薄弱,无内置加密和高级认证机制。
- NFSv4:新一代标准版本,全面优化安全性与功能性。支持Kerberos安全认证、数据加密、状态化连接和完善的文件锁机制,解决了旧版本安全短板,同时优化了跨网络访问能力,适配复杂的企业网络环境。
2.NFS 核心架构
NFS 采用标准的客户端/服务器(C/S)架构,服务分工明确,架构轻量化:
(1) NFS 服务端
部署在存储服务器端,核心功能是提供文件共享资源。通过专属守护进程监听客户端请求,负责发布共享目录、校验客户端访问权限、处理文件读写、创建、删除等操作,统一管控共享资源,实现集中式存储管理。
(2) NFS 客户端
所有需要访问共享资源的主机均为客户端。客户端无需复杂配置,仅需通过挂载命令,将服务端的共享目录挂载到本地空目录,挂载完成后,即可将远程共享目录当作本地磁盘使用,实现无感式文件访问。
3.NFS 工作原理
NFS 基于RPC(远程过程调用协议)实现跨主机通信,所有文件操作均通过RPC调用完成,完整工作流程分为五个阶段:
- 服务注册:NFS服务端启动后,主动向RPC服务注册自身端口与服务信息,由RPC统一管理端口映射。
- 端口查询:客户端发起挂载请求前,先向RPC服务查询NFS服务的通信端口,获取服务端访问入口。
- 权限校验与挂载:客户端携带主机信息发起挂载请求,服务端读取配置文件校验客户端IP、访问权限,校验通过则允许挂载。
- 文件交互:挂载成功后,客户端所有文件操作(读、写、新增、删除)都会转化为RPC远程调用,发送至服务端执行,服务端处理后返回结果。
- 权限管控:依托Linux/UNIX原生UID、GID用户权限机制管控访问权限,服务端根据用户身份和共享权限配置,限制客户端的操作范围。
4.NFS 传输特性
(1)无状态传输(NFSv3及以下)
低版本NFS属于无状态协议,服务端不记录客户端的连接状态。网络中断、服务重启后,客户端可直接重连继续操作,无需恢复连接状态,容错性强、协议轻量化。NFSv4为有状态协议,连接稳定性和数据一致性更强。
(2) 双协议传输支持
NFS 同时支持 UDP 和 TCP 两种传输协议:UDP 开销小、传输速度快,适用于局域网高速轻量传输场景;TCP 面向连接、具备重传校验机制,传输可靠性高,是目前公网、大容量数据传输的主流选择。
5.NFS 核心优势
- 访问透明:远程共享目录完全适配本地文件操作逻辑,用户无需区分本地/远程存储,使用门槛极低。
- 跨平台兼容:支持Linux、UNIX、macOS等多系统,可实现异构系统之间的文件共享。
- 传输高效:协议精简、缓存机制成熟,局域网内传输速度快,性能损耗低,满足企业常规存储需求。
- 部署简单易管理:配置命令简洁,仅需修改核心配置文件即可发布、调整共享资源,支持集中化存储管理,运维成本低。
6.NFS 局限性
- 安全性不足:NFSv3及旧版本无数据加密、身份认证机制,仅依靠IP权限管控,易被监听、伪造攻击;NFSv4安全升级后,仍无法满足高密级业务场景。
- 高度依赖网络:所有数据交互均依托网络,网络延迟、丢包、中断会直接导致传输卡顿、操作失败,无法离线使用。
- 多客户端并发短板:多主机同时读写同一文件时,文件锁机制复杂,配置不当易出现数据覆盖、数据不一致问题,高并发场景适配性较差。
7.典型应用场景
- 企业局域网共享:用于办公文件、安装包、资源文件的统一共享,实现多终端资源互通,提升办公协作效率。
- 服务器集群存储:为Web集群、业务集群、测试集群提供统一共享存储,保证所有集群节点读取的数据完全一致,实现数据同步。
- 嵌入式与小型设备:适配路由器、嵌入式存储设备等轻量化硬件,作为低成本、简易的跨设备数据交互方案。
8.总结
NFS 是一款成熟、轻量化、高性能的网络文件共享协议,凭借部署简单、跨平台、传输高效的核心优势,长期占据局域网共享存储主流地位。虽然在安全性、高并发、网络适配性上存在一定短板,但通过版本升级、搭配防火墙、VPN等安全策略优化后,依然广泛应用于企业内网、服务器集群、小型存储场景,是运维和存储领域不可或缺的基础服务。
二、NFS 服务最佳实践
1.部署服务
NFS服务由nfs-utils软件包提供。
# 安装软件包[root@server ~ 09:05:10]# yum install -y nfs-utils#准备用户#创建用户命令:useradd -u 1000 XXX#设置密码命令:echo '密码'|passwd --stdin xxx[root@server ~12:30:05]# cat /etc/passwd |grep lzlz:x:1000:1000:lz:/home/lz:/bin/bash# 准备共享目录[root@server ~ 09:41:44]# mkdir -p /shares/webapp[root@server ~10:07:45]# chown 1000 /shares/webapp# 启用并启动服务[root@server ~10:09:09]# systemctl enable nfs-server --now#配置防火墙[root@server ~12:30:11]# systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded(/usr/lib/systemd/system/firewalld.service;disabled;vendor preset: enabled)Active: inactive(dead)Docs: man:firewalld(1)#如果防火墙启动了,可以执行下方命令#firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind --add-service=mountd# firewall-cmd --reload2.配置 NFS 导出
NFS服务器主要配置文件是/etc/exports,目录/etc/exports.d中任何以.exports结尾且不以点(.)开头的文件也会生效。 所有这些文件都使用相同的语法。
==提示:==与编辑文件/etc/exports本身相比,在/etc/exports.d中创建或删除文件可能更容易,并且它可以减少一系列相关配置更改意外破坏现有导出的风险。
配置文件中,每一行都声明一个导出点。 第一个字段是要导出到客户端的目录的名称。 该行的其余部分列出了可以访问共享目录的客户端系统以及授予它们的访问权限。
==提示:==NFS不要使用SMB共享的目录。 如果这样做,则可能会导致文件损坏或其他文件完整性或一致性问题。
配置示例:
• 可解析DNS的主机名,例如client.lz.cloud。 在以下示例中,client.lz.cloud系统可以挂载/shares/webapp目录。
/shares/webapp client.lz.cloud•DNS解析的主机名,带*通配符。 以下示例允许laoma.cloud域中的所有系统访问NFS共享。
/shares/webapp *.lz.cloud• IPv4地址。 以下示例允许从10.1.8.12 IP地址访问NFS共享。
/shares/webapp10.1.8.11• IPv4网络。 以下示例允许从10.1.8.0/24网络访问NFS共享。 您也可以使用10.1.8.0/255.255.255.0 表示法。
/shares/webapp10.1.8.0/24 /shares/webapp10.1.8.0/255.255.255.0• IPv6地址。 以下示例允许具有fde2:6494:1e09:2::20 IPv6地址的客户端系统访问NFS共享。
/shares/webapp fde2:6494:1e09:2::20• IPv6网络。 以下示例允许fde2:6494:1e09:2::/64 IPv6网络访问NFS共享。
/shares/webapp fde2:6494:1e09:2::/64• 要与多个客户机系统共享目录,请在目录名称后使用以空格分隔的列表:
/shares/webapp10.1.8.0/24 client.lz.cloud *.example.net默认情况下,目录以只读模式与客户端共享。 在每个客户定义之后,您可以立即在括号中指定导出选项以覆盖默认值。客户端定义的末尾和左括号之间必须没有空格。
常用的选项:
• rw,此选项允许对指定客户端进行读/写访问。 如果没有该选项(或者如果您使用ro代替),则NFS仅授予读取访问权限。 在以下示例中,client.lz.cloud具有读/写访问权限,而client2.lz.cloud具有只读访问权限。
/shares/webapp client.lz.cloud(rw)client2.lz.cloud• no_root_squash,默认情况下,当客户机上的root用户访问NFS导出时,服务器会将其视为nobody用户(在服务器上定义)的访问。 这意味着,如果客户端上的root用户在导出文件上创建了文件,则该文件将归用户nobody所有。 这也意味着,如果客户机上的root用户尝试读取导出文件,而该文件是没人能读取的用户,则访问将失败。 您可以通过添加no_root_squash选项来禁用该安全保护。
以下示例允许client.lz.cloud系统具有对/shares/webapp导出目录的读/写访问权限和实际root用户访问权限。
/shares/webapp client.lz.cloud(rw,no_root_squash)我们使用以下记录:
[root@server ~10:09:14]# vim /etc/exports/shares/webapp10.1.8.0/24(rw)每当您在/etc/exports或/etc/exports.d/*.exports中更改导出点时,请对NFS服务运行exportfs -r命令确保更改生效,或者运行systemctl reload nfs-server。
[root@server ~10:10:18]# exportfs -r# 或者# systemctl reload nfs-server# 或者# exportfs -av3.监视 NFS 导出
使用exportfs命令列出NFS服务器当前导出的目录。
[root@storage ~10:10:18]# exportfs/shares/webapp10.1.8.0/24默认情况下,该命令不显示导出选项。 使用-v选项列出这些选项,包括缺省选项。
[root@server ~10:10:25]# exportfs -v/shares/webapp10.1.8.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)4.客户端挂载
# 安装软件包[root@client ~ 09:05:05]# yum install -y nfs-utils[root@client ~10:11:04]# id lzuid=1000(lz)gid=1000(lz)组=1000(lz)[root@client ~10:12:05]# systemctl enable httpd --now# 查看服务端提供的共享[root@client ~10:12:23]# showmount -e serverExport listforserver: /shares/webapp10.1.8.0/24# 挂载[root@client ~10:13:01]# mount -t nfs server:/shares/webapp /var/www/html[root@client ~10:14:11]# df -h /var/www/html/文件系统 容量 已用 可用 已用% 挂载点 server:/shares/webapp 50G1.6G 49G4% /var/www/html#测试[root@server ~10:15:03]# touch /shares/webapp/index.html[root@server ~10:19:43]# echo hello > /shares/webapp/index.html[root@server ~10:20:00]# curl http://10.1.8.11hello[root@client ~10:21:25]# ls /var/www/html/index.html[root@client ~10:30:17]# ls -l /var/www/html/总用量4-rw-r--r--1root root65月2710:20 index.html# root用户不能创建[root@client ~10:36:50]# echo abc > /var/www/html/test.html-bash: /var/www/html/test.html: 权限不够# lz 用户能创建[root@client ~10:37:34]# su -l lz -s /bin/bash -c 'echo abc > /var/www/html/test.html'访问测试
[root@client ~10:41:25]# cat /var/www/html/test.htmlabc[root@client ~10:41:25]# cat /var/www/html/test.htmlabc5.持久化挂载
修改 /etc/fstab,最后添加如下记录:
[root@client ~10:44:15]# umount /var/www/html[root@client ~10:44:47]# vi /etc/fstab#storage:/shares/webapp /var/www/html nfs defaults 0 0[root@client ~10:46:47]# mount -a测试
#重启[root@client ~10:46:50]# reboot#server访问可以[root@server ~10:42:30]# curl http://10.1.8.11/test.htmlabc