FreeNAS虚拟机直通失败,大多数时候不是硬件坏了,而是BIOS设置、内核参数和虚拟机配置三个环节里有一步没走对。按顺序排查,多数问题能在半小时内解决。
FreeNAS虚拟机直通失败的常见原因
直通失败的报错五花八门,但底层原因高度集中,根据社区排障帖的统计,BIOS里虚拟化开关没开和设备被宿主机驱动占用这两类原因,占到了相当大比例。
确认主板BIOS里VT-d是否开启
FreeNAS底层是FreeBSD,直通依赖主板的IOMMU功能,Intel平台叫VT-d,AMD平台叫SVM IOMMU。
- 开机按Del或F2进BIOS
- Intel主板路径通常是:Advanced → CPU Configuration → Intel Virtualization Technology for Directed I/O,设为Enabled
- AMD主板路径通常是:Advanced → AMD CBS → NBIO → IOMMU,设为Enabled
- 部分服务器主板还要额外打开ACS开关,否则PCIe设备会被锁在同一个IOMMU分组里
改完保存重启,在FreeNAS Shell里执行:
dmesg | grep -i DMAR
看到DMAR: IOMMU enabled字样,说明BIOS这关过了。
查看CPU和主板是否支持IOMMU分组
行业共识认为,直通需要CPU和主板芯片组支持完整的IOMMU分组,近几年主流的Intel酷睿和AMD锐龙基本都支持,但部分入门级芯片组(如H410、A520)在PCIe拆分上做了限制。
在Shell里执行:
pciconf -lv
看每个设备前面的pcib编号,如果多个设备挤在同一个群组里,直通其中任何一个都会导致整个分组被隔离,另一个设备如果被宿主机占用,虚拟机就起不来。
FreeNAS直通设备被宿主机占用怎么释放
设备直通失败时,报错里面经常出现Device busy或者Resource unavailable,FreeNAS的Shell终端执行:
lspci -nnk
看Kernel driver in use这一行,如果显示的是igb、i40e、nvme这类驱动名称,说明设备正被宿主机占着不撒手。
把设备写进vfio-pci内核模块
FreeNAS/TrueNAS通过vfio-pci驱动接管要直通的设备,修改/etc/loader.conf文件:
vfio_load="YES" vfio-pci.ids="8086:1533,10de:1b81"
设备ID从pciconf -lv或者lspci -nn输出里获取,格式是“厂商ID:设备ID”,多个设备用英文逗号隔开。
比如显卡直通时,显卡本体和它的音频输出是两个设备,两个ID都要写进去,漏掉音频设备,显卡直通后声音就是哑的。
手工解绑驱动并绑定vfio
有些场景下配置文件不生效,需要手动解绑,在Shell里执行:
pciconf -r -a 设备编号
把设备从当前驱动那里摘下来,然后执行:
kldload vfio_pci
查看dmesg确认设备已归属vfio,注意,设备上有活动I/O操作时解绑会报错,先把存储池里的相关任务停掉。
FreeNAS显卡直通黑屏的解决步骤
显卡直通是公认的坑最多的场景,黑屏的排查顺序,先看显示输出通道,再看驱动匹配。
核显和独显的选卡差异
FreeNAS虚拟机做显卡直通时,如果宿主机只有一张独显且没有核显,这张卡一旦被直通进虚拟机,宿主机自己就没画面了,这是正常的,不是失败。
如果你用的是Intel核显直通,BIOS里要把Primary Display设为iGPU或IGFX,AMD平台则要留意Acpi6选项是否禁用,否则虚拟机启动时ACPI表会干扰显卡初始化。
显示协议与显卡直通的适配关系
FreeNAS虚拟机的显示协议设置为VNC时,直通显卡后虚拟机画面优先走VNC虚拟显示,直通显卡可能一直黑屏。
把虚拟机的显示类型改为“无”或“直通”,让画面直接从物理显卡输出。
部分NVIDIA显卡还要在虚拟机启动参数里加:
video=efifb:off
这个参数禁用UEFI的efifb框架缓冲,释放显卡的初始地址空间,不加这个参数,直通显卡的BAR空间可能被宿主机锁住,虚拟机一启动就黑屏或直接崩。
FreeNAS硬盘直通报错的常见原因
硬盘直通的报错分为两类,一类是设备正忙,另一类是控制器冲突。
设备正忙的处理方法
FreeNAS的Web管理界面里,如果硬盘已经被存储池接管,直通时必然报错,需要先到“存储” → “池” 里把这块盘所在的池导出或销毁,让磁盘退回未使用状态。
在命令行界面执行:
camcontrol devlist
看到磁盘设备编号后,确认它没有挂载点,再回虚拟机配置里添加PCI设备。
控制器直通和单盘直通的取舍
直通SATA控制器可以让虚拟机直接管理整块物理硬盘,性能损耗更小,但这意味着宿主机再也看不到这个控制器上的任何磁盘,系统盘如果放在这个控制器上,整个存储池都会消失。
相比之下,直通单个硬盘控制器下的磁盘,灵活性更高,代价是每次虚拟机关机后重连需要重新识别设备路径。
| 直通方式 | 性能损耗 | 灵活性 | 适合场景 |
|---|---|---|---|
| 直通SATA控制器 | 低 | 差 | NAS专用机,多盘直通 |
| 直通单个磁盘 | 中 | 好 | 测试环境,个别盘给虚拟机 |
| 虚拟磁盘文件 | 高 | 最好 | 日常虚拟机,不追求极致性能 |
直通失败后怎么验证修复结果
修改完上述配置,重启FreeNAS系统一次,确保vfio驱动在启动时就完成加载,然后到虚拟机管理界面启动目标虚拟机,观察启动状态。
看日志和设备归属
在宿主机Shell里执行:
dmesg | grep -i vfio
能看到设备被vfio驱动的认领记录,说明直通链路是通的,进入虚拟机系统后再执行:
lspci
确认设备出现在虚拟机内部,并且显示厂商和型号信息完整,设备显示为Unknown device时,多半是虚拟机里的驱动不匹配,需要在虚拟机系统里安装对应驱动。
直通网口的MAC地址注意
有相当一部分用户在直通网卡后发现虚拟机无法获取IP,原因在于FreeNAS默认占用了物理网卡的MAC地址,到“网络” → “接口” 里,把宿主机绑定的这个网口删掉,让MAC地址彻底释放。
FreeNAS虚拟机直通失败常见问题Q&A
FreeNAS虚拟机直通失败,BIOS设置没问题,设备还是报错怎么办?
先检查设备是否被宿主机的存储池或网络接口占用,再到/etc/loader.conf确认设备ID是否写错,设备ID以lspci -nn输出的括号内数字为准,大小写和冒号缺一不可,确认无误后重启宿主机,让vfio驱动在系统初始化阶段就完成设备接管。
直通显卡后虚拟机打不开,提示“没有可用设备”?
查看显卡的PCI设备编号是否在虚拟机配置的PCI设备列表里,如果显卡插在PCIe x16槽位但编号展示为0:0:0,说明IOMMU分组时地址识别异常,尝试把显卡换到另一个PCIe插槽,或者在BIOS里关闭Above 4G Decoding后重试。
直通的NVMe硬盘在虚拟机里不识别,但宿主机能看到?
NVMe硬盘在FreeNAS中如果被用作缓存盘或日志盘,即使没有正式加入存储池,也会有元数据占用,到存储管理页面确认该设备状态为完全空闲,同时注意英特尔的NVMe直通需要额外添加hw.pci.enable_msix=1到/etc/sysctl.conf,否则中断分配异常导致虚拟机无法枚举设备。
FreeNAS虚拟机直通失败的核心排查思路不复杂:先确认IOMMU层通不通,再确认设备归属权释放干净,最后验证虚拟机内部驱动是否匹配,按这个顺序走,能过滤掉八成以上的故障场景,直通本身不是高频操作,每次失败其实都在暴露底层配置的某个盲区,补上了,机器反而更稳。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/761901.html





