Skip to content

Linux NFS 服务完整安装配置与使用指南

一、概述

NFS(Network File System,网络文件系统)是Linux/Unix系统原生的分布式文件系统协议,可通过网络实现跨主机目录与文件共享,支持将Linux远端目录直接映射为Windows/Linux客户端的本地盘符/挂载点,实现跨设备文件无缝读写。

1.1 核心特性与适用场景

核心优势局限性最佳适用场景
Linux原生支持,配置极简、资源占用低公网环境安全性弱,不推荐直接暴露公网局域网内Linux与Windows/多Linux主机长期文件共享
局域网大文件传输性能顶尖,读写效率优异Windows家庭版无原生NFS客户端,需专业/企业版内网开发环境代码/资源共享、大文件高频传输场景
支持权限精细化管控,兼容多系统架构跨公网传输无原生加密,需配合VPN使用Linux集群环境统一文件存储访问、内网媒体/文件库共享

1.2 版本说明

  • NFSv3:当前最通用、兼容性最好的版本,配置简单,Windows原生客户端完美支持,本指南默认以NFSv3为核心,覆盖99%的日常使用场景。
  • NFSv4:新一代版本,统一端口(仅2049)、安全性更强、支持Kerberos认证,适合进阶生产环境,指南单独提供极简配置方案。

1.3 前置环境要求

  1. 服务端:Linux主流发行版(Debian/Ubuntu、RHEL/CentOS/Fedora、Arch等),具备sudo/root管理员权限
  2. 客户端:Windows 10/11 专业版/企业版、Linux主机,与服务端网络互通(可互相ping通)
  3. 网络要求:防火墙放行NFS相关端口,无安全组/内网拦截

二、Linux服务端 NFS 服务安装

根据你的Linux发行版,执行对应安装命令,全程使用sudo/root权限操作。

2.1 分发行版安装命令

2.1.1 Debian/Ubuntu 系列(Ubuntu 20.04+/Debian 10+)

bash
# 更新软件源
sudo apt update
# 安装NFS服务核心包与依赖
sudo apt install -y nfs-kernel-server nfs-common
# 验证安装(查看版本信息)
sudo nfsstat -v

2.1.2 RHEL/CentOS/Fedora 系列(CentOS 7+/RHEL 8+/Fedora 34+)

bash
# 安装NFS服务核心包
sudo dnf install -y nfs-utils
# 验证安装
sudo nfsstat -v

注:CentOS 7 可将dnf替换为yum执行。

2.1.3 Arch Linux 系列

bash
sudo pacman -S nfs-utils

2.2 服务基础管理命令

bash
# 启动NFS服务
sudo systemctl start nfs-server
# 设置开机自启(必做,服务器重启后自动生效)
sudo systemctl enable --now nfs-server
# 查看服务运行状态(active (running) 即为启动成功)
sudo systemctl status nfs-server
# 重启服务
sudo systemctl restart nfs-server
# 停止服务
sudo systemctl stop nfs-server

三、核心配置文件 /etc/exports 全详解

/etc/exports 是NFS服务的唯一核心配置文件,用于定义允许共享的目录、可访问的客户端、访问权限与规则,#开头的为注释行,不生效。

3.1 配置文件基础格式

每一行对应一条共享规则,固定格式如下:

ini
<共享目录绝对路径>  <客户端1(权限参数1,权限参数2,...)>  <客户端2(权限参数1,权限参数2,...)>
  • 共享目录绝对路径:必须是Linux系统中已存在目录的完整绝对路径(如/home/user/share),不可使用相对路径。
  • 客户端:允许访问该共享的主机,支持IP、网段、主机名等多种写法。
  • 权限参数:括号内为该客户端对应的访问规则,多个参数用英文逗号分隔,逗号与参数之间不能有空格

3.2 客户端常用写法

客户端写法说明推荐场景
192.168.1.100仅允许指定单个IP的主机访问单台固定客户端,安全性最高
192.168.1.0/24允许指定网段内的所有主机访问局域网多客户端,最常用
*.example.com允许指定域名后缀的所有主机访问有内网DNS的企业环境
nfs-client.example.com允许指定主机名的主机访问内网固定主机名场景
*允许所有主机访问极度不推荐,存在严重安全风险

