我的初代 NAS

我莫名其妙的习惯之一,是当数据存入一个我认为可信的云服务后就会在本地删除,以至于老电脑里的数据加虚拟机都用不满 256GB。可近半年发生了太多魔幻的制裁、封号以及 log4shell 全球大联欢,不禁让人感到互联网是如此脆弱,数据还是握在自己手里最踏实,于是对 NAS 的渴望逐日指数级增加。

从开始搜集资料到确定软硬件方案断断续续有一个月的时间,从正式开始使用到现在也过了一个多月,我的日常存储场景基本都体验过了,稳定性和易用性还是很令人满意的,考虑到未来可能频繁升级,所以暂且命名为初代。

硬件

经过一段时间的高强度熬夜刷帖,看了很多自攒硬件方案,考虑到淘硬件的踩坑成本和时间精力,终于还是打消了攒新机器的想法,高效利用已有的设备。

现在手边有一台作为透明代理的 Intel NUC7CJYH 和一台作为家用服务器的主机,本着尽可能不 All-in-One 的原则,首先在 NUC 上做尝试。这台机器优点是小巧精致、功耗低,做 NAS 性能足够,与服务器分离可以防止哪天被我一起玩崩了。缺点是扩展性为零,单网口单 2.5 寸 SATA,想要用 3.5 寸机械盘只能 USB 3 外接硬盘盒。于是我又转头去调研硬盘盒/笼,入手了一个优越者单盘位硬盘盒,可以独立供电。NUC 上开一个直通 USB 的虚拟机,测试中除了 SMB 传输时 CPU 吃紧之外没太大问题,但犹豫再三都不放心 USB 外接,存储服务毕竟要稳定优先,所以简单体验后就放弃了这个方案。而服务器主机的硬盘恰好都在 M.2 上,SATA 完全空闲,于是经过长时间测试,就有了目前的「虚拟机运行 NAS 系统 + 直通 SATA 控制器」方案。

唯一额外的花费是机械硬盘,参考 UP 主钱韦德的视频入手了西数紫盘 4T 海康威视版本,可以用海康的质保。虽说是监控盘,但根据搜到的信息来看完全可以当 NAS 盘用,到手后实际体验良好。

从硬盘容量、级别也可以看出,比起动辄十几块氦气盘的 NAS 玩家,我只能算是超级轻度用户,硬件就将就一下吧。在未来有更高的存储要求时,我大概会买 HPE MicroServer 之类的成品家用服务器作为独立的存储设备,省去硬件选择和测试的烦恼。

调研期间收集了一些质量挺高的资料,贴在下面分享给需要的同学。

完整方案:

硬件:

机箱:

软件

作为存储服务,一个靠谱的文件系统是软件层最重要的。问问你的谷歌 which is the best file system for nas,我猜第一个结果就是 ZFS

ZFS 具有可扩展性,并且包括大量保护措施防止数据损坏,支持高存储容量、高效数据压缩、集成文件系统、卷管理、快照和写时复制、连续完整性检查与自动修复、RAID-Z、原生 NFSv4 ACL 等功能

现在一般指 OpenZFS,是原 Oracle Solaris ZFS 的开源实现。在查阅 ZFS 资料时经常看到必须搭配 ECC 内存的说法,但根据 OpenZFS 文档来看使用条件并没有那么苛刻:

Misinformation has been circulated on the FreeNAS forums that ZFS data integrity features are somehow worse than those of other filesystems when ECC RAM is not used[2]. That has been thoroughly debunked[3]. All software needs ECC RAM[4] for reliable operation and ZFS is no different from any other filesystem in that regard.

话说回来,我的 5600G 压根也不支持 ECC。

确定了文件系统后,剩下的就是组合各种工具来实现需要的功能,例如我的 NAS 选型与搭建过程(基于开源方案),也可以选择已经封装好的系统,例如 TrueNASOMV

