外观
硬盘与 HBA 直通:NAS 虚拟机的正确做法
跑 TrueNAS、unRAID 这类需要直接管理物理磁盘的系统时,"该怎么把硬盘交给虚拟机"是最容易走弯路的一步。这篇把三种做法的取舍说清楚,并给出官方推荐的 HBA 整卡直通步骤。
为什么需要它
ZFS、unRAID 这类系统依赖读取磁盘的真实 SMART 信息和底层特性来判断盘的健康状况、做校验和故障排除。经过 PVE 虚拟磁盘层转发的盘,这些信息会被截断或失真。官方 Wiki 明确建议:需要这类系统时,直通整张 HBA 卡,而不是单块盘。
先比较三种做法
| 做法 | 客户机能看到什么 | 优点 | 代价 |
|---|---|---|---|
| 直通整张 HBA 卡(本文做法) | 完整的物理盘,含 SMART | 官方推荐,ZFS 等系统行为符合预期 | 需要一张独立 HBA,且它要在干净的 IOMMU 分组里 |
直通单块磁盘(qm set <vmid> -scsi1 /dev/disk/by-id/<磁盘ID>) | 一块虚拟磁盘,指向物理盘 | 不占直通名额,配置简单 | 拿不到 SMART 信息,ZFS 的部分特性受影响,不建议给 NAS 系统用 |
| 宿主机管理磁盘,容器转发(宿主机建 ZFS 池,LXC 跑 Samba/NFS) | 不涉及直通 | 最简单,宿主机能统一监控磁盘健康 | 客户机系统本身管不了盘,不适合就是要跑 TrueNAS/unRAID 的场景 |
如果目标就是"跑一个熟悉的 NAS 系统管理自己的盘",请继续往下看整卡直通;如果只是想让某个应用访问几个文件,参照加一块新盘在宿主机侧建存储更省事。
开始之前
- 需要一张独立的 HBA/RAID 卡,且是 IT 模式(直通模式,卡不做 RAID,把每块盘原样暴露)而不是 RAID (IR) 模式。部分 LSI/Broadcom 系列卡出厂是 RAID 模式,需要刷成 IT 模式固件——具体刷写步骤因卡和芯片型号而异,请对照该卡型号对应的厂商或社区刷机指南操作,刷之前确认清楚固件刷写失败时的恢复方式。
- 用读懂 IOMMU 分组的方法确认这张 HBA 卡在一个干净的分组里。
直通到系统盘所在的控制器,会让宿主机自己起不来
影响范围:如果打算直通的这张 HBA(或它所在的 IOMMU 分组)恰好也控制着宿主机自己的系统盘,直通之后宿主机在下次启动或这台虚拟机启动时会失去系统盘访问,导致宿主机异常。
前置条件:
- 用
lsblk或findmnt /确认宿主机系统盘(挂载了/和/boot)连在哪一个控制器上,确保和准备直通的 HBA 不是同一张卡、也不在同一个 IOMMU 分组。 - 有物理控制台或带外管理方式。
- 已有
/etc/pve和虚拟机配置的备份。
回退方法:拔掉本文创建的 /etc/modprobe.d/vfio-hba.conf,执行 update-initramfs -u -k all 后重启,HBA 会还给宿主机原来的驱动(通常是 mpt3sas、megaraid_sas 或类似名称)。
操作步骤
1. 确认 HBA 的 PCI 地址
sh
# 宿主机 shell
lspci -nn | grep -Ei 'sas|raid|scsi'记下地址(例如 03:00.0)和方括号里的 厂商ID:设备ID。
2. 让宿主机放开这张卡
sh
# 宿主机 shell,ID 换成上一步记下的值
echo "options vfio-pci ids=1000:0097" > /etc/modprobe.d/vfio-hba.conf这一步会让宿主机立刻失去这张卡控制的所有磁盘
sh
# 宿主机 shell
update-initramfs -u -k all
reboot重启后,lsblk 应该看不到挂在这张 HBA 上的盘了——这是预期结果,说明卡已经从宿主机脱离,交给了 vfio-pci。如果这些盘之前被宿主机的存储(比如某个 ZFS 池)用到,相应存储也会在宿主机上消失,操作前确认这一点已经在你的计划之内。
3. 确认绑定成功
sh
# 宿主机 shell
lspci -nnk -s 03:00.0Kernel driver in use: 应显示 vfio-pci。
4. 把 HBA 加进虚拟机
Web UI:虚拟机 → Hardware → Add → PCI Device,选中这张卡,勾选 "PCI-Express"(机型是 q35 时)。这类卡不需要勾 "Primary GPU"。
检查结果
- 在 NAS 虚拟机内部(比如 TrueNAS 的磁盘列表),能看到物理盘的型号和序列号,和宿主机之前
lsblk看到的一致。 - 客户机内
smartctl -a /dev/sdX能读到完整的 SMART 数据——这是判断"真直通"和"转发的虚拟磁盘"的关键区别,转发的虚拟磁盘通常拿不到完整 SMART。 - 宿主机
lsblk确认不再显示这些盘。
常见问题
直通之后宿主机 lsblk 还能看到这些盘。 说明 HBA 没有真正被 vfio-pci 接管,仍被原驱动占用,回去检查第 2、3 步。
要不要用单盘直通代替整卡直通? 只在盘数很少、且不打算跑对 SMART 敏感的系统(比如只是用 Samba 转发几个文件)时考虑,跑 TrueNAS/unRAID 这类系统请用整卡直通。
以后想给 ZFS 池扩容或换盘。 直通只是把硬件交给了虚拟机,池本身的管理规则不变——ZFS 的 vdev 一旦建好,增删限制很多,规划容量时按 ZFS 自己的规则来,见 ZFS 入门。