HOOOS

N100 四网口小主机:如何安全地将 NVMe 固态硬盘物理直通给 TrueNAS,同时保障 PVE 系统盘安全?

0 7 极客Homelab TrueNASProxmox VEIntel N100
Apple

在用 Intel N100 四网口小主机折腾 All-in-One(PVE + 软路由 + TrueNAS/群晖)时,很多玩家都会遇到一个核心痛点:如何把 NVMe 固态硬盘直通给 TrueNAS,同时绝对不能影响到 PVE 本身的系统盘?

由于 N100 只有 9 条 PCIe 通道,且多网口小主机的板载走线非常紧凑,IOMMU 分组(硬件隔离分组)往往比较混乱。如果操作不当,极易把 PVE 系统盘或者网卡一起直通进去,导致 PVE 宿主机直接失联崩溃。

本文将提供一份保姆级的安全配置指南,帮助你理清物理直通与虚拟映射的逻辑,确保 TrueNAS 拿到原生 NVMe 控制权的同时,PVE 稳如泰山。


核心避坑前置:你的硬件支持哪种“直通”?

在动手前,先明确你的硬件物理布局。N100 小主机通常有两种双盘方案:

  1. 方案 A(最推荐): PVE 系统装在 SATA 固态(或 TF 卡/U 盘)上,NVMe 固态专用于 TrueNAS 存储。
  2. 方案 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 硬件虚拟化。

  1. 修改 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
      
  2. 加载直通内核模块:
    编辑内核模块文件:

    nano /etc/modules
    

    在文件末尾追加以下四行内容:

    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd
    

    保存后,重启 PVE 小主机


第二步:精准定位 NVMe 硬盘的 PCIe 地址(防呆核心)

重启后,我们需要找出哪一个是你的目标 NVMe 盘,哪一个是你的 PVE 系统盘

  1. 在 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.002:00.0 就是它们的物理 PCIe 地址。

  2. 确认哪张盘正在承载 PVE 系统:
    输入 df -hlsblk,查看当前挂载在根目录 / 下的设备。例如,如果 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 网页端安全添加设备

  1. 登录 PVE Web 界面,找到你的 TrueNAS 虚拟机(假设 VM ID 为 101)。
  2. 依次点击:虚拟机 -> 硬件 -> 添加 -> PCI 设备
  3. 在设备列表中,根据你刚才记录的物理地址(如 0000:02:00.0),精准选择那个非系统盘的 NVMe 控制器。
  4. 勾选 “所有功能 (All Functions)”
  5. 不要勾选 “ROM-Bar”(对于某些非显卡设备,勾选 ROM-Bar 可能会导致虚拟机无法启动或引导卡死)。
  6. 保存。现在启动 TrueNAS 虚拟机,在系统内就能直接看到该 NVMe 的品牌、型号,并能读取完整的 S.M.A.R.T 数据了。

方案二:RDM 裸磁盘映射(退而求其次的安全方案)

如果你的 N100 小主机 IOMMU 分组实在无法拆分,或者你只有一块大 NVMe 固态,在上面分了区(一部分装 PVE,一部分想给 TrueNAS 做存储),那么绝对不能使用 PCIe 直通。此时,RDM 裸磁盘映射是唯一的安全解。

这种方式下,PVE 依然掌管着物理控制器,但它把整块盘(或某个分区)的读写权限毫无保留地“直连”给虚拟机,对 TrueNAS 来说,体验非常接近物理直通。

操作步骤:

  1. 获取目标硬盘的绝对唯一 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

  2. 用命令行将磁盘挂载给 TrueNAS 虚拟机:
    假设你的 TrueNAS 虚拟机 ID 是 101,我们想把它挂载为 scsi1(注意不要与已有的 scsi0 系统盘冲突):

    qm set 101 -scsi1 /dev/disk/by-id/nvme-Samsung_SSD_980_PRO_1TB_S6B0NL0W123456Y
    

    注意:请将命令中的 101 和磁盘 ID 替换为你自己的实际数据。

  3. 开启虚拟磁盘的 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 的那一行,重启宿主机即可恢复。
  • Q:物理直通后,TrueNAS 报 ZFS 读写错误?
    • A: N100 小主机很多使用的是廉价的 PCIe 协议转换芯片(例如 M.2 转 4 盘位 SATA 或者某些低端 NVMe 固态)。如果直通后出现不稳定的读写报错,建议回退到 RDM 裸磁盘映射 方案,让 PVE 宿主机的 Linux 内核驱动去和不稳定的硬件打交道,会比虚拟机直接控制更稳定。

点评评价

captcha
健康