Ubuntu + Windows NFS 文件共享指南
说实话,我的设备与网络环境挺复杂的。平常用的最多的是Windows笔记本,一个Mac Mini存算一体,还有一个Ubuntu的小主机跑一些自用的服务。由于硬盘内存涨价飞起,跨平台文件共享成了一个绕不开的话题(不涨价也绕不开)。win和mac os共享文件可以用mac自带的SMB速度不快但胜在省事。而提到 Windows 和 Linux 互传文件,很多人也会想着继续用 Samba这套。然而,我对SMB的速度一直不太满意,而且Samba 在处理海量小文件时开销较大,且 CPU 占用相对较高。至于之前使用的SFTP感觉都不如SMB,而且在内网用SFTP感觉有点小题大做。
相比之下,NFS (Network File System) 凭借其更底层的传输机制,拥有极低的系统开销和极高的局域网传输效率。但在实际部署中,由于 Windows 自带的 NFS 客户端(仅支持 v3 协议)与现代 Linux(默认使用 v4)存在代沟,导致我昨天狠狠摔了好几个跟头。
于是写这一篇,供大家与之后的我参考。
环境说明
1. 适用环境
- 服务端: Ubuntu 20.04 / 22.04 / 24.04 (其他 Debian 系发行版亦适用)。我的环境是Ubuntu 24.04.
客户端: Windows 10 / Windows 11 专业版、企业版或教育版。我的环境是 Windows 11专业版。
(⚠️ 注意:Windows 10/11 家庭版*不支持原生的 NFS 客户端。家庭版用户需升级系统,或使用第三方挂载软件如 MS-NFS41-Client。)*
现代 Ubuntu 默认使用 NFSv4,它只需暴露单一的 TCP 2049 端口而 Windows 原生客户端只支持 NFSv2/v3,它不仅需要 2049 端口,还需要 111 端口 (RPCbind),且默认使用 UDP 协议,并在通信时喜欢使用大于 1024 的高危端口。
我们所有的工作核心,都是为了让 Ubuntu 能够向下兼容Windows 。
Ubuntu 服务端配置
1. 安装核心组件
打开终端,更新源并安装 NFS 内核服务器守护进程:
bash
sudo apt update
sudo apt install nfs-kernel-server -y
2. 创建目录与权限赋予
创建一个专门用于共享的目录。为了避免 Windows 写入时产生UID/GID 错位,我们直接将该目录的所有权移交给系统中权限最低的匿名用户 nobody。
sudo mkdir -p /var/nfs_share
sudo chown nobody:nogroup /var/nfs_share
# 赋予最高读写执行权限,确保 Windows 畅通无阻
sudo chmod 777 /var/nfs_share(我们可以通过输入 id nobody 来确认你的系统里 nobody 的 UID 是否为 65534。)
3. 配置 /etc/exports (挂载规则)
这是 NFS 最核心的配置文件。在此声明允许谁访问、怎么访问。
sudo nano /etc/exports在末尾添加以下配置(假设你所在局域网段为 192.168.3.x):
/var/nfs_share 192.168.3.0/24(rw,sync,no_subtree_check,all_squash,insecure,anonuid=65534,anongid=65534)当然如果要修改配置就要知道这些配置的含义。
192.168.3.0/24: 绝对不要写成192.168.3.*! Linux 识别网段必须用标准的子网掩码写法,否则会直接拒绝连接,我昨天的绝大部分时间就是在为自己的这个错误买单。rw: 允许读写。sync: 同步模式,数据直接写入物理硬盘后才返回成功信号,保证断电不丢数据(相比async的异步模式略微降速,但更安全)。no_subtree_check: 禁用子树检查。如果不加这个,当你在 Windows 访问子目录,且文件恰好在 Ubuntu 侧被重命名时,会导致连接崩溃。all_squash: 强制将所有连接上来的客户端(无论它在自己电脑上是不是管理员)全部映射为匿名用户。anonuid=65534,anongid=65534: 指定匿名用户为nobody。insecure:允许客户端使用大于 1024 的随机端口发起连接(Windows 的设定),没有它,Windows 就会遭到 Ubuntu 拒绝。
4. 强制开启 NFSv3 与 UDP 支持
由于 Ubuntu 默认关闭了老旧的协议,我们需要把它像请神一样请回来。
sudo nano /etc/nfs.conf找到 [nfsd] 标签页,在下方添加(或取消注释并修改):
[nfsd]
udp=y
vers3=y保存后,重启所有相关服务,并重载 exports 规则:
sudo systemctl restart rpcbind
sudo systemctl restart nfs-kernel-server
sudo exportfs -arv看到终端输出 exporting /var/nfs_share 证明规则已生效。

我们也可以顺便检测一下现在开启了哪些NFS协议。

Windows 客户端设置
1. 开启隐藏的 NFS 技能
按 Win + R 输入 appwiz.cpl 打开“程序和功能”,点击左侧 “启用或关闭 Windows 功能”。
找到 “NFS 服务”,勾选 “NFS 客户端” 和 “管理工具”。点击确定,等待安装并重启电脑。

挂载NFS到Windows
做完了上面所有铺垫,现在迎来激动人心的时刻。
打开 Windows 的 PowerShell。
mount.exe -o anon,nolock,mtype=hard, your_ip:/var/nfs_share Z:参数解析:
mount.exe: 必须带.exe,防止与 PowerShell 自带的同名虚拟驱动器命令冲突。nolock: 放弃 NFSv3 文件锁机制,减少卡顿。mtype=hard: 硬挂载。当网络波动时,Windows 会持续重试而不是直接报错中断传输。IP 后面必须是冒号加正斜杠。
现在,我就可以享受到平均53MB/s的高速传输了,足足是之前SFTP的两倍,满足了。
番外篇:融合 Tailscale 实现异地内网穿透
NFS 不仅仅是局域网的玩具。通过 Tailscale 等组网工具,你可以把 Ubuntu 的 NFS 盘装进笔记本里,在咖啡厅随时访问家里的资料,且全程点对点加密。
如何配置双网段共享?
只需在 /etc/exports 中,在刚才那行的末尾加一个空格,然后跟上 Tailscale 的全局网段 100.64.0.0/10 即可:
/var/nfs_share 192.168.3.0/24(rw,sync,no_subtree_check,all_squash,insecure,anonuid=65534,anongid=65534) 100.64.0.0/10(rw,sync,no_subtree_check,all_squash,insecure,anonuid=65534,anongid=65534)如果你在 Ubuntu 上开启了 UFW 防火墙,请务必放行 Tailscale 虚拟网卡:
sudo ufw allow in on tailscale0重启 NFS 服务后,出门在外只需将挂载命令中的局域网 IP 换成 Ubuntu 的 Tailscale IP,即可瞬间连通!
附录:疑难杂症自救手册
- 错误 53:找不到网络路径
- 自查 1: 语法错误。IP 后面有没有用冒号?是不是写成了
\\IP\路径? - 自查 2: 端口阻断。在 Ubuntu 上运行
sudo ufw disable关掉防火墙测试。如果关了就能连,请手动放行111和2049的 TCP/UDP 端口。 - 自查 3: 漏掉了
insecure参数或exports里的网段写成了*号。
- 自查 1: 语法错误。IP 后面有没有用冒号?是不是写成了
- 错误 85:本地设备名已在使用
- 盘符被卡死了。打开 PowerShell 输入
umount Z:卸载僵尸盘,或者换一个未被使用的盘符(如X:)重新挂载。
- 盘符被卡死了。打开 PowerShell 输入
(完)