1. NFS 基本概念
1.1 什么是 NFS
NFS(Network File System)是一种分布式文件系统协议,允许客户端计算机通过网络访问服务器上的文件,就像访问本地存储一样。
1.2 个人理解

在我的架构设计中:
- NFS服务器专门用于存储图片、视频等静态文件
- 当完成
mount 172.16.1.200:/data/ /oldboy/images/挂载后: - 用户在web01服务器上传数据到
/oldboy/images/时,实际上是把数据上传到NFS服务器的/data/目录 - 用户在web02服务器访问
/oldboy/images/时,能看到web01上传的数据 - 这样就实现了多台Web服务器共享同一存储空间,保证数据一致性
2. NFS 工作原理
2.1 端口映射机制
我的理解:
NFS服务器与客户端(web01、web02)建立连接时,需要通过portmap(rpcbind)服务进行端口映射:
- portmap服务监听在111端口
- 当NFS服务启动时,会向portmap注册自己使用的端口
- 客户端通过portmap查询NFS服务的确切端口号
- 然后建立实际的NFS连接
2.2 NFS版本差异
- NFSv3:使用随机端口,依赖portmap
- NFSv4:使用固定端口2049,简化了连接过程
3. NFS 服务器配置
3.1 安装NFS服务
# CentOS/RHEL
yum install nfs-utils rpcbind -y
# Ubuntu/Debian
apt-get install nfs-kernel-server rpcbind -y
3.2 创建共享目录
mkdir -p /data/
3.3修改共享目录权限给nfsnobody
chown -R nfsnobody.nfsnobody /data/
3.2 配置文件 /etc/exports
配置文件内容补充:
# 格式:共享目录 客户端IP(选项) 客户端IP(选项)
# 基本示例
/data 172.16.1.0/24(rw,sync,no_root_squash)
# 详细配置示例
/data 172.16.1.100(rw,sync,no_root_squash) 172.16.1.101(rw,sync,no_root_squash)
# 或者使用通配符
/data 172.16.1.*(rw,sync,all_squash,anonuid=500,anongid=500)
# 更精细的权限控制
/data/images 172.16.1.100(ro,sync) 172.16.1.101(rw,sync)
/data/videos 172.16.1.100(rw,sync) 172.16.1.101(ro,sync)
3.3 配置参数详解
访问权限:
rw:读写权限ro:只读权限
同步方式:
sync:同步写入,数据安全但性能较低async:异步写入,性能好但可能丢失数据
用户映射:
no_root_squash:信任root用户,root在客户端有完全权限root_squash:将root用户映射为匿名用户(默认)all_squash:将所有用户都映射为匿名用户anonuid=500, anongid=500:指定匿名用户的UID和GID
4. NFS 服务器管理
4.1 启动服务
# 启动服务
systemctl start rpcbind
systemctl start nfs-server # 或 nfs-kernel-server
# 设置开机自启
systemctl enable rpcbind
systemctl enable nfs-server
4.2 查看共享状态
# 查看当前共享目录
exportfs -v
# 查看NFS状态
showmount -e localhost
# 查看rpcbind注册的服务
rpcinfo -p
4.3 重新加载配置
# 使配置生效
exportfs -r
# 或者重启服务
systemctl restart nfs-server
5. NFS 客户端配置
5.1 安装客户端工具
# CentOS/RHEL
yum install nfs-utils -y
# Ubuntu/Debian
apt-get install nfs-common -y
5.2 手动挂载
# 创建挂载点
mkdir -p /oldboy/images
# 挂载NFS共享
mount -t nfs 172.16.1.200:/data /oldboy/images
# 验证挂载
df -hT | grep nfs
5.3 自动挂载(/etc/fstab)
# 在 /etc/fstab 中添加
172.16.1.200:/data /oldboy/images nfs defaults 0 0
# 测试挂载
mount -a
5.4 挂载选项优化
# 推荐用于生产环境的挂载选项
mount -t nfs -o rw,hard,intr,timeo=300,retrans=3,rsize=32768,wsize=32768 172.16.1.200:/data /oldboy/images
# /etc/fstab 中的对应配置
172.16.1.200:/data /oldboy/images nfs rw,hard,intr,timeo=300,retrans=3,rsize=32768,wsize=32768 0 0
6. 挂载参数详解
6.1 重要参数说明
hardvssoft:hard:服务器无响应时客户端会持续重试(推荐)soft:服务器无响应时返回错误(可能数据丢失)intr:允许中断NFS操作timeo=300:超时时间(十分之一秒)retrans=3:重试次数rsize/wsize:读写块大小,影响性能
7. 整体配置流程示例
7.1 Web服务器共享存储架构
基于我的理解,完整的配置流程:
NFS服务器 (172.16.1.200)
# 1. 创建共享目录
mkdir -p /data/{images,videos,attachments}
chown -R nfsnobody:nfsnobody /data
# 2. 配置 /etc/exports
cat >> /etc/exports << EOF
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
EOF
# 3. 启动服务
systemctl start rpcbind nfs-server
Web服务器 (web01/web02)
# 1. 创建挂载点
mkdir -p /oldboy/{images,videos,attachments}
# 2. 挂载NFS
mount -t nfs 172.16.1.200:/data/images /oldboy/images
mount -t nfs 172.16.1.200:/data/videos /oldboy/videos
# 3. 配置自动挂载
cat >> /etc/fstab << EOF
172.16.1.200:/data/images /oldboy/images nfs defaults 0 0
172.16.1.200:/data/videos /oldboy/videos nfs defaults 0 0
EOF
8. 故障排查
8.1 常见问题排查
# 检查端口映射
rpcinfo -p 172.16.1.200
# 检查共享目录
showmount -e 172.16.1.200
# 检查挂载状态
mount | grep nfs
# 查看NFS统计
nfsstat -c # 客户端统计
nfsstat -s # 服务器统计
8.2 权限问题解决
# 确保NFS服务器和客户端用户ID一致
id username
# 检查文件权限
ls -la /oldboy/images/
# 检查SELinux状态
getenforce
setenforce 0 # 临时关闭
9. 安全考虑
9.1 安全最佳实践
# 1. 使用防火墙限制访问
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 2049 -j ACCEPT
# 2. 使用最小权限原则
# /etc/exports 中只授予必要权限
/data/images 172.16.1.100(ro,sync,all_squash)
# 3. 定期检查访问日志
tail -f /var/log/messages | grep nfs
10. 性能优化
10.1 性能调优参数
# 服务器端优化
echo 'fs.nfs.nfs_callback_tcpport = 789' >> /etc/sysctl.conf
echo 'fs.nfs.nlm_tcpport = 788' >> /etc/sysctl.conf
# 客户端优化
mount -t nfs -o rw,hard,intr,rsize=65536,wsize=65536,noatime,nodiratime 172.16.1.200:/data /oldboy/images
通过这种配置,可以有效地在多台Web服务器之间共享静态文件,确保数据的一致性和可用性。
11.NFS挂载的重要特性
目录名不变:本地目录路径 /code/wecenter/uploads 保持不变
内容覆盖:挂载后,原 /code/wecenter/uploads 下的本地内容会被隐藏
访问透明:通过 /code/wecenter/uploads 访问,实际访问的是 172.16.1.31:/data/wecenter
卸载还原:umount /code/wecenter/uploads 后,原本地内容重新可见
12.提问
问题:rpcbind和nfs-utils有什么区别
好的,这是一个非常核心的NFS服务问题。简单来说,rpcbind 是一个基础的“电话总机”,而 nfs-utils 是包含“业务部门”和“业务工具”的完整套件。
它们的关系是协作而非替代。下面我们详细拆解一下。
一句话概括
rpcbind:是一个服务映射器。它负责将RPC(远程过程调用)服务号映射到当前的TCP/IP或UDP端口号。它是NFS服务能够被客户端找到的前提和基础。nfs-utils:是NFS服务的实现工具包。它包含了提供NFS服务所需的所有核心程序、守护进程、管理工具和文档。
详细区别与关系
为了更好地理解,我们可以用一个 “公司前台/总机”的比喻:
| 特性 | rpcbind (电话总机) | nfs-utils (业务部门与工具) |
|---|---|---|
| 核心角色 | 服务注册与发现 | NFS服务的具体实现和提供 |
| 比喻 | 公司前台或电话总机。它有一张分机表,记录了“销售部在分机201,技术部在分机202”。 | 销售部、技术部本身,以及部门里的员工和他们的工作流程。 |
| 功能 | 1. 当NFS服务(如mountd, nlockmgr)启动时,它们会向rpcbind注册,告诉它:“我是服务A,我现在在端口X上监听。”2. 当NFS客户端需要挂载时,它首先连接服务器的 rpcbind(默认在111端口),询问:“mountd服务在哪个端口?”3. rpcbind查表并回复:“mountd在端口Y。” | 1. nfsd:NFS主守护进程,处理客户端的文件读写请求。2. mountd:处理客户端的挂载请求,验证客户端是否有权挂载某个共享目录。3. rpc.statd 与 rpc.lockd:提供文件锁和恢复服务,用于文件共享一致性。4. 管理工具:如 exportfs(管理NFS共享列表)、showmount(查看共享信息)等。 |
| 依赖关系 | NFS服务依赖于rpcbind。如果没有rpcbind,客户端就找不到NFS的各种服务。 | nfs-utils 中的服务需要 rpcbind 才能被客户端正常访问。 |
| 端口 | 固定端口 111 (TCP/UDP)。 | 动态端口。nfsd, mountd 等服务的端口是随机或半随机分配的,正是通过rpcbind来查询。 |
| 是否必需 | 对于较老版本的NFS(如NFSv3)是必需的。对于NFSv4,由于协议改进,理论上在简单配置下可以不需要,但为了兼容性和服务发现,通常仍然会安装和运行。 | 绝对必需。没有它,根本无法提供NFS服务。 |
工作流程示例(以NFSv3挂载为例)
假设客户端要挂载服务器 192.168.1.10 的 /data 目录到本地的 /mnt/nfs。
- 启动服务(服务器端):
- 启动
rpcbind服务。 - 启动
nfs-server服务(这会启动nfsd,mountd,rpc.statd等)。 mountd等服务启动后,自动向本机的rpcbind注册自己:“嗨,我是mountd,我目前在端口 892 上。”
- 启动
- 发起挂载请求(客户端):
- 客户端执行
mount -t nfs 192.168.1.10:/data /mnt/nfs。 - 客户端首先连接服务器
192.168.1.10的 111 端口(rpcbind),询问:“请问mountd服务在哪个端口?” - 服务器的
rpcbind查看注册表,回复:“在 端口 892。”
- 客户端执行
- 进行挂载操作:
- 客户端现在知道了
mountd的地址,于是连接到服务器的 端口 892,与mountd对话:“我想挂载/data目录。” mountd检查服务器的/etc/exports文件,确认客户端有权挂载,然后回复一个“文件句柄”。
- 客户端现在知道了
- 数据访问:
- 之后,当客户端需要读写文件时,会使用NFS协议(默认是端口 2049,在NFSv4中固定,v3中也可能通过
rpcbind查询)与服务器的nfsd进程进行通信。
- 之后,当客户端需要读写文件时,会使用NFS协议(默认是端口 2049,在NFSv4中固定,v3中也可能通过
总结与结论
| 项目 | rpcbind | nfs-utils |
|---|---|---|
| 是什么 | 基础的网络服务发现工具。 | 完整的NFS服务软件包。 |
| 为什么需要 | 为了让客户端能找到NFS的各种动态端口的服务。 | 为了实际提供文件共享服务。 |
| 如何协作 | nfs-utils 中的服务向 rpcbind 注册自己的位置;客户端通过查询 rpcbind 来获取这些位置。 | |
| 安装与操作 | 在搭建NFS服务器时,你需要: 1. 安装 rpcbind 和 nfs-utils 两个包。2. 先启动 rpcbind 服务,再启动 nfs-server 服务。3. 配置 /etc/exports 文件(属于 nfs-utils)。 |
因此,它们不是二选一的关系,而是相辅相成的伙伴。一个完整的NFS服务器必须同时安装和运行这两者。
Comments NOTHING