写在前面

回顾一下,我的第二代 NAS,使用已经刚好两年了,距离最开始的NAS,已经过去四年了。

其实最近才又开始重新折腾,发现之前对软硬件的使用率都太低了. 这带来了生产率和效率问题。

服务和结构

对于 NAS 本身来讲,功能单一是最优解,一个特定的功能只解决一件事。但是这无法提高 NAS 上的利用率。附加一些随时可中断的服务,对于现在是更好的选择。

对于我不可接受或最好不要被暂停的服务,我会尽量把它挪到 服务商(Cloudflare, Github)进行托管。

那对于可接受短时间中断的应用,则以应用类型和用途部署到NAS的不同环境上,例如 需要直接访问NAS上的文件,都会尽量通过 NAS 的 Applications(k3s)来提供,部署方式比较复杂或主要提供应用能力的会放在虚拟机上。

所以会有这两种方式来提供效率:

  • Applications(K3s)
  • Virtual Machines(QEMU - Kvm)
    • OpenRC
    • docker-compose

K3s

K3s 上对于直接访问文件系统是比较友好地,不需要绕弯路,所以会挂载和文件相关的应用,比如

  • transmission(PT)
  • qBitTorrent(PT)
  • aria2c(常规离线下载)
  • IPFS(去中心化的文件服务)
  • Photoprism (照片备份)

对于减少中断时间的应用也可以部署到这儿

  • clash

对,现在已经不在做透明代理了,会直接使用 HTTP Proxy,透明代理会导致更多问题 弊大于利。

Kvm

虚拟机可玩性就高太多了,想部署什么服务都几乎不会碰到问题。

但是有坑点还是要讲一下的:

  • 访问宿主机(需要桥接网络,然后再用局域网的IP来去挂载 SMB 等)
  • VirtIO (在一些没有集成这些驱动的系统上,你可能需要先加载 VirtIO 的驱动,然后才能安装操作系统。 但其实 VirtIO 没有原生级别的体验 也没有稳定到不会出错)

虽然但是,这两个缺点都不至于放弃 Kvm,在这点上 利远大于弊。

我在上面部署了这些应用

  • tailsacle(用于异地组网)
  • AdGuardHome(提供本地缓存的DNS,而且可以自定义域名访问)
  • Alist (用来挂载各类网盘,和 NAS 文件,相当于我可以远程以 WebUI 的方式访问 NAS 的内容)
  • cloudflared (用来提供 tabby 公开的服务,和当前的运营商的 动态IP)
  • natfrp (打洞提供服务, 发现了个新用法,可以固定域名,就不用考虑换线路要换域名了)
  • caddy-server (提供基本的代理转发,部署到虚拟机上 是因为配置和代理比较复杂,且经常变动)
  • v2ray (用于转发和加密请求,配合natfrp的)
  • docker.io (用于复杂环境的应用部署和 测试类型的应用部署)

tailsacle

用于异地组网,很安全, 不过现在的用法更多是当成网关来用(和zerotier的设置方法一致),减少设备的安装部署,同时可以更顺畅的访问(很优雅)。

Alist

用来挂载各类网盘,和 NAS 文件,相当于我可以远程以 WebUI 的方式访问 NAS 的内容

但是 Alist 提供的 WebDAV 不靠谱,不能通过 WebDav 去大批量的写数据到网盘上,而且还有内存泄露问题。

所以 Alist 其实更适合简单的浏览文件。

docker.io

在虚拟机上的 Docker,主要目的就是为了让系统更干净,避免应用侵入系统散落各地造成一些不必要的破坏,这会对系统维护带来麻烦。

