在用 Intel N100 四网口小主机折腾 All-in-One(PVE + 软路由 + TrueNAS/群晖)时,很多玩家都会遇到一个核心痛点:如何把 NVMe 固态硬盘直通给 TrueNAS,同时绝对不能影响到 PVE 本身的系统盘?
由于 N100 只有 9 条 PCIe 通道,且多网口小主机的板载走线非常紧凑,IOMMU 分组(硬件隔离分组)往往比较混乱。如果操作不当,极易把 PVE 系统盘或者网卡一起直通进去,导致 PVE 宿主机直接失联崩溃。
本文将提供一份保姆级的安全配置指南,帮助你理清物理直通与虚拟映射的逻辑,确保 TrueNAS 拿到原生 NVMe 控制权的同时,PVE 稳如泰山。
核心避坑前置:你的硬件支持哪种“直通”?
在动手前,先明确你的硬件物理布局。N100 小主机通常有两种双盘方案:
- 方案 A(最推荐): PVE 系统装在 SATA 固态(或 TF 卡/U 盘)上,NVMe 固态专用于 TrueNAS 存储。
- 方案 B(双 NVMe): 小主机插了两根 NVMe 固态,一根给 PVE 当系统盘,另一根准备直通给 TrueNAS。
安全红线: 如果你只有一根 NVMe 固态,想“分一部分空间”给 TrueNAS,绝对不能使用 PCIe 物理直通。物理直通的最小粒度是控制器(Controller),而不是分区。单盘情况请直接跳转到本文第四部分的 “方案二:RDM 裸磁盘映射”。
方案一:真正的 PCIe 物理直通(最适合 TrueNAS)
ZFS 文件系统(TrueNAS 的核心)极其渴望直接控制硬盘控制器,以便读取 S.M.A.R.T 信息并进行原生电源管理。如果硬件条件允许,首选此方案。
第一步:开启 PVE 宿主机的 IOMMU 支持
无论是哪种直通,都必须先让 PVE 启用 Intel 的 VT-d 硬件虚拟化。
修改 Grub 或 Systemd-boot 配置:
如果你是全新安装的 PVE 8.x,系统可能默认使用systemd-boot(ZFS分区引导)或传统的GRUB(ext4分区引导)。对于 GRUB 引导:
SSH 登录 PVE,编辑文件:nano /etc/default/grub找到
GRUB_CMDLINE_LINUX_DEFAULT="..."这一行,在末尾追加intel_iommu=on iommu=pt。
修改后类似于:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"保存退出(Ctrl+O,Ctrl+X),然后更新 grub:
update-grub对于 Systemd-boot 引导:
编辑配置文件:nano /etc/kernel/cmdline在整行内容的末尾空一格,添加
intel_iommu=on iommu=pt,保存后更新内核配置:proxmox-boot-tool refresh
加载直通内核模块:
编辑内核模块文件:nano /etc/modules在文件末尾追加以下四行内容:
vfio vfio_iommu_type1 vfio_pci vfio_virqfd保存后,重启 PVE 小主机。
第二步:精准定位 NVMe 硬盘的 PCIe 地址(防呆核心)
重启后,我们需要找出哪一个是你的目标 NVMe 盘,哪一个是你的 PVE 系统盘。
在 PVE 终端运行以下命令,列出所有的 NVMe 控制器:
lspci -nn | grep -i nvme输出可能类似于:
01:00.0 Non-Volatile memory controller [0108]: Kingston Technology Company Ltd. NV2 NVMe SSD [2646:0075] (rev 01) 02:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller [144d:a80a] (rev 00)这里的
01:00.0和02:00.0就是它们的物理 PCIe 地址。确认哪张盘正在承载 PVE 系统:
输入df -h或lsblk,查看当前挂载在根目录/下的设备。例如,如果nvme0n1是系统盘,通过以下命令查看其对应的物理地址:ls -la /sys/class/nvme/nvme*你会看到类似如下的软链接指向:
/sys/class/nvme/nvme0 -> ../../devices/pci0000:00/0000:00:1c.0/0000:01:00.0/nvme/nvme0这说明
01:00.0是 PVE 系统盘!我们要直通给 TrueNAS 的是另一个,即02:00.0。 请拿小本子记下你要直通的那个物理地址。
第三步:检查 IOMMU 分组是否安全
由于 N100 小主机主板设计紧凑,有时会把第二个 NVMe 接口和板载网卡(比如 i226-V)划分在同一个 IOMMU 组里。如果强行直通,会导致网卡一起被划走,PVE 直接失联。
运行以下脚本,查看你要直通的 NVMe 设备的组内成员:
find /sys/kernel/iommu_groups/ -type l | grep "02:00.0"
(把其中的 02:00.0 替换为你实际要直通的 NVMe 地址)
它会输出该设备所在的 Group 编号,比如 group 12。接下来查看该组内还有没有其他设备:
ls /sys/kernel/iommu_groups/12/devices/
- 安全情况: 输出里只有
0000:02:00.0这一个设备。说明该槽位是独立分组,可以完美直通。 - 危险情况: 输出里除了 NVMe,还出现了网卡(如
0000:00:1c.*)或其他设备。此时如果直接直通,PVE 会崩溃。- 解决办法: 需要在第一步的引导参数中额外加入
pcie_acs_override=downstream,multifunction来强制拆分 IOMMU 分组,更新并重启后再进行检查。
- 解决办法: 需要在第一步的引导参数中额外加入
第四步:在 PVE 网页端安全添加设备
- 登录 PVE Web 界面,找到你的 TrueNAS 虚拟机(假设 VM ID 为 101)。
- 依次点击:虚拟机 -> 硬件 -> 添加 -> PCI 设备。
- 在设备列表中,根据你刚才记录的物理地址(如
0000:02:00.0),精准选择那个非系统盘的 NVMe 控制器。 - 勾选 “所有功能 (All Functions)”。
- 不要勾选 “ROM-Bar”(对于某些非显卡设备,勾选 ROM-Bar 可能会导致虚拟机无法启动或引导卡死)。
- 保存。现在启动 TrueNAS 虚拟机,在系统内就能直接看到该 NVMe 的品牌、型号,并能读取完整的 S.M.A.R.T 数据了。
方案二:RDM 裸磁盘映射(退而求其次的安全方案)
如果你的 N100 小主机 IOMMU 分组实在无法拆分,或者你只有一块大 NVMe 固态,在上面分了区(一部分装 PVE,一部分想给 TrueNAS 做存储),那么绝对不能使用 PCIe 直通。此时,RDM 裸磁盘映射是唯一的安全解。
这种方式下,PVE 依然掌管着物理控制器,但它把整块盘(或某个分区)的读写权限毫无保留地“直连”给虚拟机,对 TrueNAS 来说,体验非常接近物理直通。
操作步骤:
获取目标硬盘的绝对唯一 ID:
在 PVE 终端输入:ls -la /dev/disk/by-id/你会看到类似下面的输出:
nvme-Samsung_SSD_980_PRO_1TB_S6B0NL0W123456Y -> ../../nvme0n1 nvme-Samsung_SSD_980_PRO_1TB_S6B0NL0W123456Y-part1 -> ../../nvme0n1p1选择不带
-partX后缀的那个,这是整块物理盘的 ID。例如:nvme-Samsung_SSD_980_PRO_1TB_S6B0NL0W123456Y。用命令行将磁盘挂载给 TrueNAS 虚拟机:
假设你的 TrueNAS 虚拟机 ID 是101,我们想把它挂载为scsi1(注意不要与已有的scsi0系统盘冲突):qm set 101 -scsi1 /dev/disk/by-id/nvme-Samsung_SSD_980_PRO_1TB_S6B0NL0W123456Y注意:请将命令中的
101和磁盘 ID 替换为你自己的实际数据。开启虚拟磁盘的 SSD 仿真:
回到 PVE 网页端,点击 TrueNAS 虚拟机的 硬件,你会看到新多出来一个scsi1硬盘。
双击编辑它,勾选 “Discard (丢弃/TRIM 支持)” 和 “SSD 仿真 (SSD Emulation)”。这能让 TrueNAS 知道这是一块固态硬盘,从而开启定期的 TRIM 优化,延长固态寿命。
避坑总结与排错
- Q:为什么直通后 TrueNAS 启动了,但 PVE 的 Web 界面打不开了?
- A: 大概率是因为你的 IOMMU 分组不干净。直通 NVMe 的同时,不小心把板载网卡也连带直通进了虚拟机。此时请在小主机上接上显示器和键盘,登录 PVE 命令行,编辑
/etc/pve/qemu-server/101.conf(101为虚拟机ID),删掉包含hostpci0的那一行,重启宿主机即可恢复。
- A: 大概率是因为你的 IOMMU 分组不干净。直通 NVMe 的同时,不小心把板载网卡也连带直通进了虚拟机。此时请在小主机上接上显示器和键盘,登录 PVE 命令行,编辑
- Q:物理直通后,TrueNAS 报 ZFS 读写错误?
- A: N100 小主机很多使用的是廉价的 PCIe 协议转换芯片(例如 M.2 转 4 盘位 SATA 或者某些低端 NVMe 固态)。如果直通后出现不稳定的读写报错,建议回退到 RDM 裸磁盘映射 方案,让 PVE 宿主机的 Linux 内核驱动去和不稳定的硬件打交道,会比虚拟机直接控制更稳定。