[心得] AMD内显Passthrough踩坑心得

楼主: NCTUFAIWEN (交大废文王子)   2025-12-02 23:38:32
前言
小弟有组一台黑X晖的NAS
因为所需服务都已经找到替代的开源方案,好像也没有理由再继续用黑X晖了
再加上上次手贱点个升级结果系统挂点==,花几个小时才修好
想了想还是转往Proxmox + TrueNAS的方案比较安心
因此在拆掉前来记录兼分享下在黑X晖平台上玩的VMM内显直通方案
*先声明本篇没有要推广黑X晖,相反的想在这上面搞些有的没的真的麻烦超级多
还有整个过程在其他KVM环境也都通用,非限制于黑X晖才可用
以下正文开始
我的平台是AMD Ryzen3 5350GE + Asrock B450m Pro4 + 40G ECC RAM
(往回翻的话这张消费级主板已经24/7服役进入第七年惹 周边都换一轮剩他还在 真的妖)
周边有张4 port HBA卡跟10G光口洋垃圾网卡
硬盘共4颗HDD/2颗SATA SSD/1条NVME SSD当cache
这样的组合常驻功耗大概落在90-100W之间
https://imgur.com/42WV9JU
https://imgur.com/5nrxrrL
https://imgur.com/I1nvXee
https://imgur.com/hgRg5F5
https://imgur.com/yK0ELMQ
https://imgur.com/lyCszeC
帐面配置怎么看这颗CPU只跑NAS实在是大材小用
因此也在黑X上额外跑了Ubuntu跟Windows虚拟机
玩到这边其实跑得顺风顺水,也算榨干了整个系统的资源...吗?
并没有XDD,想折腾的心是无穷的,看着白花花银子买来的iGPU被晾在那就觉得不太爽
加上NAS是放在电视旁,想让Windows虚拟机可以直接显示输出到电视上
做到用电视看各种直播/影片,甚至是远端PC来大萤幕玩游戏的骚操作
所以就有了以下直通内显的曲折过程
‧黑X晖VMM如何做到PCI Passthrough
虽然底层是KVM ,但显然VMM接口是不可能会串直通功能的,要做到大概就两种做法:
a. 直接改虚拟机的xml设定
b. 用指令"virsh attach-device"直接把device分配给某台虚拟机
a作法就我所知是行不通,VMM似乎有自己维护的虚拟机设定档,每次VM开机都会盖掉xml
正解是b做法:
1. 先把device unbind
echo "0000:${DEVICE}" > /sys/bus/pci/devices/0000:${DEVICE}/driver/unbind
那个${DEVICE}是PCIe device的vendor:product值 可以从lspci看到
2. 将想要分配出去的PCI device按照kvm所需格式填写xml档
https://imgur.com/fP8KJaZ
3. 把PCI device分配给VM
virsh attach-device ${VM_NAME} *.xml
但这方法也不是很完美,因为每次VM重开机都要自行去执行一遍这个步骤
不过可用就是了
‧IOMMU Group的坑
PCI Passthrough是以IOMMU Group为单位,因此如果你想直通的device分到的Group很糟
(例如这个Group内存在超多device) 那就头很痛了
可以用类似这种script来检查看看:
https://gist.github.com/jabbas/a8785710a5e8655045fc0be67385e887
一般来说Group分配太烂可以尝试去BIOS打开ACS Enable选项,会好很多
然而惨的是Asrock B450m Pro4这张板子在使用5系列Ryzen的时候,这选项被阉掉了...
原因也很简单,这么老的板子要支援更多AM4 CPU能做的也只有砍功能这一步
才能塞进去这么小的BIOS内 (都支援5代了也不忍苛责XD)
只能说AM4产品周期长是好事,但也是有意想不到的副作用QQ
到这边几乎觉得是死局了...
但!!直到找到这篇讨论:
https://www.reddit.com/r/ASRock/comments/pfza16/deskmini_x300_bios_with_acs_enable/
在Asrock B450F的某版本BIOS开启PCIe ARI选项也可以跟ACS选项同样有好的Group分配
用相应AGESA版本的BIOS刷到B450m后就成功啦!
正常的结果应该如下:
https://imgur.com/3zeUbbi
可以看到目标的VGA compatible controller单独在Group 13
只能说妖板不愧是妖板
BTW这资讯看起来还是寄信去Asrock原厂问到的 连这种小众的需求都愿意回真的太棒惹
╰(⊙Д⊙)╮佛心公司╭(⊙Д⊙)╯佛心公司
‧AMD GPU Passthrough的坑
用上面的作法依样画葫芦把AMD iGPU passthrough之后进到Windows始终显示Error 43
首先有个怀疑的点: virsh attach-device时间点太慢了
由于这指令必须要在VM开机后才可以下 从按下开机到attach都跑过BIOS了可能真的太晚
有找到可以在KVM START阶段hook并且执行attach的方案:
https://github.com/sramshaw/pci_coral_on_synology
魔改一下后就成功在BIOS前把iGPU attach上去了!
但还是Error 43,可拨QQ
再来网络上对于AMD iGPU的直通其实也满多资讯惹,很多作业可以抄
(虽然几乎都是Proxmox 但反正底都是KVM没差)
总结大概有几个问题待解:
1. GPU直通时要顺便带vbios
2. 直通给Windows要顺便把CPU的Audio直通过去 并且代AMDGopDriver
3. AMD Reset Bug
1/2要用一些tool把你当前iGPU的vbios跟AMDGopDriver导出来
或是可以去这边翻看看有没有相应型号的可以直接下载来用:
https://github.com/isc30/ryzen-gpu-passthrough-proxmox
并且在做virsh attach-device时的xml里面要顺便带rom这个参数进去
此时Windows VM进去就不会Error 43了,到此算是完成惹~
https://imgur.com/YlNepUN
剩下一个AMD Reset Bug比较讨厌,可以安装这个Service:
https://github.com/inga-lovinde/RadeonResetBugFix
它的作用是在Windows VM关机时会正常的把GPU关闭,等到下次VM开机时才可以正常init
但如果VM被强制关机或reboot那就没救了(e.g. 蓝屏)
只要上次GPU没有正常关闭那颗GPU就再也没办法被使用了,只能reboot host
另外我的经验是如果确定上次VM有正常关机但还是Error 43
可以直接重装GPU Driver并reboot VM,通常都能好
最后来看结果 Windows虚拟机可以直接HDMI连到电视 看实况YT都很顺
https://imgur.com/AlGlwVH
甚至透过10G内网远端到PC打个POE刷图都没问题
https://imgur.com/l1GINLY
就是画面有时候FPS会变低 这个需求CPU真的极限了XDD 解码速度上不去
另外,上面那些步骤实在太繁琐,小弟把此方案弄成一个简单的script:
https://github.com/jcchen7566/SynoPassthru
不算是很无脑的script需要花一点时间了解在干麻,但只要配置好deploy完就一劳永逸了
目前用这方案半年多,除了Reset Bug常踩到要重开机很讨厌之外真的满稳定的
谢谢大家收看

Links booklink

Contact Us: admin [ a t ] ucptt.com