在群晖中挂载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_squash或all_squash组合使用。
为了不破坏ZFS中原有的文件owner信息,我需要使用all_squash配合anonuid/anongid,将群晖中的用户映射为PVE中的www-data用户。因此配置为
1 | # /etc/exports |
群晖配置
创建一个新的共享文件夹
由于我们将要挂载的文件系统不一定兼容群晖内置的权限模型,因此需要在群晖中创建一个原生的目录,作为包含挂载点容器,后续所有的操作和共享都基于此目录。
控制面板->共享文件夹->新增->创建共享文件夹
挂载NFS
File Station->工具->装载远程文件夹->NFS共享文件夹
设置App权限
在群晖中,需要为App配置目录的权限后,App才能访问。这里以Syncthing为例。
File Station->右键共享目录->属性->权限->新增
将App所对应的用户添加进去,并授予读写权限。
性能测试
由于NFS的性能主要受限于网络性能,因此这里主要测试PVE和群晖间的网络吞吐,测试工具为iperf3,网卡驱动为virtio。
1 | server: iperf3 -s |
从结果上来看,TCP吞吐接近20 Gbits/sec,已经远远超过大多数硬盘的读写性能。
总结
利用这套方案,我既可以享受群晖套件所带来的便利,也可以将数据管理权掌握在自己手中,无需担心黑群晖系统崩溃后导致的数据丢失问题。