一、nfs网络文件系统简介
1.基本概念
NFS(Network File System,网络文件系统)是一种由Sun Microsystems于1984年开发的分布式文件系统协议,允许计算机在网络上共享文件和目录,使客户端能够像访问本地文件一样透明地访问远程服务器的存储资源。它广泛应用于UNIX、Linux及类Unix系统,支持跨平台文件共享,是构建高效协作环境的核心技术之一。
2. 核心功能与工作原理
透明访问:客户端通过挂载(mount)远程NFS共享目录到本地目录树,用户无需感知文件实际存储位置。
基于RPC的通信:
NFS依赖RPC(Remote Procedure Call,远程过程调用)实现客户端与服务端的通信。
关键服务组件:
nfsd:处理文件读写请求(默认端口TCP/UDP 2049)。
mountd:处理挂载请求,验证权限(默认端口TCP/UDP 20048)。
rpcbind(旧称portmapper):动态管理RPC服务的端口映射(默认端口TCP/UDP 111)。
3. nfs工作原理
NFS的工作流程
RPC服务启动:NFS依赖于RPC(Remote Procedure Call,远程过程调用)服务。RPC服务在NFS启动前先启动,并监听111端口。NFS启动后,会随机生成一些端口,并向RPC注册这些端口。
客户端请求端口:当NFS客户端需要连接到服务器时,首先启动客户端的RPC服务,向服务器端的RPC服务请求NFS功能对应的端口号。RPC服务会返回这些端口号。
数据传输:客户端获取到端口号后,连接到NFS服务器的相应端口,进行数据传输。此后的数据传输不再经过RPC,只在客户端和服务器之间传输。
4. 典型应用场景
企业文件共享:多台服务器共享配置文件或日志目录,简化运维。
科研计算:集群节点访问共享数据集,避免数据冗余存储。
虚拟化环境:虚拟机通过NFS挂载共享存储,支持动态迁移。
5. 优缺点分析
优点:
跨平台兼容:支持多种操作系统(Linux、Unix、macOS等)。
配置简单:通过
/etc/exports
文件快速定义共享目录。高性能读写:在低延迟网络中接近本地文件系统速度。
缺点:
网络依赖:高延迟或不稳定网络下性能显著下降。
安全隐患:默认无加密(NFSv3),需结合VPN或NFSv4加密功能。
锁管理局限:早期版本对文件锁的支持较弱,可能引发并发冲突。
二、nfs服务的安装与部署
注:root@nfsserver为nfs的服务器(服务端),IP地址为192.168.52.50;root@lcf为nfs的测试主机(客户端),IP地址为192.168.52.60。
2.1.1 安装软件(客户端软件和服务端软件是一样的)
2.1.2 启动nfs服务
2.1.3 设定防火墙(nfs服务器上进行设定)
2.1.4 使用测试主机进行测试通信是否正常
在测试主机中使用showmount命令进行测试,看测试主机能否访问到nfs服务器
2.1.5 建立共享目录
2.1.6 编辑共享策略文件(nfs服务器上进行)
2.1.7 让共享策略生效
2.1.8 进行挂载和nfs服务测试(nfs客户端进行挂载)
在客户端(lcf
)通过 mount
命令将 NFS 服务器(192.168.52.50
)的 /nfsdata
目录挂载到本地的 /media
,并成功创建了 file1
。
而在服务器上查看 /nfsdata
目录时,也看到了 file1
,这表明:
客户端与服务器的文件系统已成功同步。
NFS 服务器配置正确(允许客户端写入)。
三、nfs共享策略文件的常用设置参数
3.1 NFS共享策略文件的基础语法
<共享目录> <客户端IP或网段>(参数1,参数2,...) [其他客户端](参数...)
3.2 核心权限参数
参数 | 作用 | 示例 |
---|---|---|
rw |
允许客户端读写访问(默认 ro ) |
192.168.1.0/24(rw) |
ro |
限制客户端为只读访问 | 10.0.0.5(ro) |
sync |
强制服务端同步写入磁盘,保证数据一致性(默认值) | sync |
async |
允许服务端异步写入,提升性能但可能丢失未提交数据 | async |
no_root_squash |
不压缩客户端的 root 权限,客户端 root 在服务端仍为 root(高危,慎用) | no_root_squash |
root_squash |
将客户端的 root 用户映射为服务端的匿名用户(默认值) | root_squash |
all_squash |
将所有客户端用户映射为服务端匿名用户(通常用于公共共享) | all_squash,anonuid=1001 |
anonuid /anongid |
指定匿名用户的 UID/GID(需与 all_squash 或 root_squash 配合使用) |
anonuid=1001,anongid=1001 |
在 /etc/exports
文件中,同一客户端配置中互斥的参数只能选择其一,不可同时使用。以下是互斥参数的分组:
参数组 | 互斥参数 | 说明 |
---|---|---|
读写权限 | rw / ro |
同一客户端不能同时拥有读写和只读权限。 |
写入模式 | sync / async |
写入方式需明确选择同步或异步,不可同时生效。 |
权限映射规则 | no_root_squash / root_squash / all_squash |
同一客户端只能选择一种权限映射方式。 |
# /etc/exports 示例
/data/public 192.168.1.100/24(
rw, # 允许读写访问(非互斥参数选择)
sync, # 同步写入保证一致性(非互斥参数选择)
all_squash, # 所有用户映射为匿名用户
anonuid=1001, # 匿名用户 UID=1001
anongid=1001, # 匿名用户 GID=1001
no_subtree_check, # 禁用子树检查(提升性能)
secure, # 强制客户端使用特权端口(默认值)
no_hide, # 显示所有子挂载点(默认值)
wdelay # 启用写延迟合并请求(默认值)
)
四、nfs客户端的动态挂载机制(由Autofs进行动态挂载,在客户端主机上进行操作)
当客户端与 NFS 服务器之间没有数据交互时,传统的静态挂载(如通过 /etc/fstab
)会持续占用服务器资源(如连接状态、文件句柄等)。
为解决这一问题,可以通过 Autofs 实现动态挂载机制,其核心思想是 按需挂载 和 空闲超时卸载,从而优化资源利用率。
4.1、Autofs 的工作原理
按需挂载:
当客户端首次访问挂载点目录时,Autofs 自动触发挂载操作。
例如:访问
/mnt/nfs/data
时,自动挂载远程 NFS 共享。
空闲卸载:
在设定的空闲时间(默认 5 分钟)后,若没有文件操作,Autofs 自动卸载挂载点。
下次访问时重新挂载,避免长期占用服务器资源。
透明管理:
用户无需手动执行
mount
或umount
,所有操作由 Autofs 后台守护进程自动完成。
4.2、autofs 的安装
4.3、访问默认 autofs 挂载机制
Autofs 默认挂载 /net
目录的机制
当 Autofs 服务启动时,某些 Linux 发行版(如 Red Hat/CentOS、Fedora)默认会预配置 /net
目录作为 自动挂载点,允许用户通过该目录访问远程 NFS 共享。
4.4、设定动态卸载时间
对配置文件进行完修改之后要重启服务才能使配置更新。