首先,我保证五年之内在不重新折腾这堆垃圾了。。。(我记得我去年也说过)

日常使用中,发现用 truenas 做主要的虚拟化平台还是总有那么点不顺手。 所以还是想要换成 proxmox,最后各种心痒难耐下,还是上马了这个工程。

  • 尽管我现在觉得 TrueNAS 还是不太适合作为 homelab all-in-one 的底座。但是也不可否认其优秀。在有些方面(zfs attributes, UPS/NUT)方面,还是做到了开箱即用的。
  • 但是网络层的一些诡异现象,24.xx25.xx升级时候 App 的一点点混乱,和自带的 SPICE 的不好用还是让我决心迁移了。

第一篇从存储开始讲,因为我觉得几乎所有的 homelab 都是从 storage 开始的,或者说,都是从 “不想用 Google Drive 或者其他网盘” 开始的。 而且对于家庭来说,最重要的应该就是个人人生数据的存储了。所以整个架构基本上首先要保证对存储的需求,因而应该首先满足。 (基本上从底层到上层是 storage network application 的结构,别说,跟企业还有点像。)

手头的硬件

  • 机箱:Lianli PC-V1000z

the-case-front

当初花大价钱买的二手机箱,看中就是6个内部热插拔硬盘位,以及多达5个5.25光驱位。基本上对于基于 ATX 标准主板的 homeserver 来说,这样的配置已经算是把存储方面的拓展能力拉满。 至于当年联力的全铝机箱的做工,只能说,时隔多年,还是能看出来做工非常精良的。只不过岁月痕迹还是有一些的,二手货,划痕什么的总是少不了的,配的风扇也开始嗡嗡作响(只好换掉了,连带调速器)。

the-case-side

现在看来,这个机箱还是有点可惜的地方的:

  • 内部对隐藏走线或者理线的支持基本没有,配合侧透,你还得乖乖看着。。。
  • 不支持 E-ATX 的主板,以及只有 7 个拓展插槽,对未来的拓展支持多少还是有点限制,毕竟机箱已经这么大了。
  • ATX电源和内置硬盘笼实际上有点点冲突。如果要给模组电源线的插头留空间,就需要把电源仓往外拓展,看起来就更丑了。
  • 因为全身网孔,防尘和静音算是比较拉垮了。

不过现在想想,站在2025年下半年的这个时间点看,其实大机箱在 home server 中存在的价值基本上就是体现在对 3.5 inch HDD 的支持了。所以从这方面来讲,这个机箱应该也可以算是很不错了。

(加村人看着国内各种风骚 NAS 机箱各种眼馋啊。只可惜加村根本没得选,能选的也都贵到不可思议)

  • 硬盘笼:Rosewill 的 4x 3.5 inch HDD Cage

hdd-cage

这个 Rosewill 的笼子,硬盘托架都是塑料的,所以最好不要太多频繁的使用。不过对于家庭使用应该还是够了。加村这个地方什么都贵,这个算是为数不多当初选得起的选择了。

不过再怎么说,这个确实还是很好的解决了 3.5 inch 硬盘位的需求。还自带一个风扇,不用担心散热的问题。

缺点就是,对于免螺丝基本上是没有任何支持的。对于 3.5 inch 的HDD,还可以将就着不上螺丝凑合用。但是对于 2.5 inch disk,就没有任何免螺丝的办法了。 唉,当初也没想到手里不知不觉攒了一些2.5 inch sata ssd。无论是往 internal cage 还是这个 Rosewill cage 装,都需要螺丝,真的是挺麻烦的。

  • 主板:Asus B460M Prime

从这里开始就进入垃圾堆区间了。

手头有两张老旧垃圾主板:

  • z270p + i5 7600k
    • ATX (1x m.2; 3 physical PCIE x16 slots; 3 PCIE x1 slots)
    • Maximum RAM: 64GB
  • b460m + i3 10100
    • mATX (2x m.2; 1 physical PCIE x16 slots, 2 PCIE x1 slots)
    • Maximum RAM: 128GB

