老实说,想在PVE上把一颗Intel核显拆成多份,分给不同的虚拟机去硬解、去转码、去跑AI推理,过去真没有太多舒服的方案。SRIOV核显虚拟化这几年算是把这条路走通了,但网上教程要么只讲i915,要么一上来就是晦涩的内核补丁,很少有人把PVE上怎么切到新的xe模块、以及xe和i915两代驱动模块到底差在哪讲透。这篇就围绕这两个点展开:PVE开启SRIOV核显虚拟化,以及启用xe模块前后的完整过程,最后给一份两代模块的性能对比和踩坑记录。适合在PVE上做all in one、想给Jellyfin/Emby/Windows虚拟机共享核显的朋友参考,尤其是平台比较新、正在纠结到底该用哪个驱动模块的人。
1. 先把底层逻辑讲明白:核显SRIOV到底解决什么问题
1.1 三种核显共享方案,为什么SRIOV更值得折腾
在聊SRIOV之前,先回头看看PVE上共享核显的几种常见路子,这是我踩过不少坑之后才完全理清的。
第一种是QEMU软件虚拟显示。这种方案纯粹靠CPU去模拟一个显卡,Guest里看到的显示设备连真实的GPU硬件都接触不到,更别说调用Intel Quick Sync Video(QSV)硬编解码了。用它可以装个系统、看看桌面,但一跑转码任务就原形毕露,CPU直接被打满,画质和速度都完全不能看,基本只能用来应急。
第二种是Intel GVT-g。这是Intel在五六代到十代酷睿时代主推的核显虚拟化方案,通过内核里的kvmgt/gvt模块把物理GPU拆成几个虚拟GPU实例。这个方法在旧平台(比如i5-8400、i7-9700K)上确实成熟,PVE里配置也简单,但问题在于:从11代Rocket Lake开始,Intel基本放弃在PC平台继续完善GVT-g了,新核显驱动(i915的新版本以及xe模块)里根本没有可用的GVT-g支持,你在新平台上折腾GVT-g大概率是浪费时间。
第三种就是本文的主角SRIOV(Single Root I/O Virtualization)。这个技术的本质是把一个PCIe物理设备(Physical Function,PF)直接拆成多个独立的虚拟设备(Virtual Function,VF),每一个VF对虚拟机来说就是一个独立的PCIe设备,可以直接直通到Guest里。SRIOV的好处在于:性能接近物理直通,硬解、硬编、低延迟调用都能保留;多个虚拟机可以同时共享一颗核显;而且它是PCIe设备层面的标准能力,不需要像GVT-g那样在驱动层做复杂的图形上下文模拟。
对我们搞PVE的人来说,SRIOV最实际的价值就是:一颗UHD 770,在保证宿主机正常干活的前提下,还能切出四五个VF,分别给Windows下载机做硬解、给Jellyfin做转码、给某个Linux容器跑视频分析,互不干扰。
1.2 跑SRIOV的硬件门槛其实不低
很多朋友看完大佬的视频,兴冲冲打开PVE,结果发现连sriov_numvfs这个文件都找不到,原因多半是硬件不满足条件。
第一个门槛是CPU和核显型号。Intel从11代Rocket Lake开始,在部分核显上引入SRIOV能力,但真正好用、被社区普遍验证的平台是12代Alder Lake以及之后的Raptor Lake,特别是带UHD 730/UHD 770的桌面处理器(比如i5-12500、i7-12700、i5-13400这种不带F后缀的型号)。到了Meteor Lake和Lunar Lake这一代,核显换成Xe架构,SRIOV的支持变得更正规,PXE版驱动也开始配合新模块。还有一类是N100/N305这类低功耗平台,不少工控板也能开SRIOV,但因为主板BIOS定制得太厉害,能不能开出VF还得看运气。需要注意的是,AMD的核显(包括Ryzen 7000/8000系列的RDNA核显)虽然也有对应的虚拟化方案,但和Intel这套SRIOV核显路径完全不是一回事,不要混着看。
第二个门槛是主板。SRIOV需要主板BIOS里提供“SR-IOV”这个开关选项,而且很多消费级主板把这个选项藏得很深,有的甚至根本没有。比如我手里这块B660M主板,BIOS更新前压根看不到SR-IOV字样,更新到最新固件后才在“PCIe子系统设置”里翻出来。另外VT-d(Intel VT for Directed I/O)必须开启,这就是IOMMU的基础。新平台还建议把“Above 4G Decoding”和“Resizable BAR”打开,虽然不强制,但对设备枚举和后续直通的稳定性有帮助。
第三个门槛比较隐蔽,就是显示输出依赖。SRIOV把核显拆成PF和VF之后,PF在系统中依然存在,但很多主板的核显显示输出功能会和SRIOV冲突,导致宿主机接在核显上的显示器黑屏。这就要求你的PVE服务器最好是无头(headless)模式或者有一块独立的亮机卡,日常靠SSH和Web管理,否则开启SRIOV后画面没了会非常被动。这一点放在后面实操部分细说。
1.3 软件前提:PVE版本、内核与驱动模块
硬件达标之后,软件的坑也不少。PVE的内核版本直接决定你能不能用上xe模块。早期PVE 7.x基于5.15内核,连完整版的SRIOV补丁都费劲,不建议折腾。从PVE 8.2开始,官方内核升到6.8,xe模块在6.8里已经正式合入;PVE 8.4以及9.x系列使用的内核更高(6.12或6.14),xe模块对Meteor Lake之后的平台支持已经算稳定,SRIOV相关能力也逐渐从实验走向可用。
所以我的建议很简单:想走SRIOV + xe这条路,PVE至少保证8.4,最好直接用PVE 9.x。如果机器上已经有PVE 8.x在跑关键业务,升级前先在测试环境把内核换了,用一段时间确认稳定性再动正式机。
驱动模块方面,Linux内核里目前有两套Intel GPU驱动的实现:老牌的是i915,从Linux诞生早期一路维护到现在,支持面非常广;新的是xe,2024年Linux 6.8合入,目标是作为Intel新架构GPU的未来主力驱动。两者在一部分新平台上会“抢设备”,Alder Lake和Raptor Lake默认由i915接管,Meteor Lake之后的硬件在较新内核里由xe接管。如果你特别想在新平台上用xe,又遇到i915抢先绑定,就需要手动干预——这个冲突怎么处理,实操章节会给出完整命令。
2. 实操前先把环境核对清楚,BIOS这四项必须开
2.1 确认核显型号和PCI地址
动手前先记录三个关键信息:CPU型号、核显PCI地址、设备ID。登录PVE的SSH执行:
lscpu | grep "Model name" lspci | grep -i vga lspci -n -s 00:02.0正常Intel桌面平台核显都挂在0000:00:02.0这个地址,设备ID会被打印成类似8086:4680(这是Alder Lake UHD 770的典型ID),Meteor Lake核显的设备ID则是7d45之类的。记下设备ID非常重要,后面如果要用xe.force_probe强制xe接管核显,必须要用这个值。
如果你执行lspci | grep -i vga看到的不是Intel设备,而是NVIDIA或AMD显卡,那表明核显在BIOS里可能被禁用,或者主板的Primary Display设置优先指向了独显。SRIOV核显虚拟化的前提是核显在系统中可见,所以这一步先要确保VGA列表里能看到Intel显示设备。
2.2 BIOS四项关键开关,一次性开齐
这一步是决定成败的分水岭,少一个开关后面都会以各种诡异方式报错。以我手头这块B660M主板为例,这几项分别藏在不同的菜单里:
- VT-d(Intel Virtualization Technology for Directed I/O):一般在Advanced > CPU Configuration或System Agent Configuration里。有些主板叫VT-d,有些叫Intel VT-x with Directed I/O,本质一样。没有VT-d,IOMMU就是空中楼阁,直通和SRIOV都无从谈起。
- SR-IOV(Single Root I/O Virtualization):通常在Advanced > PCIe Configuration下,有的BIOS要更新后才出现。如果找不到,先检查是否开启了UEFI启动模式、关闭CSM,因为SRIOV选项在Legacy模式下经常被隐藏。
- Above 4G Decoding:一般在Advanced > PCI Subsystem Settings里。这个开关允许系统枚举64位PCI地址空间,对VF这类动态出现的设备很友好,推荐打开。如果和Resizable BAR一起出现,也可以一并开启。
- Primary Display/Init Display First:设置成iGPU或者IGFX,确保核显作为初始显示设备被系统固件正常初始化。如果你的机器带独显,这个设置有时候会变成IGFX + PEG之类的组合选项,照着手册把Primary设成核显即可。
BIOS里还有个很容易被忽略的点:如果主板开启了CSM兼容模式,强烈建议切回纯UEFI。SRIOV设备在Legacy引导下经常出现分配不到地址空间的问题,PVE本身也是纯UEFI更省心。
2.3 确认IOMMU已经生效
BIOS设置完,进入PVE系统后先别急着加载模块,确认IOMMU状态。
dmesg | grep -i -e DMAR -e IOMMU如果输出里出现DMAR: IOMMU enabled类似的日志,说明VT-d已经生效。如果你之前PVE是默认安装的,大概率没有在grub里写intel_iommu=on,那就需要先加内核参数。编辑/etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"然后执行update-grub并重启。这里我建议直接带iommu=pt,它的作用是让IOMMU工作在pass-through模式,常规IO路径上能减少一层DMA翻译开销,虽然对核显SRIOV来说影响没有网卡直通那么明显,但既然都到这一步了,参数一并加上不留隐患。
重启后再看dmesg,顺便用ls /sys/kernel/iommu_groups/确认IOMMU group已经创建。如果能看到类似0000:00:02.0的设备被独立放入某个group,说明环境已经满足直通的基本要求。
3. 正式启用SRIOV,并让xe模块接管核显
3.1 先处理i915和xe的驱动竞争关系
环境准备好之后,下一步就是让正确的驱动模块接管核显。这里要分情况讨论,因为不同平台的默认驱动不一样。
如果你的平台是Meteor Lake或更新,新内核下默认就会绑定xe模块,走到lsmod | grep xe大概率能看到xe已经加载,此时不需要额外force probe,直接跳到3.3生成VF。
如果你的平台是Alder Lake或Raptor Lake(也就是12代/13代酷睿这一大批主流平台),默认情况下i915会先抢到核显。可以用下面命令确认当前绑定状态:
lsmod | grep -E 'xe|i915' lspci -k -s 00:02.0如果输出显示Kernel driver in use: i915,而你想切到xe,通常有两条路。
第一条是动态切换,适合临时测试:
modprobe -r i915 modprobe xe但这条路的坑在于,i915不一定能被卸载。如果PVE宿主机上用核显做了显示输出,或者efifb/simplefb这类固件framebuffer驱动占着设备,modprobe -r i915会提示Device or resource busy。我试过几次,基本都是被efifb拖住,只能重启并在内核参数里做静态切换。
第二条是改内核参数,也是一劳永逸的方式。为了屏蔽i915对设备的绑定,同时让xe接管,按下面的方式操作。先创建modprobe黑名单:
echo "blacklist i915" > /etc/modprobe.d/blacklist-i915.conf再编辑/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT中加入(设备ID换成你自己lspci -n查到的值,感叹号表示禁止绑定):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt xe.force_probe=4680 video=efifb:off"注意video=efifb:off这一步,它会把固件framebuffer关掉,避免i915或xe加载时被efifb占着设备导致驱动初始化失败。这也是很多人在新内核上用xe时开机直接黑屏的“元凶”之一——不是模块错了,而是efifb和显卡驱动在抢同一个显卡设备。
然后刷新grub和initramfs:
update-grub update-initramfs -u -k all reboot重启后再次确认:
lspci -k -s 00:02.0正常情况下你会看到Kernel driver in use: xe,这就说明核显已经被xe接管了。
3.2 修改内核参数与加载模块
如果你不想用黑名单方案,也可以在grub配置里直接通过modprobe.blacklist=i915或i915.force_probe=!设备ID来阻止i915绑定。两者效果类似,但黑名单方案更简单粗暴,不容易受i915内部force probe逻辑影响,我推荐直接用黑名单方式。
另外,在生成VF之前,建议先把vfio-pci模块准备好,后面绑定VF要用:
modprobe vfio-pci这一步不是必须预先加载,但提前加载可以避免一会儿手工绑定VF时手忙脚乱。
3.3 显示VF数量并生成VF,确认设备列表
一切就绪后,进入核心操作。先看看硬件最多支持多少个VF:
cat /sys/class/drm/card0/device/sriov_totalvfs如果文件存在并返回一个数字(常见的有4、7、8),说明硬件和BIOS都认可SRIOV。如果ls /sys/class/drm/card0/device/下根本看不到sriov_totalvfs,那大概率是某个BIOS开关没开,或者硬件本身不支持。
生成VF的方法非常简单:
echo 7 > /sys/class/drm/card0/device/sriov_numvfs这个命令的意思是让PF动态创建7个VF。执行完立刻查看:
lspci | grep -i "Virtual Function"你会看到类似这样的输出:
00:02.1 Virtual Function (rev 0x0c) 00:02.2 Virtual Function (rev 0x0c) ... 00:02.7 Virtual Function (rev 0x0c)看到这些VF,说明SRIOV拆分已经成功。首次测试建议只写1个VF,确认虚拟机直通和驱动都正常后,再扩大数量,避免一开始就切出7个VF结果驱动装不上,反而分不清是哪一环的问题。
3.4 把VF绑定到vfio-pci并直通给虚拟机
设备枚举出了,但PVE要直通的设备必须和vfio-pci驱动绑定,否则虚拟机启动时会报设备正忙。我刚才说了先modprobe vfio-pci,然后逐个绑定:
for vf in 0000:00:02.1 0000:00:02.2 0000:00:02.3 0000:00:02.4; do echo "$vf" > /sys/bus/pci/drivers/vfio-pci/bind done需要注意,如果某个VF已经被xe或i915驱动自动绑定(在某些内核版本中会出现),需要先解绑再绑定到vfio-pci。上面这套命令是最基本的方向,如果碰到“Device or resource busy”再用类似如下的方式先unbind:
echo 0000:00:02.1 > /sys/bus/pci/drivers/xe/unbind echo 0000:00:02.1 > /sys/bus/pci/drivers/vfio-pci/bind绑定完成之后,打开PVE虚拟机的硬件配置界面,添加PCI设备,选择你要直通的VF地址(比如0000:00:02.1),注意勾选“PCI-Express”选项。虚拟机固件方面强烈建议使用OVMF(UEFI)而不是SeaBIOS,因为新显卡驱动和UEFI GOP的关系更稳定,SeaBIOS下经常出现设备识别了但驱动装不上的情况。
还有个小细节,在VM配置文件中建议加上rombar=0。核显VF通常没有独立的Option ROM,开启rombar反而可能造成PCI配置空间读取异常,导致VM启动阶段卡死。PVE的Web界面没有直接暴露rombar选项,需要手动编辑/etc/pve/qemu-server/<vmid>.conf,在hostpci那一行末尾加上,rombar=0。
3.5 虚拟机内驱动安装与硬解验证
VF直通进虚拟机之后,虚拟机内看到的是一块标准PCIe显卡设备,但还需要正确安装驱动。
Windows虚拟机方面,设备管理器里大概率会先显示为“3D视频控制器”或“Microsoft基本显示适配器”。到Intel官网下载对应核显的驱动包安装即可。如果用的是12/13代核显,建议直接找Intel Iris Xe Graphics相关驱动;Meteor Lake之后则用Intel Graphics Driver for Windows系列。装好后设备管理器里能看到显卡正常工作,用任务管理器或者GPU-Z确认硬件ID和显存容量正常,就说明SRIOV直通成功。
Linux虚拟机方面(以Debian/Ubuntu为例):
apt install intel-media-va-driver-non-free vainfo vainfovainfo能正常列出一堆VAAPI profile,比如H264、HEVC、VP9,说明硬解接口已经通。再用ffmpeg做一次硬解验证:
ffmpeg -vaapi -hwaccel vaapi -hwaccel_output_format vaapi -i input.mkv -c:v hevc_vaapi -b:v 5M output.mkv如果转码进程里GPU占用能起来,说明VF的硬编能力确实被用上了。
4. xe模块和i915模块,性能和使用体验到底差在哪
4.1 血统不同:i915是老将,xe是新架构
这一节回到标题里的核心对比。不少人把xe和i915理解成“两个版本驱动选新不选旧”,其实它们不是简单的版本关系,而是两代不同思路的驱动实现。
i915模块从Linux内核远古时期就存在,负责从老的Intel GMA一直到Rocket Lake、Alder Lake、Raptor Lake的显卡,代码体量巨大,兼容的设备ID数以百计。也正因为它要兼顾太多旧平台,驱动内部充满了各种workaround和芯片特判,维护起来非常吃力。i915对SRIOV的支持其实是从5.14左右开始实验性引入的,需要在grub里写i915.enable_guc=3和i915.max_vfs=7才能打开,而且只对部分Alder Lake平台真正好用,整体属于“补丁式”功能。
xe模块则完全不同,它是Intel从2023年开始开发的新一代显卡驱动,2024年进入Linux 6.8主线,后续6.9、6.10、6.12一路快速迭代。它的目标非常明确:服务Meteor Lake及以后采用Xe架构的核显和Arc独显,在设计之初就把SRIOV这类虚拟化特性当作一等公民,而不是后续加补丁。所以从代码体质上说,xe对SRIOV的支持更系统,对新平台的内存管理、调度、固件交互也更贴合新硬件的真实需求。
4.2 同平台同一颗UHD 770,转码性能实测
性能对比不能光看驱动“血统”,我直接用同一台机器做过测试。平台是i5-12500,核显UHD 770,PVE宿主内核6.12,测试方法是把同一份4K H.264的素材转成HEVC,分别用i915和xe驱动跑,虚拟机内安装Linux和intel-media-driver,调用QSV硬编。
先说结论:在同一代核显下,两者转码fps几乎没有本质差别。i915驱动下HEVC编码大概是120fps左右,xe驱动下大概是118fps左右,差距在3%以内甚至可能就是测试误差。CPU占用率也没有明显的差异,毕竟真正干活的是GPU内部的编解码单元,驱动负责的是指令下发和内存管理,只要驱动没有明显bug,同硬件同编码器下性能就不会天差地别。
不过有一个方向差别明显:Meteor Lake及更新平台上的AV1硬件编码,i915在多数场景下直接不提供支持或者很残缺,xe则把AV1编解码作为核心能力之一。所以如果你的核显是Meteor Lake之后的产品,又想用上AV1硬编,xe几乎是唯一正路。
4.3 SRIOV能力和使用体感对比
性能差不多不代表两者在SRIOV体验上也没差别,恰恰相反,这里才是i915和xe分水岭最明显的地方。
i915的SRIOV在Alder Lake上需要依赖i915.enable_guc=3、i915.max_vfs=7这类参数,而且生成VF后经常会遇到Windows虚拟机里驱动装不上的情况。社区里有不少人都遇到过:VF枚举出来了,设备管理器也识别了,但一装驱动就报代码43。我自己也踩过,最后发现是i915在SRIOV场景下对GUC(Graphics微控制器)的固件交互不够稳定,稍微动一下固件版本就出问题。
xe的SRIOV在Meteor Lake之后的实现要干净得多。生成VF仍然走标准的/sys/class/drm/cardX/device/sriov_numvfs接口,VF创建后各设备之间隔离更彻底,Windows驱动识别成功率明显更高。而且xe本身对GUC固件的管理是写在设计里的,不太会出现i915那种靠内核参数堆出来的临时状态。
如果非要量化差距,我个人的感受是:同平台同硬件下,Alder Lake用i915开SRIOV,驱动稳定率可能只有50%;切到xe之后(即使通过force_probe强制接管),稳定率能到80%。当然这个数字没有实验室背景,完全是个人体感,但方向上不会错。
4.4 稳定性和社区生态,怎么选模块更合适
新驱动不代表每个版本都稳定。xe模块在6.8刚合入时确实有不少问题,比如某些平台挂起唤醒异常、GUC固件请求失败、与特定主板BIOS的SRIOV交互冲突。到了6.12/6.14时代,这些问题大部分被修复,但如果你执着于PVE老版本自带的6.5内核,那xe基本和你无缘,老老实实i915。
生态方面,i915作为默认驱动多年,遇到问题随便一搜都有大量讨论和答案。xe虽然新,但Intel社区的投入明显在加快,很多新平台报bug后一两个内核版本就能修复。我的判断标准很简单:如果你的硬件属于i915的舒适区(11代、12代、13代酷睿),又不想折腾,保持i915完全没问题;如果新买了Meteor Lake或更新的平台,或者你就是想拿SRIOV搞正经虚拟化,直接切xe,不要留恋旧驱动。
另外还有一个务实的选择:PVE系统里其实可以同时安装两套驱动,启动菜单用不同的内核参数来区分启动模式。我在调试阶段就是这么做的——grub里做一个“i915模式”菜单项和一个“xe模式”菜单项,先在i915模式下确认硬件正常,再切到xe模式测SRIOV,调试效率高很多。具体实现不复杂,在/etc/grub.d/40_custom里复制一份menuentry,改一下GRUB_CMDLINE_LINUX即可。
5. 常见问题和排查实录
5.1 写不进sriov_numvfs,提示Device or resource busy
这个问题排在第一位,因为太常见了。我遇到次数最多的情况是BIOS没开SR-IOV开关,或者核显正在被某个驱动占用。排查顺序建议如下:先确认cat /sys/class/drm/card0/device/sriov_totalvfs有没有返回数字,没有就回BIOS;有数字但写入busy,多半是驱动占用了设备,检查lspci -k -s 00:02.0看是不是被i915/xe之外的其他驱动(比如vfio-pci)绑定,如果绑定了先unbind。
还有一种情况是内核参数里没开iommu=pt,IOMMU和SRIOV在部分固件实现上会打架。加上iommu=pt重启,很多写在sriov_numvfs时的busy问题会自动消失。
5.2 lspci能看到VF,但虚拟机里不识别
VF在宿主机lspci能看到,说明拆分成功,问题基本出在直通环节。第一步检查VF是否被vfio-pci绑定,如果还是xe或默认驱动,虚拟机当然拿不到。第二步检查VM固件,改成OVMF,同时确认hostpci设备配置了pcie=1和rombar=0。第三步确认虚拟机操作系统里装了匹配的Intel驱动,Windows下尤其注意不要装旧版本,直接去Intel官网下最新的核显驱动包,有些旧驱动对VF设备会直接装不上。
5.3 直通后宿主机没有画面了
这个问题我在文章开头就预警过。SRIOV开启后,核显的显示输出引擎和VF分配在部分主板上会互相干扰,宿主机接在核显上的显示器可能直接黑屏。解决思路有几条:第一,PVE服务器本来就靠SSH管理,黑屏不影响业务,可以不管;第二,给宿主机加一块便宜的独显,BIOS里把Primary Display设成PEG,让核显专门做SRIOV拆分;第三,如果没有独显条件,尝试在BIOS里把“iGPU Multi-Monitor”或“Render Standby”打开,部分主板能兼顾显示输出和SRIOV共存。
5.4 转码有画面但明显很卡,CPU占用反而高
这种情况多半是虚拟机里没有真正启用硬解,ffmpeg/Jellyfin回退到了软件转码。先在虚拟机内执行vainfo确认VAAPI可用,再检查转码命令里是否显式指定了-hwaccel或-c:v hevc_vaapi。Jellyfin里还要注意不要把“启用硬件解码”和“启用硬件编码”搞混,两个开关都打开才算完整。另外一个容易被忽略的点是VF直通后,虚拟机内的驱动可能把GPU当成了纯计算设备,没有正确注册显卡渲染节点,导致编码走了回退路径。解决办法是更新虚拟机内的Intel驱动到最新,并确认/dev/dri下有两个以上节点(renderD128等)。
5.5 开机后VF消失,需要手动重建
这是所有SRIOV方案的“日常”问题。模块重载、PVE重启后,sriov_numvfs会被清零,VF需要重新生成。如果你只是自己在Web界面试试,手动重建就行,但生产环境建议写一个开机自启脚本。我现在的做法是写一个systemd service,Order在multi-user.target之后,执行顺序是:加载xe(或i915)模块,写入sriov_numvfs,sleep几秒等待设备枚举,然后把指定VF绑定到vfio-pci。脚本里加个日志输出,放在/etc/systemd/system/sriov-setup.service,调试起来一目了然。这样每次PVE重启,VF都能自动恢复,虚拟机无需人工干预就能重新拾起直通设备。
6. 一点个人经验与扩展思路
折腾完这一整套SRIOV + xe之后,我最大的体会是:核显虚拟化最难的从来不是命令本身,而是平台之间的细微差异。同一颗i5-12500,在别人主板上一个参数就出VF,换了一块主板可能就要翻BIOS隐藏菜单、调CSM、关掉核显多显示器。所以收到货以后不要急着照抄别人的命令,先花半小时把BIOS选项和内核日志对齐,再往下操作,能省一整天的折腾时间。
另一个比较有价值的经验是,如果你打算长期跑虚拟机硬转码,建议把整个PVE宿主的内核和firmware保持最新。Intel的GUC固件是和内核驱动配套的,很多时候SRIOV不稳定不是驱动问题,而是固件版本太老。运行apt update && apt full-upgrade顺便更新固件包,很多玄学问题在重启之后就消失了。
最后再分享一个小技巧:SRIOV切出来的VF并不一定要全部直通给大虚拟机。你完全可以留一个VF给某个LXC容器,配合/dev/dri的挂载,让容器里的Jellyfin或者FFmpeg直接走硬件转码,比多套一层虚拟机更轻量。我自己就是把第一个VF直通给了Windows,第二个VF绑定到一台Debian容器里做媒体转码,两个业务互不干扰,宿主机CPU占用常年保持在个位数。
这套方案后续还可以往下游扩展,比如给虚拟机里的AI推理任务预留一个VF,用OpenVINO或oneAPI跑轻量模型。只要内核和固件维护得当,SRIOV核显虚拟化的稳定性完全能支撑长期运行,值得投入时间把它调顺。