时间紧任务重,我选择了 TrueNAS,其吸引我的点是使用 ZFS、开源、社区活跃、有商业公司支撑。TrueNAS 有 Core 和 Scale 两个版本,前者基于 FreeBSD,是迭代了很久了的稳定版本,后者是近几年刚开始做的 Linux(Debian) 版本,今年二月才放出第一个 release。之前用 NUC 测试时感觉 Scale 与 PVE 的驱动结合更好一些,在文件传输测试中 Scale 的 CPU 平均低 10% 左右,社区中也有类似的性能差异,所以最终选择了新鲜的 Scale。

由于 TrueNAS 本身是一台虚拟机,所以没有用其内置的虚拟化和 K3s 来运行应用,而是让运行服务的虚拟机挂载 NFS。存储和应用在软件层分开是我最后的倔强。

数据保护

ZFS 加密 & 快照

ZFS 原生具有加密的能力,并且在用户态设置的密钥只是加密了底层用于数据加密的主密钥,所以在主密钥没有暴露的情况下可以随意更换上层密钥而无需重写整个数据集。但是否开启加密要在数据集创建阶段就确定,创建完成后无法再转换,所以我加密了所有数据集。硬盘在脱离挂载后数据集变为锁定状态,不需要再担心搬家丢失硬盘或硬盘送修导致的数据安全问题。

现在该关心 NAS 正常运行时的数据保护措施了。由于硬件上的将就,目前的方案无法从软件上解决宇宙射线导致比特反转这种事情,但防止手残误删数据还是可以的。原本想仿照时间机器的设定——过去 24 小时的每小时备份、过去一个月的每日备份以及过去所有月份的每周备份——来设置快照,但我这墨菲特般聪明的大脑实际上很难回想起几周之前的改动细节,所以目前只设置了短期快照,后续再根据使用情况调整。

数据频率存放时间保留空快照
文档、照片2 周
文档、照片1 年

作为一个先进的文件系统,ZFS 还有很多特性保证了数据的完整性和安全,日后再慢慢探索。

异地备份

根据 3-2-1 原则,数据应至少有 3 个副本,存储在 2 种不同类型的存储介质上,其中 1 个副本应该保存在异地。但鉴于经常刻光盘或磁带不太现实,我就只做到了 2-1-1。异地备份是为了避免极端情况导致本地硬盘数据完全丢失,虽然做了认真的设置和测试,但我还是希望永远都用不上。

数据频率云存储
应用数据OneDrive
文档、照片OneDrive
文档、照片B2
备份OneDrive

OneDrive 是与同事拼车的家庭版,1T 容量足够存放重要数据。B2(Backblaze) 是一家口碑不错的云存储服务商,价格是 S3 的四分之一,有 10GB 的免费额度,对于轻度用户来说非常划算。另外,硬盘相关帖子中经常有人提到的硬盘使用报告也是他们家的。B2 也提供了快照、文件历史版本的功能,但对我来说云端只保留最新版本就好。

TrueNAS 的 Cloud Sync 是用 rclone 实现的,可以做到文件级增量上传和上传前加密。而另一个比较火的开源备份工具 restic 可以将文件切片从而实现更细粒的增量备份。所以目前我认为最好的方案是:

  1. restic 备份整个数据盘到备份盘,然后再用 rclone 上传到云存储
  2. 使用支持 zfs-send/zfs-receive 云服务商

未来不用 TrueNAS 时会尝试这些方案。

短期体验总结

总的来说,这套方案有很多明显的缺陷:非独立硬件、没有 RAIDZ、没有 UPS。不过作为年轻人的第一台 NAS 我还是很满意的,预期至少可以服役两年。

功耗方面,主机运行 PVE 待机 22W,TrueNAS 虚拟机无硬盘待机 24W,挂载两块盘 28W,很是环保。噪音方面,恰好最近十多天隔离在家,主机就在我左侧一米的位置,除了偶尔会听到硬盘炒豆子声,大部分时间并不会感受到 NAS 的存在。只是增加一点噪音和一点电费,却带来了极大的安全感。