虽然 z270p 是 ATX 版型,PCI上面设备扩展性要好得多。但是没办法,因为是跑 PVE, i3 10100 虚假的多线程 core,和 128GB 内存的重要性不言而喻。而且之后我还打算在这上面跑 ZFS,内存自然是越大越好了。两个 m.2 接口(正好手头有3个 2TB NVME)让我可以跑 ZFS raid1 mirror。就算是在一些教条主义眼里,也算是说得过去的配置了。

b460m

所以最后的选择就是 b460m + i3 10100 了。比较可惜的就是没有 ECC 内存。但是这也没办法,ECC 内存需要付出的代价太大了。

  • 最便宜的 ECC 办法肯定是 AMD Ryzen 平台。虽然我手里一套 b450i + 3700x 的配置,但是因为是 ITX,内存限制和PCIE槽位限制都太大了。所以没办法用上3700x的8c16t 和 ECC
    • 而且其实 Ryzen 的 ECC 是 unbuffered 的,这种内存可是一点不便宜的。
  • 再有的选择就是服务器主板了,搁加村这地方,都是一点不便宜啊。

z270p 之后的打算是装一台专门给 GPU 用的机器。正好手头有好多闲置的 3070。看看能不能用起来跑跑 AI 推理。

(Intel 这种一代主板一代U的策略真的太讨厌了,现在想升级一下这个i3的CPU都不行,二手市场10代的CPU还都标着传家宝的价格。。。)

  • Storage

主板上6个SATA口,因为是在一个 iommu group 里面,所以直接都给 TrueNAS 了。然后手头还有一张垃圾 sata adapter card。PCIE x1 4 SATA。是 ASM1064 的主控,应该还是兼容ing很好的了。 PCIE 3.0 x1 4 SATA,如果都是接的机械硬盘,应该是没什么问题的。但是如果是 SSD,肯定是没办法全部跑满的。不过这个地方就是垃圾佬妥协的地方了,反正不打算在这张卡的硬盘上跑什么重要的东西,最多就是做做备份,所以就这样吧。 这张 ASM1064 上面的四个口都接到 Rosewill 的 HDD Cage 上面。方便用于冷备的场景。

  • 1x 4TB WD Red SMR:这个叠瓦盘大概只能用来冷备份了。初步打算是mount到 PVE,做单盘 ZFS,但是record size 用 1M。
  • 1x Micron M500 480GB SATA SSD:这基本上算是上古圣遗物了 SMART 显示 wear out 有 19%。打算是单盘 ZFS 用来个各种临时文件夹用。比如 Frigate 里面的 clip, Jellyfin 的 transcode 之类的。算是物了其用吧。

主板上的 6 个 SATA 全部直通给 TrueNAS,用于管理除了小 VM/LXC 以外的所有大型存储需求。包括 Immich , Jellyfin, Frigate 的空间。

  • 4x 14 TB HDD (2 from Segate EXOS, 2 from WD. All Shunked HDD)
    • Pool: tank, RAID10.
  • 1x Micron MX500 500GB SATA SSD。这个有点年头的 SSD 用在这里做缓存合适的,虽然比不上用傲腾之类的做缓存。但是相对于 HDD 本身来讲也足够快了。空间足够把 Immich 的所有 thumbnails 都放在缓存里,能显著提高 Immich 的浏览体验。另外,也是因为计划是 128 内存里面,有 64GB 直接都给到 TrueNAS,这才算是达到了开始使用 L2 ARC 的门槛。
    • Pool: tank L2 ARC Cache.
    • 因为只是读缓存,所以单盘足够了。

最后两个 2TB NVME 自然就是 PVE 的系统盘和最重要的 default VM disks。至少绝大多数家用场景下,不会有什么性能瓶颈。

  • XPG GAMMIX Gaming SSD S11 Pro 2TB Internal PCIe Gen3x4 M.2 2280
    • 反正主板接口只有 pcie 3.0,老的NVME用起来也没有什么心理压力。
  • AIGO P7000 2TB

其实手上还有两块 1TB Timetec dramless sata SSD。但是考虑下来,还是用在别的机器上面吧。

NOTE