3.3 核心权限参数详解

3.3.1 基础权限参数

参数核心作用
rw允许客户端读写权限,默认仅允许只读ro
ro强制客户端只读访问,无法修改/新建/删除文件
sync同步写入模式:数据先持久化到服务端磁盘后再返回成功,数据安全性高,推荐默认使用
async异步写入模式:数据先写入内存缓存,后台异步落盘,性能更高,但断电/宕机易丢失数据

3.3.2 权限映射与安全参数

参数核心作用
root_squashroot压缩(默认开启):将客户端root用户映射为服务端匿名用户nobody,禁止客户端拥有服务端root权限,提升安全性
no_root_squash关闭root压缩:允许客户端root拥有服务端root权限,解决Windows客户端读写权限不足的核心参数
all_squash全用户压缩:将客户端所有用户都映射为服务端匿名用户,适合公共共享场景
anonuid=UID指定匿名用户映射的服务端用户UID,配合all_squash使用,解决Windows权限问题
anongid=GID指定匿名用户映射的服务端用户GID,与anonuid配对使用

3.3.3 性能与兼容性参数

参数核心作用
no_subtree_check关闭子目录检查:禁用共享目录子树权限校验,大幅提升读写性能,推荐默认开启
insecure允许客户端使用大于1024的非特权端口连接,解决部分客户端端口受限无法挂载的问题

3.4 默认示例配置拆解

对应你提供的系统默认配置文件,官方示例含义如下:

ini
# NFSv3 示例:共享/srv/homes目录,hostname1主机可读写,hostname2主机仅只读
/srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)

# NFSv4 示例:定义NFSv4根目录(fsid=0为固定标识),/srv/nfs4为根,子目录单独共享
/srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
/srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)

四、NFS共享实战配置全流程(Windows兼容首选)

以最常用的「局域网Windows客户端访问Linux共享目录」为场景,从零完成完整配置。

4.1 步骤1:创建共享目录并配置系统权限

重点提醒:NFS共享的最终权限,Linux系统目录本身的权限优先级最高,共享配置的rw权限无法突破系统目录的权限限制。

bash
# 1. 创建共享目录(替换为你的目标路径,示例为/home/yourname/linux_nfs_share)
sudo mkdir -p /home/yourname/linux_nfs_share

# 2. 配置目录所有权(yourname替换为你的Linux普通用户名,避免root归属导致权限不足)
sudo chown -R yourname:yourname /home/yourname/linux_nfs_share

# 3. 配置目录系统权限,确保客户端有读写权限
sudo chmod -R 755 /home/yourname/linux_nfs_share

4.2 步骤2:编写共享配置规则

bash
# 先备份原始配置文件,避免出错无法恢复
sudo cp /etc/exports /etc/exports.bak

# 编辑配置文件
sudo nano /etc/exports

在配置文件末尾添加以下规则,根据你的实际环境修改路径、网段:

ini
# 局域网Windows客户端读写共享配置
/home/yourname/linux_nfs_share  192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)

配置说明:

  • 共享目录:与步骤1创建的路径完全一致
  • 允许访问:192.168.1.0/24局域网网段(替换为你的实际网段)
  • 权限:读写、同步写入、关闭root压缩、关闭子目录检查,完美适配Windows客户端

4.3 步骤3:重载配置使生效

修改配置文件后,无需重启服务,执行重载命令即可立即生效:

bash
sudo exportfs -ra

常用exportfs辅助命令:

  • exportfs -v:查看已加载的共享配置详情
  • exportfs -u:停用所有共享
  • exportfs -a:启用所有共享

4.4 步骤4:验证配置是否生效

执行以下命令,查看当前已发布的共享列表:

bash
sudo showmount -e localhost

成功生效的输出示例:

Export list for localhost:
/home/yourname/linux_nfs_share 192.168.1.0/24

4.5 步骤5:防火墙放行NFS服务

必须放行防火墙规则,否则客户端无法访问,根据你的防火墙工具执行对应命令:

