NFS 文件共享服务

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
Bash

3.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    
Bash

3.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 的用户
Bash

3.4. 启动服务并应用配置

sudo exportfs -a          # 重新加载/etc/exports
sudo systemctl restart nfs-kernel-server  # 重启服务(Ubuntu)
sudo systemctl restart nfs-server         # CentOS/RHEL
Bash

3.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)
Bash

4. 客户端挂载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
Bash

4.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

挂载注意事项:

  • 挂载目录后,原来文件下的内容不会丢失,仅仅是被遮盖住,取消挂载后仍然存在。
  • 取消挂载时不要在挂载的目录下面操作,否则会提示忙碌,切换到其他目录再进行卸载。
  • 进行挂载时如果在挂载的目录下,还是可以看到挂载前目录下的文件,需要重新进入目录才会显示挂载后目录的内容。

5. NFS

上一篇
下一篇