linux中级_NFS挂载

TJCcc 发布于 2025-11-26 24 次阅读


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 重要参数说明

  • hard vs soft
  • 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.statdrpc.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

  1. 启动服务(服务器端)
    • 启动 rpcbind 服务。
    • 启动 nfs-server 服务(这会启动 nfsd, mountd, rpc.statd 等)。
    • mountd 等服务启动后,自动向本机的 rpcbind 注册自己:“嗨,我是 mountd,我目前在端口 892 上。”
  2. 发起挂载请求(客户端)
    • 客户端执行 mount -t nfs 192.168.1.10:/data /mnt/nfs
    • 客户端首先连接服务器 192.168.1.10111 端口rpcbind),询问:“请问 mountd 服务在哪个端口?”
    • 服务器的 rpcbind 查看注册表,回复:“在 端口 892。”
  3. 进行挂载操作
    • 客户端现在知道了 mountd 的地址,于是连接到服务器的 端口 892,与 mountd 对话:“我想挂载 /data 目录。”
    • mountd 检查服务器的 /etc/exports 文件,确认客户端有权挂载,然后回复一个“文件句柄”。
  4. 数据访问
    • 之后,当客户端需要读写文件时,会使用NFS协议(默认是端口 2049,在NFSv4中固定,v3中也可能通过rpcbind查询)与服务器的 nfsd 进程进行通信。

总结与结论

项目rpcbindnfs-utils
是什么基础的网络服务发现工具。完整的NFS服务软件包。
为什么需要为了让客户端能找到NFS的各种动态端口的服务。为了实际提供文件共享服务。
如何协作nfs-utils 中的服务向 rpcbind 注册自己的位置;客户端通过查询 rpcbind 来获取这些位置。
安装与操作在搭建NFS服务器时,你需要:
1. 安装 rpcbindnfs-utils 两个包。
2. 先启动 rpcbind 服务,再启动 nfs-server 服务。
3. 配置 /etc/exports 文件(属于 nfs-utils)。

因此,它们不是二选一的关系,而是相辅相成的伙伴。一个完整的NFS服务器必须同时安装和运行这两者。