一、NFS基础定义与功能
NFS(Network File System,网络文件系统)由Sun公司1984年发布,是类Unix系统间分布式文件共享的核心协议。其核心价值在于:
- 跨机器/跨系统共享数据:客户端可将服务器共享目录“挂载”到本地,操作时如同访问本地磁盘(如Web服务器集群共享静态资源、大数据节点共享数据集)。
- 现代场景适配:当前仍广泛用于云原生环境、企业内部文件服务器,尤其适合存储视频、图片、日志等静态数据。
本例中的NFS架构:
- 服务器端(
192.168.1.100):共享指定目录(/data/nfs-share)。 - 客户端(
192.168.1.101/192.168.1.102):将服务器共享目录挂载到本地路径(建议与服务器目录名一致,如/data/local-nfs,便于管理)。
二、NFS相关组件安装
Rocky Linux默认未预装NFS组件,需通过dnf包管理器安装:
1. 安装依赖组件
| 组件名称 | 功能说明 | 安装命令 |
|---|---|---|
nfs-utils |
包含NFS服务端/客户端核心命令(如exportfs、showmount)与守护进程 |
sudo dnf install -y nfs-utils |
rpcbind |
负责RPC端口映射(NFS依赖RPC获取随机端口) | sudo dnf install -y rpcbind |
2. 验证安装结果
安装完成后,可通过以下命令确认组件是否成功安装:
# 检查nfs-utils版本
rpm -qa | grep nfs-utils
# 检查rpcbind版本
rpm -qa | grep rpcbind
三、NFS挂载原理
NFS服务端通过随机端口传输数据,客户端依赖RPC(远程过程调用协议)获取端口信息:
- 服务端启动
rpcbind后,默认监听111端口(TCP/UDP),等待客户端请求。 - 服务端启动
nfs-server后,会向rpcbind注册随机端口(通常小于1024,更安全)。 - 客户端启动
rpcbind后,向服务端rpcbind请求NFS端口,获取端口后建立连接并传输数据。
四、NFS服务器配置
核心配置文件为/etc/exports(系统默认不存在,需手动创建)。
1. 配置文件格式
# 格式:共享目录 客户端1(选项) 客户端2(选项)
共享目录 客户端(访问权限,用户映射,其他选项)
2. 配置项详解
| 配置类别 | 具体选项 | 说明 | 场景示例 |
|---|---|---|---|
| 共享目录 | - | 服务端需共享的目录,建议设置为/data/xxx(避免/home下权限冲突) |
/data/nfs-share |
| 客户端指定 | IP地址 | 单个客户端(192.168.1.101) |
192.168.1.101 |
| 子网 | 整个子网(如192.168.1.0/24) |
192.168.1.0/24 |
|
| 域名 | 单个域名(如web01.example.com) |
web01.example.com |
|
| 域所有主机 | 某域下所有主机(如*.example.com) |
*.example.com |
|
| 所有主机 | 允许所有主机访问(不推荐,风险高) | * |
|
| 访问权限 | ro |
只读权限 | - |
rw |
读写权限(需配合目录Linux权限,否则客户端仍无法写入) | - | |
| 用户映射 | root_squash |
客户端root映射为匿名用户(nfsnobody,默认生效,安全) |
- |
no_root_squash |
保留客户端root权限(仅用于信任环境,如集群管理节点) |
- | |
all_squash |
所有客户端用户映射为匿名用户(适合公共只读共享) | - | |
anonuid=1001 |
匿名用户映射为指定UID(如1001,需与客户端用户UID一致) |
- | |
anongid=1001 |
匿名用户组映射为指定GID(与anonuid配套使用) |
- | |
| 其他选项 | sync |
数据同步写入磁盘(效率低,保证数据一致性,推荐生产环境) | - |
async |
数据先存内存,必要时写入磁盘(效率高,可能丢数据,仅测试用) | - | |
no_subtree_check |
关闭子目录检查(减少服务端开销,现代系统推荐添加) | - |
3. 示例配置(生产环境常用)
需求:将服务端/data/nfs-share共享给192.168.1.0/24子网,赋予读写权限,同步写入,关闭子目录检查:
# 1. 创建共享目录并设置权限(关键:避免客户端权限不足)
sudo mkdir -p /data/nfs-share
sudo chown nfsnobody:nfsnobody /data/nfs-share # 与匿名用户一致
sudo chmod 755 /data/nfs-share # 确保客户端可访问
# 2. 编辑配置文件
sudo vim /etc/exports
# 写入以下内容
/data/nfs-share 192.168.1.0/24(rw,sync,no_subtree_check,root_squash)
五、NFS服务管理
1. 启动服务(必须先启动rpcbind)
# 1. 启动rpcbind并设置开机自启
sudo systemctl start rpcbind
sudo systemctl enable rpcbind
# 2. 启动nfs-server并设置开机自启
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
2. 查看服务状态
# 查看rpcbind状态
sudo systemctl status rpcbind
# 查看nfs-server状态(若显示"active (running)"则正常)
sudo systemctl status nfs-server
3. 停止服务(需先停nfs-server,再停rpcbind)
# 停止nfs-server
sudo systemctl stop nfs-server
# 若无需其他RPC服务,再停止rpcbind
sudo systemctl stop rpcbind
# 若需禁用开机自启(可选)
sudo systemctl disable nfs-server
sudo systemctl disable rpcbind
4. 重新加载配置
修改/etc/exports后,无需重启nfs-server,执行以下命令即可生效:
sudo exportfs -ra # -r:重新读取配置;-a:应用所有共享;-v:可选,输出详细信息
六、防火墙配置
Rocky Linux默认启用firewalld防火墙,若不开放NFS相关端口,客户端无法访问服务端。需开放以下端口/服务:
1. 开放NFS核心服务
# 永久开放nfs服务(firewalld预定义服务,包含所需端口)
sudo firewall-cmd --add-service=nfs --permanent
# 永久开放rpc-bind服务(对应111端口)
sudo firewall-cmd --add-service=rpc-bind --permanent
# 永久开放mountd服务(NFS挂载依赖,firewalld预定义)
sudo firewall-cmd --add-service=mountd --permanent
# 重新加载防火墙规则(使配置生效)
sudo firewall-cmd --reload
2. 验证防火墙配置
# 查看已开放的服务
sudo firewall-cmd --list-services
七、客户端配置
1. 客户端安装组件
仅需安装nfs-utils(客户端无需rpcbind服务,仅需命令工具):
sudo dnf install -y nfs-utils
2. 查看服务端共享
# 格式:showmount -e 服务端IP
showmount -e 192.168.1.100
3. 手动挂载
# 1. 创建本地挂载点
sudo mkdir -p /data/local-nfs
# 2. 挂载(指定NFS v4版本,现代系统推荐,避免v3同步延迟)
sudo mount -t nfs -o vers=4 192.168.1.100:/data/nfs-share /data/local-nfs
# 3. 验证挂载(显示NFS挂载信息则成功)
mount | grep nfs
4. 自动挂载
方式1:/etc/fstab自动挂载(开机生效)
# 1. 编辑fstab文件
sudo vim /etc/fstab
# 2. 追加以下内容(格式:服务端IP:共享目录 本地挂载点 nfs 选项 0 0)
192.168.1.100:/data/nfs-share /data/local-nfs nfs vers=4,sync,noauto,x-systemd.automount 0 0
# 选项说明:
# vers=4:使用NFS v4
# sync:同步写入
# noauto:开机不主动挂载(避免开机卡壳)
# x-systemd.automount:系统d自动挂载(访问时才挂载,更高效)
# 3. 重新加载fstab配置(无需重启,立即生效)
sudo systemctl daemon-reload
sudo systemctl restart remote-fs.target
方式2:autofs自动挂载(动态挂载,适合临时访问)
若客户端无需永久挂载,可使用autofs(需安装):
# 1. 安装autofs
sudo dnf install -y autofs
# 2. 启动并设置开机自启
sudo systemctl start autofs
sudo systemctl enable autofs
# 3. 配置自动挂载(示例:访问/mnt/nfs时自动挂载服务端共享)
sudo vim /etc/auto.master
# 追加:/mnt/nfs /etc/auto.nfs
# 4. 创建auto.nfs配置文件
sudo vim /etc/auto.nfs
# 写入:share -fstype=nfs,vers=4 192.168.1.100:/data/nfs-share
# 5. 重启autofs
sudo systemctl restart autofs
# 6. 测试:访问/mnt/nfs/share即可自动挂载
cd /mnt/nfs/share
5. 卸载共享
# 手动卸载(需先退出挂载点目录)
sudo umount /data/local-nfs
# 若从fstab移除,需删除对应行后执行:
sudo systemctl daemon-reload
八、常见问题排查
客户端“权限不够”:
- 检查服务端共享目录权限:确保
chown nfsnobody:nfsnobody /data/nfs-share且chmod 755。 - 检查
/etc/exports是否添加no_subtree_check选项。 - 如果是全新安装,请确保使用nfs服务端、客户端的相关用户
uid最好保持一致,可在useradd时带上-u选项自行指定uid,一致的uid可省却很多权限相关的麻烦。
- 检查服务端共享目录权限:确保
客户端无法连接服务端:
- 检查服务端
firewalld是否开放nfs、rpc-bind、mountd服务。 - 检查服务端
nfs-server、rpcbind是否正常运行(systemctl status)。
- 检查服务端
fstab挂载开机卡壳:
- 确保
fstab中添加noauto,x-systemd.automount选项,避免开机强制挂载。
- 确保
NFS v3/v4兼容性问题:
- 客户端挂载时指定
vers=3或vers=4,服务端若仅支持v4,需确保客户端使用v4。
- 客户端挂载时指定