比如我这台 Alpine Linux,运行了两年没有更新系统,现在已经成功更新到了最新,非常容易。

  • homepage (一个页面可以展示所有在 NAS 上运行的服务 `almost)
  • grafana (用来展示 日志和统计)
  • homeassistant (HA是比较复杂的, 所以一开始就没打算安装到主机上, K3s上的安装是有问题的。)
  • tabby-server (Tabby Shell 的 配置服务器)

OpenRC

通过 OpenRC 可以使用 rc-update add {service} default 来让服务开机启动,这可以和k3s带来几乎一致的体验。

硬件改进

NAS Gen2,从之前的 ITX NAS机箱 换成了 2U 服务器机箱,整体都不错,但散热一致不满意。

最好的硬件改进就是换了散热风扇,由原来的服务器 3个 暴力扇 换成了 idcolling 的 8010 风扇(4个,之前是有一个没安装)

1cm的厚度,则代表了这个风扇可能是和显卡风扇一个生产线上下来的,和显卡采用同规格风扇就意味着 更安静,效率更高。

之前的暴力扇虽然限制了速度,但是我猜应该没有工作在最佳效率区间,噪音难以抑制,风量也不高。

现在晚上的噪音,从原来的 或许能接受 改进到现在的 完全没问题,而且硬盘温度整体下降5度。这是一个最棒的硬件改进。

BTW,有一个 RJ45 SFP+ 模块 已经挂掉了。现在正在用的是另一块,NAS的网络从 10Gb 降级到了 2.5Gb。

辅助改进

路由器

经一个朋友(xking)的指导,看了一眼光猫,发现了个好东西:端口转发

那么有了端口转发,那就相当于我有了可靠的公网链接,那么 我就可以考虑在路由器上做点事情了。

  • 端口转发(PT Client, VPN Client)
  • wireguard
  • ddns
  • 静态路由

wireguard

特别吹一下 路由器上的 wireguard。

WG的优点非常明显:

  • 基于TCP(ISP对于TCP的影响较小, IKEv2是走UDP的,效果没那么好)
  • 只需要一个 TCP 端口,而且是写在配置文件里的,这就意味着,只需要在光猫上映射一条记录。
  • 配置文件简单清晰(可以很简单的更改配置, 不限于端口和路由)
  • wireguard 应用轻量高效,整体优雅(iPad和iOS,macOS,Windows,都有很好的客户端,而且比较新)

最最最大的好处就是,用了在 wireguard 连回家,可以获得和在家一样的体验。

以前通过 Tailscale 连回家 需要让每一个被链接的设备都安装 Tailscale,然后再获取 Tailscale 下发的 IP 才能连上。

现在 访问局域网设备,和在家里完全一致,仍然是家里路由器上的设备的 IP,也可以直接使用 AdGuardHome 提供的自定义域名。

更棒的是,你在路由器上配置的静态路由,也可以使用,比如:配置在路由器上的 Tailscale 静态路由,可以让你不必启动 Tailscale 直接通过家里转发到对端(不在家,但是在异地的虚拟局域网)设备。

Fantastic !!

ddns

华硕路由器上自带 DDNS,但是有个小问题,这个记录更新太滞后,所以搞了 serverless 函数 托管在 Cloudflare 上。

所以现在路由器 只负责注册。

数据保护(备份)

Dataset 和 Zvol

Periodic Snapshot Tasks

Snapshot 用于快照目标,就像虚拟机中的 快照 一样,但是 Periodic Snapshot 可以快照数据集,这就非常棒。

但是 Snapshot 会非常占空间,这带来了两倍空间的消耗。

解决办法就是 Snapshot 的 lifetime 设置短一点,让本次 Snapshot 尽快过期自动删除。

那数据怎么办呢? 答案是:Replication Tasks

Replication Tasks

Replication 是复制 Snapshot 到指定目标。

且可以永久保留 Snapshot。

而且 可以指定 Snapshot 的 lifetime,和上面的 Periodic Snapshot Tasks 的 lifetime 分开,这太棒了。

需要注意的是:Zvol 不可以复制到 Dataset, 最好的方式是 什么类型的 就复制到什么类型上(新建 snapshot 专用的 Dataset 和 Zvol )

Cloud Sync Tasks

Cloud Sync Tasks 可以用 rsync 把数据备份到 WebDAV,Google Drive,S3 等。

但 国内相对 不太友好,或者成本比较高,像 S3,十几T的数据备份过去,要很多很多钱了。

所以还有个方案就是:使用 Alist 挂载 WebDAV,然后通过 Alist 挂载的网盘,上传到国内“免费”的大容量网盘上。

但 Alist 还没到生产级的可靠,所以这个方案是半死不活,只进行小量数据的同步,目前稳定运行。

计划改进

  1. 引入一个新的独立计算设备(mac mini 最佳),把 虚拟机资源 和 DNS 独立出来。避免中断。
  2. 以前服务占用的内存不到1/4,现在已经占用一半还多了,而且还要和ZFS的Cache抢内存,目前内存总计32G,其实我更希望内存更多一点。