为什么不把 ASM1064 直通给 TrueNAS?

为什么不用HBA卡?

  • 因为只有pcie x1 的插槽。而且ASUS这个插槽还是封口的,不像AsRock一般还良心一点给开口。
  • 其实如果硬件条件允许,最好的选择还是 HBA 卡。如果未来发现这台机器完全不用 GPU 了,可能会考虑直接把 PCIE x16 给一个 HBA 卡,然后就可以带更多的硬盘了。
    • 但是结合现在的NVME的趋势,难说会不会真的有这个需求了。
  • GPU

手头闲置 3070 有点多,考虑之后可能GPU还能用上,就插上吧。用的是一张 Zotac 的两槽位双风扇。如果是三风扇的,容易跟硬盘笼打架。如果是2.5槽位的,会盖住一个 PCIE x1 插槽。 这多一个 PCIE x1 插槽还是挺重要的,如果未来这台机器要上网卡,唯一的机会基本就是用 x1 插槽的网卡了 (最多能跑 8Gbps 吧大概,没有想象中那么废的。)

zotac-twin-edge

这个显卡比较怨念的地方就是:

  • 电源线贼TM难插
  • 越肩。但是对于非服务器机箱应该无所谓。

开搞

其实这个问题就是,你选择怎么妥协。如果手头有大把退役的大容量 enterprise nvme ssd + 带有 u.2 接口的主板,那还搞什么存储架构,直接一股脑 zfs mirror pool 就搞定了,速度容量一把抓。

但是现实是残酷的。钱包是空空的,预算是没有的。

storage-arch

很明显,存储分了三个 Pool

  • local-zfs-nvme: Default VM disks pool
    • On Proxmox
    • 用途: PVE 操作系统和所有 VM/LXC 的系统盘。
    • 主要要面对的问题是:
      • zfs volblocksize 的选择。默认 PVE 用的是 16k (之前甚至是8k)。但是现在应该改成64k了。
      • 其实应该还有一个就是 ARC 缓存的大小。之前,通常我会限制一下ARC的大小,类似16GB这样的。但是现在觉得可能不是很有必要了,PVE 应该能自己分配明白。如有必要,再通过 /etc/modprobe.d/zfs.conf ptions zfs zfs_arc_max=17179869184 来调整。
  • truenas-hdd-tank: Main bulky data pool
    • In TrueNAS VM
    • 用途: 存放我所有的“人生数据”——Immich 照片库、Jellyfin 媒体库、文件共享等等。
    • 硬件: 4x 14TB Exos HDDs 组建 ZFS RAID10,并用 1x 500GB MX500 SSD 作为 L2ARC 缓存。
    • 理由: RAID10 在 HDD 阵列里随机读写性能最好,L2ARC 缓存则能让浏览上万张照片的体验像在 SSD 上一样。
    • 主要要面对的问题是:
      • 针对不同类型的 storage 需求,相应的 zfs 设定,包括 recordsize,share 出去的 protocol, sync, secondary cache 设定等等。
  • local-zfs-staging: Staging pool for VM disks to store dirty/temp data
    • On Proxmox
    • 用途: qBittorrent 的下载目录、Jellyfin/Immich 的转码缓存。
    • 理由: BT 下载这种高频、琐碎的读写任务,既不适合放在宝贵的 NVMe 上消耗寿命,也不适合放在 HDD 上折磨磁头。让这块我不心疼的古董 M500 SSD 来“背锅”,再合适不过了。数据不重要,性能够用就行。
    • 主要要面对的问题是:
      • zfs volblocksize, sync, etc.

NOTE

为什么用TrueNAS?

  • 其实就是还需要一个 UI,一个在调整设置的时候能用的UI。现在确实记不住那么多 cli commands了。
    • 尤其是考虑之后 zfs send/recv 备份到另一台机器上,以及 snapshots 的管理,权限管理。各种杂七杂八考虑到一起,其实远远不是说改一个 zfs 上面的 attribute (zfs 提供 samba/nfs 只需要改 dataset 上面的一个 attribute 就能做到)。
  • TrueNAS 还能跑一些小小 app,比如 ddns-updater, filebrowser 这类的。
    • (我的标准是,必须是 configuration 能完整在 TrueNAS APP UI 里面 “复刻“ 的,才行,像 Jellyfin, Adguard Home 这种,config 必须通过瓷盘persist的,而不是完全通过 TrueNAS app UI 直接 “复刻” 的,就算了,因为后期如果需要迁移,或者说 TrueNAS App 本身大更新(类似 24.10 25.04),容易导致各种数不清的问题。)

