NFS网络文件系统完整自学实战博客
前言
在多服务器集群场景下,多台Web节点需要统一存放网站静态资源、附件文件,如果每台服务器单独存储,文件同步繁琐、版本不一致。NFS(Network File System)网络文件系统可以实现一台服务器统一共享目录,多客户端远程挂载,像本地磁盘一样读写文件,是中小企业Web集群、内网文件共享最常用轻量存储方案。
本文完整讲解NFS底层RPC工作原理、版本差异、优缺点、适用场景,附带三台CentOS7虚拟机完整实验,包含服务端共享配置、客户端临时挂载、fstab永久挂载、root权限放开实战,全部命令可直接复制执行。
一、NFS基础概述
1.1 什么是NFS
NFS由Sun公司在80年代推出,专为类Unix/Linux/macOS系统打造的网络文件共享协议,采用C/S架构:
NFS服务端开放本地目录,授权客户端远程挂载,客户端操作远程文件和本地文件无感知,无需拷贝文件到本地。
1.2 NFS版本区别
- NFSv3:行业广泛通用,无状态协议,支持UDP/TCP传输,兼容性强,但缺少原生加密、强认证机制;
- NFSv4:状态连接,内置Kerberos安全认证、完善文件锁,安全性大幅提升,公网/高安全环境优先使用。
1.3 核心C/S架构
- NFS Server:存放原始文件,运行nfs-server、rpcbind服务,通过exports配置共享权限;
- NFS Client:安装nfs-utils,使用mount命令挂载远程共享目录到本地挂载点,读写文件走网络RPC调用。
1.4 NFS工作流程(RPC远程调用机制)
NFS本身不处理端口注册、端口发现,依赖rpcbind(RPC服务)协同工作,完整流程:
- 服务端启动nfs-server,向rpcbind注册NFS监听端口;
- 客户端先连接服务端rpcbind,查询NFS服务端口;
- 客户端发送挂载请求,服务校验IP/网段权限;
- 挂载成功后,客户端所有读写、创建、删除操作转为RPC远程调用;
- 服务端执行本地文件操作,结果通过网络返回客户端;
- 权限校验依托系统UID/GID用户ID匹配控制读写权限。
1.5 NFS传输特性
- 无状态(v3) 服务器不保存客户端连接记录,断网重连无需重建会话,容错简单;
- 双协议支持:UDP低延迟适合内网,TCP可靠传输适合大文件跨机房场景。
1.6 NFS优缺点
优势
- 访问透明:远程目录和本地磁盘操作方式完全一致;
- 跨平台:Linux、macOS、UNIX全兼容;
- 部署简单,配置量少,轻量无复杂组件;
- 集中式存储,集群统一文件,无需同步脚本。
局限性
- NFSv3无加密、无强身份认证,仅靠IP白名单,仅适合内网;
- 极度依赖网络,延迟、丢包会直接影响文件读写速度;
- 多主机同时修改同一文件时,文件锁机制复杂,易出现数据错乱。
1.7 典型使用场景
- 企业内网办公文件集中共享;
- Apache/Nginx Web集群统一静态资源存储(本次实验场景);
- 小型数据库、日志集中存储;
- 嵌入式设备、NAS内网文件交互。
二、实验环境节点规划
三台CentOS7虚拟机,同网段互通
| 主机名 | IP地址 | 角色 |
|---|---|---|
| nfs-server | 10.1.8.20/24 | NFS共享服务端 |
| nfs-client1 | 10.1.8.21/24 | Web客户端1 |
| nfs-client2 | 10.1.8.22/24 | Web客户端2 |
所有节点基础静态IP配置
bash
# nfs-server执行
hostnamectl set-hostname nfs-server
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes
nmcli connection up ens33
# nfs-client1
hostnamectl set-hostname nfs-client1
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes
nmcli connection up ens33
# nfs-client2
hostnamectl set-hostname nfs-client2
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.22/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes
nmcli connection up ens33
三、NFS服务端完整部署
3.1 安装依赖软件
nfs-utils包含NFS主程序、rpcbind工具;http用于模拟Web业务目录
bash
yum install -y nfs-utils httpd
3.2 创建共享目录并修改属主
网站运行用户apache,目录归属apache保证客户端读写权限
bash
mkdir -p /shares/webapp
chown apache /shares/webapp
3.3 启动并开机自启NFS服务
bash
systemctl enable nfs-server --now
3.4 防火墙放行NFS相关服务
NFS依赖nfs、rpc-bind、mountd三个服务端口
bash
firewall-cmd --add-service=nfs --add-service=rpc-bind --add-service=mountd --permanent
firewall-cmd --reload
3.5 核心配置文件 /etc/exports
全局共享配置文件,也可拆分/etc/exports.d/*.exports独立配置,避免修改主文件出错。
配置语法规则
共享目录
访问源支持:单个IP、网段、域名、通配域名、IPv6地址;
常用权限参数:
- rw:读写权限,默认ro只读
- no_root_squash:关闭root映射为nobody(默认root_squash,客户端root创建文件会变成nobody无权限)
实验配置(允许整个10.1.8网段读写)
bash
vim /etc/exports
/shares/webapp 10.1.8.0/24(rw)
3.6 重载共享配置,生效导出规则
修改exports后必须重载,两种方式任选
bash
# 方式1 重载配置
exportfs -r
# 方式2 重启nfs服务
systemctl reload nfs-server
# 查看当前共享及完整参数
exportfs -v
输出示例:
/shares/webapp 10.1.8.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
四、NFS客户端挂载实操(两台Web节点)
4.1 客户端统一安装工具
bash
yum install -y nfs-utils httpd
systemctl enable httpd --now
systemctl stop firewalld
4.2 查看服务端共享列表
showmount 查询NFS服务器开放目录
bash
showmount -e 10.1.8.20
返回:
Export list for 10.1.8.20:
/shares/webapp 10.1.8.0/24
4.3 临时挂载(重启失效)
将服务端共享目录挂载到Apache网站根目录/var/www/html
bash
mount -t nfs 10.1.8.20:/shares/webapp /var/www/html
# 验证挂载
df -h | grep www
4.4 默认权限问题:客户端root无法创建文件
默认开启root_squash,客户端root操作会被映射为nobody用户,写入拒绝
bash
touch /var/www/html/root-f1
# 报错 Permission denied
# apache用户正常写入
su -l -s /bin/bash apache
echo apache website > /var/www/html/web1.html
4.5 服务端放开root权限(修改exports)
bash
vim /etc/exports
/shares/webapp 10.1.8.0/24(rw,no_root_squash)
exportfs -r
重新测试,客户端root可正常创建文件:
bash
touch /var/www/html/root-f1
ls /var/www/html
4.6 多客户端数据同步验证
nfs-client1创建文件,nfs-client2可实时查看,证明多Web节点共用一份存储
bash
# client1执行
touch /var/www/html/xiyangyang
# client2查看
ls /var/www/html
在client1写入首页内容,两台服务器网页访问完全一致
bash
echo heihei > /var/www/html/index.html
五、永久开机自动挂载(/etc/fstab)
临时挂载服务器重启后失效,生产环境必须写入fstab实现开机自动挂载
客户端操作
bash
vim /etc/fstab
# 末尾添加一行
10.1.8.20:/shares/webapp /var/www/html nfs defaults 0 0
参数说明:
- 远端NFS共享地址
- 本地挂载点
- 文件系统类型nfs
- defaults默认挂载参数
- 0 0:dump备份、fsck自检关闭
验证配置无报错并重启测试
bash
mount -a
reboot
# 重启后检查自动挂载
df -h | grep www
六、自学整体总结
- NFS基于RPC远程调用实现跨Linux主机文件共享,v3内网兼容性好,v4安全性更强;
- 架构分为服务端nfs-server+rpcbind、客户端nfs-utils,依靠/etc/exports控制IP访问权限;
- 核心权限参数:rw读写、root_squash默认限制root、no_root_squash放开管理员权限;
- 企业Web集群最佳实践:NFS统一存储网站资源,多节点挂载实现文件数据完全同步;
- 挂载分临时mount(重启失效)和fstab永久挂载,线上业务必须配置自动挂载;
- 适用场景仅限内网,NFSv3无加密,禁止公网直接暴露;
- 实操流程记忆:服务端安装→创建共享目录→配置exports→重载共享→客户端showmount查询→挂载→fstab持久化。