NFS 存储服务配置与 RPC 通信机制解析
NFS(Network File System)即网络文件系统,是由 Sun 公司开发的一种分布式文件系统协议。它允许网络中的不同计算机(通常是类 Unix 系统)之间通过 TCP/IP 网络共享目录和文件。对于客户端而言,远程服务器提供的共享目录在挂载后,其使用体验与操作本地磁盘分区几乎没有区别。
NFS 的工作原理与 RPC 机制
由于 NFS 协议在传输数据时会随机选择端口,为了让客户端能够准确找到服务端的监听端口,NFS 引入了 RPC(Remote Procedure Call,远程过程调用) 机制。RPC 充当了 NFS 服务的"中介"角色,负责管理和维护 NFS 的端口映射信息。
其核心通信流程如下:
- 服务端启动 RPC 服务(通常监听 111 端口)。
- NFS 服务启动并向 RPC 注册其随机生成的端口号。
- 客户端的 RPC 服务通过 111 端口访问服务端的 RPC,请求获取 NFS 端口。
- 服务端 RPC 返回具体的端口信息给客户端。
- 客户端根据获取到的端口与服务端建立连接,开始进行数据交互。
核心组件与软件安装
在 Linux 系统(如 CentOS/RHEL)中,实现 NFS 服务通常需要安装以下两个核心包:
- nfs-utils:包含 NFS 守护进程及相关管理工具。
- rpcbind:提供 RPC 端口映射服务。
# 安装必要软件包
yum install -y nfs-utils rpcbind
NFS 配置文件详解
NFS 的主配置文件位于 /etc/exports。该文件的每一行代表一个共享策略,格式如下:
[共享目录路径] [客户端地址](权限参数,用户映射参数,其他)
1. 客户端指定方式
- 指定单一 IP:
192.168.1.100 - 指定网段:
192.168.1.0/24 - 通配符:
*(代表所有主机)
2. 权限与映射参数
- rw / ro:读写权限或只读权限。
- root_squash:当客户端以 root 身份访问时,将其映射为匿名用户(通常是 nfsnobody)。这是默认的安全策略。
- no_root_squash:保留客户端的 root 权限,不进行映射,生产环境需慎用。
- all_squash:不论客户端是什么身份,一律映射为匿名用户。
- anonuid/anongid:指定映射后的匿名用户 UID 和 GID。
服务端配置实例
假设我们需要将服务端的 /data/shared_store 目录共享给 172.16.10.0/24 网段,并要求所有用户映射为 UID 1001 的用户:
# 编辑配置文件
vi /etc/exports
# 添加如下内容
/data/shared_store 172.16.10.0/24(rw,sync,all_squash,anonuid=1001,anongid=1001)
配置完成后,按顺序启动服务(必须先启动 rpcbind):
# 启动 RPC 映射服务
systemctl start rpcbind
systemctl enable rpcbind
# 启动 NFS 服务
systemctl start nfs-server
systemctl enable nfs-server
客户端挂载与验证
在客户端机器上,首先可以使用 showmount 查看远程服务器的共享列表:
# 查看服务器 172.16.10.50 暴露的挂载点
showmount -e 172.16.10.50
执行挂载操作,将远程目录挂载到本地 /mnt/nfs_client:
# 创建本地挂载点
mkdir -p /mnt/nfs_client
# 执行挂载,建议指定 NFS 版本以提高兼容性
mount -t nfs -o nfsvers=3 172.16.10.50:/data/shared_store /mnt/nfs_client
常用运维工具
- exportfs -r:在不重启服务的情况下,重新加载
/etc/exports配置。 - exportfs -v:查看当前服务器正在共享的所有目录及其详细参数。
- rpcinfo -p localhost:查看当前系统中所有 RPC 注册的端口及协议。
