周三晚上十点,我盯着Proxmox控制台里新增的两块Seagate Exos SAS硬盘,犹豫着该在虚拟机里装个TrueNAS,还是直接用主机上的原生ZFS。那个月刚给家里的迷你服务器塞进一张LSI 9207-8i的HBA卡,满心以为配个直通、起个TrueNAS虚机就能无脑享受文件共享,结果一头扎进IOMMU分组和ACS覆盖的坑,差点把整台机器拆了重来。几个小时之后,当我把两个SAS盘直接交给Proxmox管理、建起ZFS镜像池的那一刻,整个方案反而变得惊人的清爽——没有多余的虚拟层,没有永远要盯着的NFS服务,数据抵达容器的路径干净得像刚擦过的镜片。如果让我重新规划一百次,我依然会在这一步果断放弃TrueNAS虚拟机,拥抱原生ZFS。

把网络附加存储功能塞进一台已经在跑的Proxmox主机,这件事能走的路线其实比想象中多。根据手头硬件的脾气,你可以用不同的姿势把任务搞定,每种都有自己顺滑的一面和需要妥协的另一面。浏览社区论坛时,最常被捧上推荐榜的就是在Proxmox里跑一个TrueNAS虚拟机,再把物理硬盘通过控制器直通进去。这套方案听起来专业、成熟,也刚好匹配我硬盘笼里那两块企业级SAS盘的气质。我还真差点走了这条路——那是上周四傍晚,LSI 9207-8i刚被主板认到,两个Seagate Exos的绿灯安静地闪,一切仿佛只差在虚拟化层上轻轻一点。但就在准备创建虚拟机、勾选PCIe设备的时候,我停下了,脑海里翻涌的是过去几个月为了让这张卡在某块Z170-E主板上稳定工作而熬掉的深夜。多一层直通,哪怕只是VFIO的一次声明,都意味着你引入了新的不稳定因素,而且它很可能在最不可预料的时刻发作。

打开网易新闻 查看精彩图片

现在回想,真正让我收住脚步的核心原因可以掰成几个技术硬伤来聊。首先,TrueNAS需要对物理磁盘拥有不打折扣的、原始的访问权限——它必须能直接读取SMART数据,而ZFS文件系统在做数据完整性校验时,也强依赖这种没有中间商赚差价的交互。在虚拟化的环境里,推荐的交付方式是把整个HBA控制器通过PCIe直通扔给虚拟机,而不是分配虚拟磁盘。论坛里有太多用virtio磁盘走捷径、最终数据受损的教训,每一个帖子都像警示牌,警告你虚拟磁盘加ZFS这条路并非省心之举。把整张卡直通过去带来一个容易被忽略的连锁后果:一旦VFIO把设备绑定给客户机,宿主机就再也碰不到连接在卡上的任何存储。这意味着那块LSI 9207-8i和它带着的所有硬盘,都变成虚拟机的专属财产。在IOMMU隔离划分清晰的企业级主板身上,这样的独占不算问题,可放在我手头这块Z170-E面前,它更像一场赌注——板子并不能保证HBA卡稳稳落在自己独立的IOMMU组里,而我清楚记得为了让这张卡在这块主板上不出错,光调试就耗掉了好几个周末。如果再把ACS覆盖这类底层的妥协手段叠加上去,每一次内核升级都可能变成需要重新排障的冒险。把这一切可能的不确定性汇总起来,在直通层之上再维护一个长期运行的TrueNAS服务,光想想就让人觉得像是在睡梦中不断添乱的噩梦。

那一刻我做了一个现在已经不太想回忆的决定:既然直通这么鸡肋,为什么不直接让Proxmox自己管理ZFS?于是我删掉了还没来得及创建的虚拟机模板,把HBA卡稳稳地留在宿主机的掌握中。系统通过硬盘的静态 /dev/disk/by-id 路径认盘,然后几条简短的zpool命令就在两块SAS盘上建起了镜像池,没有passthrough,没有VFIO绑定,没有虚拟机启动顺序的依赖链。回头细品,这个选择不仅简化了存储底层的拓扑,还从根本上消灭了那个需要在宿主机和虚拟机之间反复加载驱动、检查分组、遭遇莫名中断的幽灵。

真正坐实我选择的,是后续和容器配合时的流畅体验。对于这台机器来说,存储从来都不是最终目标,它能无缝地为跑在上面的服务打通数据管道,才是它存在的意义。当ZFS直接长在宿主机上之后,我可以创建数据集,然后用bind-mount的方式直送进容器。举个例子:给照片备份的Immich LXC,直接把存储池里 tank/immich/library 和 tank/immich/db 这两个数据集挂到容器内部,那些家庭照片就静静地躺在由两块SAS盘组成的镜像上,中间没有一丁点多余环节。负责局域网文件共享的Samba容器也是一个独立的LXC,它挂载同一个池里的通用文件数据集,全家的笔记本、手机都能顺畅读写。整个数据流向干净得令人心情舒畅——从物理硬盘到文件系统,再到容器内部的挂载点,路径上没有第二个存储服务需要维护,没有网络文件系统的额外开销。

如果不选原生ZFS,而是让整个存储池闷在TrueNAS虚拟机里面,同样的需求会瞬间膨胀成一个麻烦的套娃结构。要想把照片推到Immich,数据必须先以NFS方式从虚拟机导出,再在宿主机上重新挂载回来。这就意味着,即使字节完全没离开这台物理机器,也必须在数据路径上永久插入一个NFS或SMB服务层。每次照片备份、每次文件存取,都要经历一次来访又折返的协议旅行,而且还硬生生多出一条依赖链条:Immich容器依赖宿主机上的网络挂载,那个挂载又依赖TrueNAS虚拟机的正常启动和NFS服务。一旦虚拟机晚了片刻就绪,全家人的文件共享和照片同步就会像多米诺骨牌般一块跟着瘫掉。而我曾经在那块Z170-E主板上挣扎过的直通稳定性问题,会像不散的阴云,随时可能让中间那一环彻底垮塌。这种局面,和我最终得到的直接绑定方案比起来,几乎就是两个世界的复杂度。

现在这台服务器已经无故障地跑了好几周,数据池的scrub和快照由Proxmox自带的工具定期执行,容器启停之间共享的存储安静如常。有时登录Immich刷出当天的家庭抓拍,或是在电视上通过Samba点开一部备份的电影,我都会想起当初在TrueNAS虚拟机和原生ZFS之间摇摆的那个夜晚。那短短几小时的犹豫,替我省下了此后或许要不断修补的数百小时。不夸张地说,对于一个在家用环境里追求稳定、痛恨隐藏依赖的人来说,在Proxmox上选择原生ZFS而不是把存储包进虚拟机,是我做过的最好决定。