4.5.1 UFW 防火墙(Debian/Ubuntu默认)

bash
# 放行NFS服务
sudo ufw allow nfs
# 重载防火墙规则
sudo ufw reload
# 查看放行状态
sudo ufw status

4.5.2 Firewalld 防火墙(RHEL/CentOS/Fedora默认)

bash
# 永久放行NFS及依赖服务
sudo firewall-cmd --add-service=nfs --permanent
sudo firewall-cmd --add-service=rpc-bind --permanent
sudo firewall-cmd --add-service=mountd --permanent
# 重载防火墙规则
sudo firewall-cmd --reload
# 查看放行状态
sudo firewall-cmd --list-all

4.6 步骤6:SELinux 权限放行(仅RHEL/CentOS/Fedora系列)

RHEL系列系统默认开启SELinux,不配置会导致客户端无法读写共享目录:

bash
# 允许NFS共享家目录(若共享目录在/home下)
sudo setsebool -P use_nfs_home_dirs on

# 若共享目录不在家目录,执行以下命令标记SELinux安全上下文
sudo chcon -t nfs_t /home/yourname/linux_nfs_share -R

五、Windows 客户端挂载NFS共享(映射为本地盘符)

5.1 前置步骤:启用Windows NFS客户端功能

注意:Windows 家庭版无原生NFS客户端功能,需升级到专业版/企业版。

  1. 打开「控制面板」→「程序」→「程序和功能」→ 左侧点击「启用或关闭Windows功能」
  2. 在弹出的窗口中,找到「NFS服务」,展开后勾选「NFS客户端」
  3. 点击「确定」,等待系统安装组件,完成后按提示重启电脑

5.2 方法1:图形界面映射(新手首选)

  1. 重启电脑后,打开「此电脑」,顶部菜单栏点击「映射网络驱动器」(或空白处右键选择该选项)
  2. 在弹出的窗口中完成配置:
    • 驱动器:选择一个未被占用的盘符(如Z:、Y:)
    • 文件夹:按固定格式填写 \\Linux服务端IP\共享目录绝对路径
      • 示例:\\192.168.1.100\home\yourname\linux_nfs_share
      • 注意:Linux路径中的/需替换为\,IP和路径必须与服务端配置完全一致
    • 勾选「登录时重新连接」:实现Windows开机自动挂载
    • 无需勾选「使用其他凭据连接」,NFS默认通过IP网段控制权限,无额外账号密码
  3. 点击「完成」,即可完成挂载,此电脑中会出现对应的盘符,可像本地磁盘一样直接读写文件。

5.3 方法2:命令行挂载(管理员权限)

  1. 以管理员身份打开CMD或PowerShell
  2. 执行挂载命令:
cmd
# 挂载命令格式:mount \\LinuxIP\共享目录绝对路径 盘符:
mount \\192.168.1.100\home\yourname\linux_nfs_share Z:
  1. 卸载命令:
cmd
# 卸载指定盘符
umount Z:
# 卸载所有NFS挂载
umount -a

5.4 Windows客户端权限不足问题修复

问题现象:能打开目录,但无法新建/修改/删除文件

核心原因:Windows NFS客户端默认使用匿名用户访问,服务端匿名用户无对应目录的读写权限。 解决方案

  1. 在Linux服务端查询你的用户UID和GID:
bash
# yourname替换为你的Linux用户名
id yourname

输出示例(核心值为uid=1000,gid=1000):

uid=1000(yourname) gid=1000(yourname) groups=1000(yourname)
  1. 修改服务端/etc/exports配置,添加anonuidanongid参数:
ini
/home/yourname/linux_nfs_share  192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check,anonuid=1000,anongid=1000)
  1. 重载配置生效:
bash
sudo exportfs -ra
  1. 重新挂载Windows端盘符,即可正常读写。

六、进阶配置

6.1 Linux客户端挂载NFS共享

  1. 安装客户端工具:
bash
# Debian/Ubuntu
sudo apt install -y nfs-common
# RHEL/CentOS/Fedora
sudo dnf install -y nfs-utils
  1. 临时挂载:
