之前通过 SMB 共享的一个目录,今天在写入 3G 左右大小的文件的时候,复制结束之后报错 -51。由于搜索了一番仍未找到解决方案,只能退而求其次试用 NFS 共享。根据 Archwiki 上关于 NFS 和 ZFS 的配置,结合今天的试错经历,总结如下:
配置固定端口方便 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
就能够打开共享。但是这还不够,还有一些具体细节。
- 如果 dataset 设置了 mountpoint,那么启动了共享之后,Finder 中输入的 path 不是 dataset 的名字而是 mountpoint 的路径;挂载在
/mnt/raid1a
就输入nfs://server_ip:/mnt/raid1a
- server 需要启用 insecure 选项才能正确连接,否则会显示被拒绝
- 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