在群晖中挂载NFS文件系统

玩网心云的时候,在PVE中安装了一个黑群晖,但是并没有使用它管理任何数据,一方面盗版的东西可能不稳定,另一方面不想被某个生态捆绑。最重要的一点:我始终都是使用ZFS,而群晖并不支持ZFS。碰巧最近使用samba服务时遇到一些问题,因此打算研究一下能否把这个黑群晖利用起来。

需求分析

由于我所有的数据都是存储在PVE的ZFS中,因此我不能把硬盘直接透传给群晖,要想让群晖访问我现有的数据,主要有3个思路:

  • VirtFS: 这是一种基于virtio的文件系统,可以将host中的目录映射为guest中的块设备,用于挂载。
  • NFS: Linux上的网络文件系统,通过网络传输数据。
  • SMB: Windows上用于网络共享的传输协议,通过网络传输数据。

理论上VirtFS拥有最好的性能,但是群晖中并没有官方支持,需要加载第三方驱动,并且需要在命令行中配置,稳定性是个未知数。

SMB在Linux上虽然已经有很好的支持,但配置相对繁琐,尤其是那套独立的用户管理。

而NFS相对来说配置较为简单,在群晖系统中也有良好的支持,因此我最终选择它作为群晖和PVE之间的桥梁。

NFS服务端配置

NFS服务端主要有以下几个选项:

  • rw: 允许读写操作,否则文件系统将变为只读。
  • async: 在写入完成之前就返回,可以提高性能,但是可能导致文件损坏。
  • sync: 在写入完成之后才返回,可以保障写入按顺序执行,但会降低性能。
  • no_subtree_check: 只检查被访问文件的权限,忽略子文件的权限检查。
  • root_squash: 将client的root用户和root组映射为server的匿名用户和匿名组,从而限制client的文件访问权限。
  • no_root_squash: client的root用户和root组将映射为server的root用户和root组。
  • all_squash: 将client所有的用户和组都映射为server的匿名映射和匿名组。这样client上不同用户的访问可以被映射为同一个用户。
  • anonuid/anongid: 设置匿名用户所对应的uid和gid。需要与root_squashall_squash组合使用。

为了不破坏ZFS中原有的文件owner信息,我需要使用all_squash配合anonuid/anongid,将群晖中的用户映射为PVE中的www-data用户。因此配置为

1
2
# /etc/exports
/mnt *(rw,sync,all_squash,anonuid=33,anongid=33)

群晖配置

创建一个新的共享文件夹

由于我们将要挂载的文件系统不一定兼容群晖内置的权限模型,因此需要在群晖中创建一个原生的目录,作为包含挂载点容器,后续所有的操作和共享都基于此目录。

控制面板->共享文件夹->新增->创建共享文件夹

挂载NFS

File Station->工具->装载远程文件夹->NFS共享文件夹

设置App权限

在群晖中,需要为App配置目录的权限后,App才能访问。这里以Syncthing为例。

File Station->右键共享目录->属性->权限->新增

将App所对应的用户添加进去,并授予读写权限。

性能测试

由于NFS的性能主要受限于网络性能,因此这里主要测试PVE和群晖间的网络吞吐,测试工具为iperf3,网卡驱动为virtio。

1
2
server: iperf3 -s
client: iperf3 -c <SERVER_IP>

从结果上来看,TCP吞吐接近20 Gbits/sec,已经远远超过大多数硬盘的读写性能。

总结

利用这套方案,我既可以享受群晖套件所带来的便利,也可以将数据管理权掌握在自己手中,无需担心黑群晖系统崩溃后导致的数据丢失问题。