上一篇讲了在 2022 年底到 2023 年初一台性能还不错并且兼顾了兼容性的 NAS 硬件选型思路,算下来价格并不便宜,但是从兼容性和零件可替换性上还是不错的。本篇更多的是关心整体系统基建而非应用层软件。如果对 Linux 不够熟悉,直接无脑 Windows Server 什么都不用折腾。
系统方面可选的有:
首先是 Windows Server,优点非常多,特别是对硬件兼容性处于变态级,吊打其他所有。比如后面所说的 Debian 就因为对 12 代 CPU 的核显支持不太好折腾了很久。一度想选择 Windows,但是一些软件只有 Liunx 版本也是个大问题,虽然能用 WSL2 来装,可是 SeaFile 这种读写磁盘的软件不适合 WSL2 跨系统的 磁盘 IO 性能很差的方案。可能什么时候微软能解决这个问题,就是我的 NAS 系统最终选择了。
回到 *nix 的圈子,首先排除 OVM,本来我更熟悉 Debain 并且希望有一个 WebUI 可以简单控制,OVM 非常符合,但经过试用 OVM,遇到了好多小 bug,最致命的是甚至没有做什么折腾,WebUI 就频繁出现 503 错误,我无法接受 NAS 运行在这样不稳定的环境中,其他系统还能让我取舍两难,OMV 的不稳定让我避之不及。
对于 TrueNAS,可能爱的人会非常爱,但是不太适合我的使用环境,原因是扩展硬盘不太方便(我有一批大大小小曾经陪伴了 10 来年的硬盘),内存占用比较高(每 1TB 硬盘需要 1GB 内存),在我看来更适合企业服务器环境,统一的硬盘容量,带 ECC 的大内存等等。
然后是黑群晖,黑的就是黑的,再怎么洗白也是黑的,群晖的系统只会对自家硬件完美兼容,其他硬件特别是新硬件和偏门硬件就随缘了,更适合放到 VM 中去使用群晖的生态软件而非当宿主机。
Unraid 是非常好用的系统,简单易用而且正如名字一样,不需要 RAID 就能获得类似 RAID5 的安全性,不过它同样因此有个缺点是一旦开了校验整体写入性能下降,可以通过添加 SSD 作为缓存盘提升速度。算是进入了最终的决赛圈,在决赛圈被 RAID 选型给淘汰了。
并不排斥直接使用最简单的 Debain 构建我的 NAS 底层,不过因为 Debian 的软件源和内核比较老旧,stable 版本对 UHD 7x0 的兼容性不太好。WebUI 可以安装轻量化: Cockpit,这个面板在 RHEL 系下功能比较强大,Debian 下面功能比较简单,不过如果只是监控系统状态还是没问题的。本来是打算把 testing 版本放进决赛圈的,但是此时有个更好的选择:PVE。
PVE 基于 Debian,官方已经支持了 LTS 的 Linux Kernel 6.1,有比较健全的 WebUI 可以完成大部分的系统监控和操作,文档、教程和社区也很活跃。这一切都很符合我对 NAS 系统的期待之外还有个额外之喜:可以比较方便的使用 LXC,可以用来隔离一些环境,折腾出问题还能不影响其他功能。
LXC 算是 VM 和 Docker 的中间选择,比 VM 轻量性能好还能不独占硬件,使用起来也更灵活,比如磁盘的管理;比 Docker 方便能真的当作一个操作系统来用,而不是只能 pull 别人打包好的某个固定软件,很适合多个软件的联动。
小孩子才做选择,成年人当然是全都要,Docker、LXC、VM 都几乎开箱即用(PVE 基于 Debian,可以跟 Debian 一样使用 Docker),根据不同需求供君任选也是我喜欢 PVE 的一点。
RAID 可以分为硬 RAID 和软 RAID,硬 RAID 需要硬件支持,一般是服务器使用,价格高购买不方便,价格低的咸鱼二手货一旦出了问题没办法买到相同的 RAID 卡数据就全没了,所以不考虑硬 RAID。
常见的软 RAID 分为 RAID[0-6],由操作系统或者文件系统或者第三方软件提供。但是常见大部分情况下对磁盘的要求是大小相同,这对渐进式升级 NAS 容易造成一些资金困难和硬盘浪费。而且读取单个文件时全部硬盘运行,NAS 硬盘噪声比较大,所以不太友好。Unraid 和 SnapRAID 对磁盘升级和噪音都比较友好,所以我更偏好这两种方案。 具体各种软 RAID 方案特性对比可以参见 SnapRAID 给出的 对比
相比 Unraid 会因为实时校验而降低性能,我更喜欢 SnapRAID 这种方式,它通过定时任务来进行校验写入,不会影响实时读写。当然非实时有利有弊,如果在写入数据之后还没来得及校验这个盘就挂了,那新写入的数据是无法恢复的,而且对大量小文件的 diff 性能也没那么好,所以比较适合写入频率比较低、文件比较大的场景,恰好家庭娱乐存储就正好适合。
另外其实 SnapRAID 可以配合 RAID1 或者 ZFS 对重要数据做更进一步的冗余,不过对于我来说没太大必要,我的重要数据会定期备份到 OSS 和 OneDrive 上。
因此我选 SnapRAID 的原因总结:
我的媒体仓库是多块硬盘合并而成的,自己手动关注磁盘剩余空间和调整下载位置,然后在 PT 下载等环节也要加入多个磁盘目录使用实在过于难受,因此需要选择一个存储池。好在存储池没有那么多需要选择的,直接无脑使用 mergerfs,当然它也给出了类似方案的 对比。mergerfs 的效果如下所示:
1A + B = C
2/disk1 /disk2 /merged
3| | |
4+-- /dir1 +-- /dir1 +-- /dir1
5| | | | | |
6| +-- file1 | +-- file2 | +-- file1
7| | +-- file3 | +-- file2
8+-- /dir2 | | +-- file3
9| | +-- /dir3 |
10| +-- file4 | +-- /dir2
11| +-- file5 | |
12+-- file6 | +-- file4
13 |
14 +-- /dir3
15 | |
16 | +-- file5
17 |
18 +-- file6
值得注意的是写入策略的选择,官方推荐使用 mfs(most free space)
,优先选择剩余可用空间最多的磁盘,这个会让你的所有硬盘都剩下的空间差不多,读写比较均衡,坏处是同一个文件夹的内容可能会被分散到多个硬盘。现在默认的策略是 epmfs(existing path, most free space)
,这种策略会优先找到目标文件夹所在盘,并把所有的后续同文件夹内容写入该盘,即文件夹中第一个文件决定了后续文件放到哪个盘,好处是相同路径的文件大部分会在同一个物理硬盘上,坏处是可能会先填满一个硬盘再填其他的。
比如把 5000 张照片 Copy 进 5 个硬盘组成的存储池,mfs
最后可能每个硬盘上各有 1000 张照片, epmfs
最后可能只有第一个硬盘上存在 5000 张照片,其他硬盘为空,直到第一个硬盘写满了,才会把后续的照片写入其他盘。具体选什么策略就见仁见智了,我选择 mfs
,希望负载均衡能延长一些硬盘寿命。
其实大量的读写一般发生在系统安装盘和 PT 下载盘,系统安装盘本来也不大,直接使用 SSD 足矣,PT 下载盘可以通过配置 BT 客户端先下载到 SSD 上,下载完成自动移回 HDD。如果还有 HDD 小文件随机读写的场景可以通过 bcache 来加速,不过 bcache 需要先把作为缓存盘的 SSD 清空和被缓存的 HDD 数据清空,不适合我这种硬盘上已经存在大量数据的使用,而且对顺序大文件读写加速效果也一般。
另外研究了一下做 HTPC 的方案,如果用裸机直接当 HTPC 最简单,跟正常的电脑看视频没区别。如果选择虚拟化方案的话,可以利用 12100 支持 SR-IOV,一个显卡可以虚拟出 7 个半虚拟化显卡实例,每个都能直通给虚拟机单独使用。直通一个实例给虚拟机来媒体服务器重编码,再给另一个虚拟机直通一个实例做 HTPC 进行解码。不过需要加一个支持 DisplayLink 的 USB 显卡复制画面到显示器(最近因为 M1 芯片的 MBP 只能驱动一台 4K 显示器,所以这个方案又火了起来),或者用一个咸鱼亮机卡直通给 HTPC 虚拟机来输出(其实从价格和性能上这个更合适,但是占用 PCI-E 槽位)。这么看下来过于复杂了,还是老老实实用来当媒体服务器吧。
有张闲置的无线网卡,正好想把 NAS 扔远一点防止噪音,等硬件准备就绪发现 PVE 并不推荐使用 WiFi,深入下去用 NAT 的方式也很复杂,所以暂时放弃了,也许等有必要的时候还会回归更熟悉的 Windows。