NFS on ZFS and MacOS

于 2024-12-26 发布

之前通过 SMB 共享的一个目录,今天在写入 3G 左右大小的文件的时候,复制结束之后报错 -51。由于搜索了一番仍未找到解决方案,只能退而求其次试用 NFS 共享。根据 Archwiki 上关于 NFSZFS 的配置,结合今天的试错经历,总结如下:

配置固定端口方便 firewall 放行

需要配置 rpc.mountd 和 lockd 的端口,这两个的配置方式有所不同。

对于 rpc.mountd,只需要修改 /etc/nfs.conf,找到 [mountd] 这一节,去掉 port=0 这一行的注释并修改成自己喜欢的端口比如 2050 即可,然后 restart nfs-server.service 即可。

对于 lockd,亦即 rpcinfo -p 中输出的 nlockmgr 条目,则需要新建 /etc/modprobe.d/nfs.conf,填入以下内容来设置端口,比如改成 2051:

1
options lockd nlm_udpport=2051 nlm_tcpport=2051

保存之后需要 reboot 才能生效。

综合以上配置,加上 nfs 自身使用的 111 端口和 nfs v4 的 2049 端口,nftables需要以下规则放行相关端口:

1
2
tcp dport {2049,2050,2051,111} accept comment "nfs"
udp dport {2050,2051,111} accept comment "nfs"

如果不放行 mountd 的端口,那么在 Finder 连接 NFS 时会直接显示无法连接;如果不放行 lockd 的端口,那么 Finder 能够正常连接,但是打开子目录的时候就会超时并且断开连接。

ZFS 配置以及 NFS options

用 NFS 共享 ZFS 的卷,不需要修改 /etc/exports,直接用 zfs set sharenfs=on zpool/dataset 就能够打开共享。但是这还不够,还有一些具体细节。

  1. 如果 dataset 设置了 mountpoint,那么启动了共享之后,Finder 中输入的 path 不是 dataset 的名字而是 mountpoint 的路径;挂载在 /mnt/raid1a 就输入 nfs://server_ip:/mnt/raid1a
  2. server 需要启用 insecure 选项才能正确连接,否则会显示被拒绝
  3. server 需要启用 anonymous 以及 idmap 才能让客户端写入

其中第 3 点在操作上是,假如管理这个目录的用户的 uid 和 gid 都是 1001,那么对应的配置选项应该设置为: all_squash,anonuid=1001,anongid=1001。这样,MacOS 通过 NFS 读写文件都会以 1001 用户的身份进行。

总而言之,zfs 配置 10.0.0.1/16 可读写、从 MacOS 能够正常连接和以 1001 用户身份读写的命令是:

1
zfs set sharenfs='rw=@10.0.0.1/16,insecure,all_squash,anonuid=1001,anongid=1001' zpool/dataset

目录