macOS系统 NFS v3 服务

考虑到 macOS系统 NFS v4 服务 可能在 Colima使用NFS共享存储 环境中和 NFS v3差别不大,在排查NFS挂载问题时,我也尝试了 NFS v3配置来作为对比。

  • /etc/nfs.conf :

NFS v3 /etc/nfs.conf
# =========================================================================
# macOS 内核 NFSv3 专属高并发榨汁配置
# =========================================================================

# 1. 明确关闭 NFSv4 服务端支持,锁死 v3 状态机
nfs.server.v4 = 0

# 2. 核心安全排毒:允许来自非特权端口(>1024)的挂载请求。
# 虽然我们在虚拟机里加了 resvport,但把这个设为 0 能在宿主机层面提供最大兼容性,防止丢包
nfs.server.mount.require_resvport = 0

# 3. 性能暴力泵血:强行将 macOS 的 nfsd 内核并发线程数从默认的 4 或 8 提升至 64
# 这能确保虚拟机多线程编译(如 make -j4、mise install)高频读写小文件时,Mac 端有足够的线程瞬间响应
nfs.server.async = 1
nfs.server.threads = 64

# 4. 扩大内核 TCP/UDP 接收与发送缓冲区,防止在大块数据(rsize/wsize=1M)高频灌入时发生内核丢包
nfs.server.tcp.send_quota = 1048576
nfs.server.tcp.recv_quota = 1048576
  • /etc/epxorts :

输出 /etc/exports
/Users/admin -mapall=501:20 -async -network 192.168.106.0 -mask 255.255.255.0
  • 完成后重启 nfsd :

重启nfsd
# 强行停止、清洗并重启 Mac 内置的 NFS 守护进程
sudo nfsd stop
sudo killall -9 nfsd 2>/dev/null || true
sudo nfsd start

重启nfsd之后,通过 rpcinfo -p 观察,可以看到 nfsd 服务仅提供 v2v3 版本的NFS服务

如果没有达到预期的清理掉NFS v4配置,则采用以下彻底重启方法:

彻底重启nfsd
# 1. 让 launchd 彻底解除对 NFS 服务的托管
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.nfsd.plist 2>/dev/null || true

# 2. 强行物理超度可能残存的任何孤儿进程
sudo killall -9 nfsd 2>/dev/null || true

# 3. 强迫 launchd 重新全量加载配置并拉起服务
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.nfsd.plist

# 4. 权威裁判:核验端口与版本
rpcinfo -p

性能优化

为了在 Colima使用NFS共享存储 中提供更好的NFS性能,优化 /etc/nfs.conf :

性能优化的NFS v3 /etc/nfs.conf
# =========================================================================
# macOS 内核 NFSv3 高性能基础设施调优(完全体)
# =========================================================================

# 1. 彻底关闭 NFSv4,让 nfsd 专心走熟练的 v3 状态机
nfs.server.v4 = 0

# 2. 核心放行安全锁:允许来自非特权端口(>1024)的挂载请求
# 配合虚拟机端的挂载参数,双重确保绝不被 Mac 内核丢包或 Reset
nfs.server.mount.require_resvport = 0

# 3. 狂暴多线程优化:将内核 nfsd 守护线程池从默认的 4 或 8 强行扩容至 124 个
# 完美解决多并发编译(如 make -j4、mise install、cargo build)高频读写海量小文件时因线程排队导致的 I/O 便秘
nfs.server.async = 1
nfs.server.threads = 124

# 4. 拓宽内核 TCP 读写泵血管道:将发送与接收队列缓冲区提升至 4MB (4194304 字节)
# 允许 Mac 内核在面对虚拟机并发灌入的 1MB 级全速数据块(rsize/wsize)时,拥有足够的蓄水池,杜绝 TCP 窗口收缩和重传
nfs.server.tcp.send_quota = 4194304
nfs.server.tcp.recv_quota = 4194304

备注

确保文件末尾留有一个干净的空行,防止 macOS 解析器静默忽略最后一行!