Ubuntu + Windows NFS 文件共享指南

3 小时前(已编辑)
1

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 关掉防火墙测试。如果关了就能连,请手动放行 1112049 的 TCP/UDP 端口。
    • 自查 3: 漏掉了 insecure 参数或 exports 里的网段写成了 * 号。
  • 错误 85:本地设备名已在使用
    • 盘符被卡死了。打开 PowerShell 输入 umount Z: 卸载僵尸盘,或者换一个未被使用的盘符(如 X:)重新挂载。

(完)

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...