NOTE

为什么不用 iscsi 来把 TrueNAS 的 tank 提供给 Proxmox 做 storage? 而是非要用 NFS 的方式?

  • 主要是出于对家庭实验室 (Homelab) 环境下的“灵活性”和“管理便利性”的考量。
特性NFS (文件级 - 推荐)iSCSI (块级)
管理灵活性✅ 极高 (透明的文件)❌ 低 (不透明的黑盒)
多用途共享✅ 高 (可同时服务于 VM 和 LXC,虽然现在没有这个需求)❌ 低 (通常为独占)
灾难恢复简易度✅ 高 (文件易于恢复,毕竟就是一个文件,也方便用简单方法 backup) 这个是最重要的⚠️ 较低 (依赖于元数据恢复)
性能 (homelab场景)✅ 优秀 (吞吐量足够)✅ 优秀 (延迟略优,但无明显体感)

我的总结就是,知道发现需要 iscsi 的低延迟性能之前,就先用 qcow2 on NFS 苟着。

Local NVME ZFS Mirror Pool: rpool

(其实这个是 rpool,是 proxmox 安装完之后默认创建的 zfs pool)。

  • 确保 atime 是关上的,使用 xattr=sa
# Proxmox 安装时通常已设置 atime=off, 我们来确认并开启 xattr=sa
zfs set atime=off rpool
zfs set xattr=sa rpool
  • 设定 volblocksize = 64k

在 PVE 的 data center storage 中,编辑 local-zfs,将块大小 (Block size) 改为 64k。

理由: 这是针对通用虚拟机负载的最佳实践。现代操作系统的 I/O 调度器通常会将小写入合并为更大的块(常见为 64KB)。将 ZFS 的块大小与之一致,可以避免“写分裂”,提升效率,是平衡随机写入惩罚和元数据开销的“甜点位”。

NOTE

如果真的有纯数据库大规模写入的场景,那肯定还是要跟 DB 的 txn min size 对齐的。只不过我发现家用场景,确实是64k效果最好。用默认的16k 真的不行。 当然,这里还有个前提,就是VM里面使用的是 EXT4 FS,其他的 FS 我还没有实验过。

Supporting materials:

  • 启动 monthly scrub

(Proxmox 默认居然不开。)

# 启用并立即启动 rpool 的每月 scrub 定时器
systemctl enable --now zfs-scrub-monthly@rpool.timer

TrueNas managed pool: tank

  • 创建 ‘backups/pve’, ‘nvr/frigate’, ‘media/jellyfin’, ‘vmdisks’, ‘shared’ 这些 dataset
  • ‘backups’ 可以用 secondarycache=none, recordsize=1m.
  • ‘nvr’ 可以用 secondarycache=none.
  • ‘media’ 可以用 recordsize=1m
  • ‘shared’ 可以把 acltype 调整为 NFSv4 从而允许更精细的permission management。当然其实吧,在家里,也是用不大上的。
  • ‘vmdisks’ 反而是什么都不调整的,就用默认的(recordsize=128k),如果以后开了 iscsi,volblocksize还是应该用 64k。

TrueNAS就不会傻乎乎的非要把 atime=on 和 xattr=all 留着。

SATA Local Staging Pool

其实目前还没有把这个盘用于 VM。现在都是用在LXC上面(这样就算是盘挂了,也不大会影响 LXC 上面服务的运行,删掉 mount 就行了,如果是 VM,就麻烦多了)。所以不需要关心 volblocksize 的事情。但是 atime=off, xattr=sa 还是要设定的。

zfs set atime=off local-zfs-staging
zfs set xattr=sa local-zfs-staging

