NFS(Network File System)是一种分布式文件系统协议,由Sun Microsystems于1984年开发,允许客户端通过网络访问远程服务器上的文件,就像访问本地文件一样。它基于RPC(Remote Procedure Call)机制,是Linux/Unix环境中高效共享文件的标准方案。
1. NFS 核心特性
- 跨平台支持:主要适用于Linux/Unix,但也可通过第三方工具(如Windows NFS客户端)兼容Windows。
- 高性能:低延迟,适合高速局域网(LAN)环境。
- 透明访问:客户端挂载后,文件操作与本地存储无异。
2. NFS 工作原理
- 服务端:导出(export)指定目录,定义可访问的客户端及权限。
- 客户端:通过
mount
命令挂载远程目录到本地路径。 - 通信流程:
- 客户端通过RPC向服务端发送请求。
- 服务端的
rpcbind
(或portmap
)分配NFS服务端口。(NFSv3及更早版本动态分配端口,NFSv4及更新版本默认使用固定端口 2049,不再依赖portmapper) - 数据通过网络传输(默认使用TCP,NFSv3也可用UDP)。
3. 部署 NFS 服务器(Linux)
3.1. 环境配置
- 配置静态 IP。
- 配置防火墙规则。
- 内网环境可以关闭防火墙和 Selinux。
防火墙配置示例:
# Ubuntu (UFW)
sudo ufw allow from 192.168.1.0/24 to any port nfs
# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload
Bash3.2. 安装必要软件包
# 如果使用NFSv3需要 rpcbind
# Ubuntu/Debian
sudo apt update
sudo apt install nfs-kernel-server rpcbind
# CentOS/RHEL
sudo yum install nfs-utils rpcbind
# 配置开机自启
sudo systemctl enable nfs-server # 对于Ubuntu/Debian是nfs-kernel-server
sudo systemctl enable rpcbind
Bash3.3. 配置导出的共享目录
编辑/etc/exports
文件,定义共享目录和客户端权限:
sudo vim /etc/exports
# 配置文件格式
<共享目录> <客户端IP或网段>(权限选项1,选项2,...)
# 示例
/data 192.168.1.0/24(rw,sync,no_subtree_check,all_squash) # 允许192.168.1.0网段读写
/home 192.168.1.100(ro) # 仅允许192.168.1.100只读访问
Bash常用选项含义:
rw
/ro
:读写/只读。sync
:同步写入(保证数据一致性,默认)。async
:异步写入(性能更高,但可能丢数据)。no_subtree_check
:禁用子目录检查(提高性能)。root_squash
:当客户端以 root 用户访问时,它把客户端的 root 用户(UID为0)映射为一个匿名用户,这样做的目的是防止客户端的 root 用户在NFS共享上获取到全权限(增强安全),默认启用该参数。- no_root_squash:与上个参数含义相反,允许客户端root保留权限。
- all_squash:这个选项会使得所有来自客户端的用户和用户组(非root),,都被映射为一个匿名的用户和用户组。
- no_all_squash:不会把所有用户和用户组映射为匿名,每个用户根据其UID和GID被单独映射,默认启用该参数。
- anonuid/anongid:通常配合 all_squash 和 root_squash 参数使用,指定匿名用户的UID和GID,服务端需要创建相应的用户并添加适当权限。
- 示例:
/export/backup 192.168.1.0/24(rw,all_squash,anonuid=1001,anongid=1001)
# 所有访问用户会被映射为 UID=1001/GID=1001 的用户
Bash3.4. 启动服务并应用配置
sudo exportfs -a # 重新加载/etc/exports
sudo systemctl restart nfs-kernel-server # 重启服务(Ubuntu)
sudo systemctl restart nfs-server # CentOS/RHEL
Bash3.5. 查看验证
# 查看 nfs 相关服务端口
netstat -lntp | grep rpc
# 查看 nfs 配置
cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
Bash4. 客户端挂载NFS共享
4.1 安装客户端工具
# 如果使用NFSv3需要安装 rpcbind
# Ubuntu/Debian
sudo apt install nfs-common
sudo apt install rpcbind
# CentOS/RHEL
sudo yum install nfs-utils rpcbind
# 配置开机自启
sudo systemctl enable nfs-server # 对于Ubuntu/Debian nfs-common 不是一个需要直接启用的系统服务,所以不需要配置开机自启,仅配置 rpcbind 即可。
sudo systemctl enable rpcbind
Bash4.2 挂载共享目录
# 手动挂载
sudo mount -t nfs <服务器IP>:/data /mnt/nfs_data
# 参数
-t nfs # 指定文件系统类型。
-o soft # 超时后放弃挂载(避免服务器无响应时客户端卡死)。
-o nfsvers=4 # 强制使用NFSv4。
<服务器IP>:/data # 远程目录(NFS 服务器上的共享目录)
/mnt/nfs_data # 本地目录(客户端上用于挂载的目录)
# 开机自动挂载
# 编辑/etc/fstab
<服务器IP>:/data /mnt/nfs_data nfs defaults 0 0
# 示例
192.168.1.100:/data /mnt/nfs_data nfs defaults,soft,nfsvers=4,timeo=5,retrans=5 0 0
soft # 超时后放弃挂载(避免服务器无响应时客户端卡死)
nfsvers=4 # 强制使用NFSv4协议
timeo=5 # 设置超时时间为5/10秒(0.5秒)
retrans=5 # 设置重试次数为5次
Bash挂载注意事项:
- 挂载目录后,原来文件下的内容不会丢失,仅仅是被遮盖住,取消挂载后仍然存在。
- 取消挂载时不要在挂载的目录下面操作,否则会提示忙碌,切换到其他目录再进行卸载。
- 进行挂载时如果在挂载的目录下,还是可以看到挂载前目录下的文件,需要重新进入目录才会显示挂载后目录的内容。