bash
# 创建挂载点
sudo mkdir -p /mnt/nfs_share
# 挂载命令:mount 服务端IP:共享目录 本地挂载点
sudo mount 192.168.1.100:/home/yourname/linux_nfs_share /mnt/nfs_share
# 验证挂载
df -h
  1. 开机自动挂载: 编辑/etc/fstab文件,添加以下内容,添加_netdev参数确保网络就绪后再挂载:
ini
192.168.1.100:/home/yourname/linux_nfs_share  /mnt/nfs_share  nfs  defaults,_netdev  0  0

执行sudo mount -a验证配置,无报错即为生效。

6.2 NFSv4 极简配置指南

NFSv4仅需2049一个端口,无需放行多个依赖端口,安全性更强,配置步骤如下:

  1. 创建NFSv4根目录与绑定目录:
bash
# 创建NFSv4根目录
sudo mkdir -p /srv/nfs4
# 创建共享子目录绑定路径
sudo mkdir -p /srv/nfs4/share
# 绑定实际共享目录到NFSv4根目录下
sudo mount --bind /home/yourname/linux_nfs_share /srv/nfs4/share
# 开机自动绑定,编辑/etc/fstab添加以下内容:
/home/yourname/linux_nfs_share  /srv/nfs4/share  none  bind  0  0
  1. 编辑/etc/exports配置:
ini
# NFSv4根目录,fsid=0为固定必填参数
/srv/nfs4  192.168.1.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash)
# 共享子目录
/srv/nfs4/share  192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
  1. 重载配置生效:
bash
sudo exportfs -ra
  1. 客户端挂载路径:
    • Windows:\\192.168.1.100\share
    • Linux:192.168.1.100:/share

七、常见问题排查指南

7.1 Windows无法挂载,提示"网络路径不存在"

  1. 验证网络连通性:Windows端ping Linux服务端IP,确认可正常通信
  2. 检查服务状态:Linux服务端NFS服务是否正常运行(systemctl status nfs-server
  3. 检查防火墙:Linux服务端是否已放行NFS相关端口与服务
  4. 检查路径一致性:Windows端填写的路径是否与服务端/etc/exports中的路径完全一致
  5. 验证客户端功能:Windows NFS客户端是否已启用并完成重启

7.2 挂载成功,但无法读写文件,提示"权限被拒绝"

  1. 检查Linux系统目录权限:确认共享目录的chmodchown配置正确,目录有读写权限
  2. 检查共享配置:/etc/exports中是否添加了rw参数,而非默认的ro
  3. 检查SELinux:RHEL系列系统是否已配置SELinux放行规则
  4. 配置权限映射:添加no_root_squash+anonuid/anongid参数,修复Windows匿名用户权限问题

7.3 修改配置后不生效

  1. 必须执行sudo exportfs -ra重载配置,仅重启服务可能不生效
  2. 检查配置格式:括号内的参数之间、客户端与括号之间不能有空格
  3. 验证共享目录:确认共享目录存在,且使用绝对路径

7.4 开机自动挂载失效

  1. Windows端:检查是否勾选「登录时重新连接」,确认开机后网络先于映射驱动器完成连接
  2. Linux客户端:/etc/fstab中添加_netdev参数,确保网络就绪后再执行挂载

八、安全最佳实践

  1. 严禁直接暴露公网:NFS协议无原生强认证,公网环境极易被攻击,公网访问必须通过VPN、内网加密隧道实现
  2. 最小权限原则:仅允许指定IP/网段访问,禁止使用*允许所有主机访问
  3. 权限管控:非必要不使用no_root_squash,生产环境优先使用root_squash+anonuid指定低权限用户
  4. 只读优先:仅需读取文件的场景,强制使用ro只读权限,避免误修改/删除
  5. 端口收敛:生产环境优先使用NFSv4,仅放行2049端口,关闭其他不必要的端口与服务
  6. 定期更新:及时更新NFS相关软件包,修复安全漏洞
/src/technology/dateblog/2026/04/20260414-linux%E5%AE%89%E8%A3%85nfs%E6%9C%8D%E5%8A%A1.html