未解决的问题: Backup

实际上 backup 的问题并没有真的解决。现在的 backup 是单纯的 dump。没有任何 incremental backup 的概念。

如果没有 incremental backup,对于我 ~1TB 的 Immich 数据,如果每周备份一次,就是每周 1TB 的写入,折合每天近乎 140+GB 的写入。这个写入量对于 homelab 来讲已经很高了。

之后的打算是在 All-in-one 里面创建一个 PBS VM (proxmox backup server) 来做 incremental backup。

  • 主要就是防止操作失误产生的不可恢复错误。
  • 虽然 snapshot (both in pve and truenas) 可以一定程度上解决这个问题,但是毕竟不是 self contained。真正在出错要处理的时候,恢复起来可能会很慢的。

然后还会有另一台主机装 ZFS,给 TrueNAS 里面的 non-VM/LXC shares 和 PBS 里面的备份做备份。这样勉强可以算是一个’灾难备份’吧。

在这个PBS系统搭建起来之前,就先本地 dumb dump 吧。(频率可以设定为每月一次自动的。希望下个月之前能搞定 PBS)

十万个为什么

NFS 创建大磁盘超时怎么办?: 我在尝试创建 2TB 的 qcow2 磁盘时遇到了超时错误。

解决方法:临时在 TrueNAS 里把对应数据集的 sync 参数设为 disabled,创建成功后立刻改回 standard

TIP

安装完 Proxmox 之后,推荐用这个script完成一些后续的设置:

https://community-scripts.github.io/ProxmoxVE/ 有很多有用的东西,推荐看一看。

为什么不把 Proxmox 系统盘和虚拟机池分开?比如用 MX500/M500 做系统盘?

因为在您这套现代化硬件上,“统一”远比“分离”更优越。

  • 传统上建议分离,是为了防止慢速的虚拟机存储(通常是 HDD)拖慢系统盘的响应。但是现在的情况是:
    • 性能过剩: rpool是一个极其高速的 NVMe 镜像池。Proxmox 操作系统产生的这点 I/O 负载,不值一提。
  • 可靠性更高: 新一些的 nvme 组成的 mirror 估计比老旧 sata 可靠性高。

如果家里有闲置的旧 2.5 英寸机械硬盘 (HDD),还适合用在这台服务器上吗?

虽然“物尽其用”是 homelab 的目标之一。但是这中老硬盘真的还是算了(我有两块。。。)

  • 性能很差,干什么都很差。
  • 不知道浪费 sata 和 电源槽位。
  • 风险还大,年头太久了。

要不要用 ZFS over iSCSI,为什么不?

  • 如果是 TrueNAS 提供 iscsi 给 Proxmox 用,还是可以的:
    • VM FS qcow2 iscsi zfs (zvol) on TrueNAS
      • 只要 VM 里面不用 zfs 之类的,就不会有 zfs on zfs 的情况。(虽然qcow也是cow,但是问题可能不大,毕竟也还是个文件嘛)
  • 如果是 ZFS over iSCSI:
    • VM FS zfs iscsi zfs (zvol) on TrueNAS
      • 这就 zfs on zfs 了,完蛋了。

消费级 2TB NVME 一般写入寿命有多少?

  • 一块中高端的 2TB 消费级 NVMe SSD(例如 Samsung 970/980 Pro, WD SN850X, Crucial P5 Plus),其官方标定的 TBW 通常在 1200 TBW 左右。一些更偏向价值的 QLC 硬盘,也通常有 400-800 TBW。
  • 以一个保守的 1000 TBW 来计算:
    • 把时间拉长到 10 年,那也是每天 280 GB。
  • 一般现实情况是,每天也就几十GB的写入。(Note, if backup not done right, this number can be much higher)

Next

image-of-the-server

到此为止,storage 层基本上已经搞定了(备份的问题可以之后再解决),至少对于后续的 VM,LXC来讲,基础已经打好了。

下一篇文章中,我们将讨论一下网络架构,聊聊 OPNsense, Adguard Home 和家里路由器的使用,以及他们如何影响 homelab。