本帖最后由 r-MT 于 2022-9-18 17:43 编辑
没有amd主板的请直接绕道,不想折腾amd机型的直接绕道
不会安装qnap的直接绕道,没有耐心的也请直接绕道
前段时间 有个网友不停折腾他的白鸡tvs-671的显卡直通来问我,很佩服他的耐心
忍不住手痒,也把amd的5700G核显也直通了一下
这里吐槽一下qnap官方,这次内核升级到5.10.60,
5.10内核配置里面有几个跟amdgpu相关的mm设置改为隐式了,默认no了,以及KALLSYMS_ALL默认也关闭了
不知道qnap官方有意还是无意,统统没有打开.
这样造成几乎所有qnap机型都不再支持amdgpu的显卡驱动了,除了TVS-X83机型。
TVS-X83机型的内核设定又有不少缺陷,无法完全发挥Ryzen的性能,tvs-x63更烂了,只支持raden。
那么有没有办法在qnap上
即发挥amd Ryzen的性能,又把核显给利用起来。
如果利用qnap的虚拟机把核显直通出来,也不失为一种曲线利用核显的办法。
当然还有一种办法,利用qnap的源码,把qnap一些隐藏的设定代码给找出来,
自定义编译自己的5.10.60-qnap的bzImage,也能完美驱动x77 x72 x82这些机型驱动amdgpu
我做了一些尝试,把amd官方22.10.50100-1395274版本的amdgpu驱动移植到qnap上,然后通过容器,
成功实现了opengl vulkan以及amf的编码等等,
当然这些不是本次主题。
言归正传吧
整个大体流程
1:提取核显vbios
2:修改model.conf nas_model.py pci.py强制使用核显的vbios.rom
3:修改grub.cfg以及相关bios设置,确保iommu分组成功
4:安装win10 安装amd驱动以及gpu重置补丁
除了驱动,所有涉及的文件我打包放在末尾
1.我的硬件配置
主板:MSI B450M MORTAR MAX, bios version 7B89v2G
cpu:5700G
内存:48G 频率2400
2.机型qnap ts-877
自行安装ts-877,版本5.0.0.1932 build 20220129以上
自行安装 虚拟机工作站 3.6.27
1.获取核显构架以及硬件ID以及子ID,提取核显vbios.rom
去https://pci-ids.ucw.cz/下载最新pci.ids覆盖掉本系统的pci.ids
qnap的在/usr/local/share/pci.ids
覆盖后执行一下
- /sbin/lspci -nn | grep VGA
复制代码
可以看到核显是amd 5700G 构架Cezanne 硬件ID[1002:1638]
- /sbin/lspci -nnv -d 1002:1638
复制代码
获得子ID[1002:1636]
id
构架Cezanne 硬件ID[1002:1638] ID[1002:1636] 备用
https://winraid.level1techs.com/t/tool-guide-news-uefi-bios-updater-ubu/30357
下载UBU_v1.79.17,解压
下载主板bios,比如我的微星B450M-MORTAR-MAX主板所用的bios版本7B89v2G
解压后E7B89AMS.2G1丢ubu解压目录
双击UBU.bat,会自动搜寻当前目录的bios,并读取展开
按任意键后输入2 进video菜单
输入S,提取vbios,01退出即可
ubu
当前目录下就会生成一个Extracted目录
把Extracted-VBIOS-017.010.000.030.000000目录的vbios_1638.dat提取出来改名成硬件ID+子ID.rom
也就是1002_1638_1002_1636.rom
文件名格式不能错,qnap会按此格式读取vbios的rom
在qnap的/share/CACHEDEV1_DATA/.qpkg/.QKVM/
注意QKVM前有个.号,新建一个romfile文件夹,把1002_1638_1002_1636.rom放进去
romfile
2.修改model.conf nas_model.py pci.py先把 Virtualization Station 停掉
/share/CACHEDEV1_DATA/.qpkg/QKVM/qvs/qvs/define/nas_model.pyc
/share/CACHEDEV1_DATA/.qpkg/QKVM/qvs/vms/models/pci.pyc
2个文件做个备份,然后反编译成py,具体自己百度或者使用我压缩包的对应Virtualization Station版本V3.6.27
放入对应目录
2.1修改model.conf,并重启
/sbin/lspci -tvnn
得到我的核显在0000:00:08.1上
修改你引导盘上的patch里面的model.conf里面的 改成[System PCIE SLOT 2]
DEV_BUS = B0008:F1- [System PCIE SLOT 2]
- DEV_BUS = B00:D08:F1
复制代码 打包重启后查看/etc/目录的model.conf确保修正成功
2.2修改nas_model.py
/share/CACHEDEV1_DATA/.qpkg/QKVM/qvs/qvs/define/nas_model.py
发现并没有我使用的TS-877机型,使用的是'TS-X77': {'default'
当然你也可以只改'TS-X77': {'default',或者新建个TX-877
我这里就把TS-877XU改成我的TS-877
- 'TS-877XU': {'pci_slots': [{'id': '0000:00:03.1', 'name': 'PCIe 1'}, {'id': '0000:00:03.2', 'name': 'PCIe 2'}, {'id': '0000:00:03.3', 'name': 'PCIe 3'}, {'id': '0000:00:03.4', 'name': 'PCIe 4'}], 'virtual_qts': True,
复制代码
改成
- 'TS-877': {'pci_slots': [{'id': '0000:00:01.1', 'name': 'PCIe 1'}, {'id': '0000:00:08.1', 'name': 'PCIe 2'}, {'id': '0000:00:03.3', 'name': 'PCIe 3'}, {'id': '0000:00:03.4', 'name': 'PCIe 4'}], 'virtual_qts': True,
复制代码
这里的pci_solts根据你主板实际填写 并跟model.conf配对好,后面的pcie3-4没有的话其实都可以删了
2.3修改/pci.py
/share/CACHEDEV1_DATA/.qpkg/QKVM/qvs/vms/models/pci.py
找到 def is_romfile_required(self):
conditions = [
NAS.GPU_ROM_CONDITIONAL_REQUIRED,
self.is_nvidia_video_card,
self.is_primary_card]
return all(conditions)
简单修改一下判断逻辑,添加2行
def is_romfile_required(self):
if self.is_romfile_exists:
return True
conditions = [
NAS.GPU_ROM_CONDITIONAL_REQUIRED,
self.is_nvidia_video_card,
self.is_primary_card]
return all(conditions)
3.修改grub.cfg,以及bios设定,确保iommu gruop分组成功
BIOS 里面
Re-Size BAR Support --enable
Above 4G memory/Crypto --enable
SR-IOV Support --enable
Initiate Graphic Adapter --IGD
Integrated Graphics --Force
UMA Frame Buffer Size --4G #根据自己内存大小自行修改
IOMMU --enable
DMA Protection --auto
DMAr Support --auto
SVM Mode --enable
NX Mode --enable
其他全是自动
UEFI启动 CSM 关闭
grub.cfg改成/boot/bzImage root=/dev/ram0 rw amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction pci=noats video=efifbff
- root=/dev/ram0 rw amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction pci=noats video=efifb:off
复制代码
重启
在qnap下执行
- for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf 'IOMMU Group %s ' "$n"; /sbin/lspci -nns "${d##*/}"; done;
复制代码
确保核显以及核显对应的hdmi声卡 在单独的iommu gruop里面,或者一组只有他们2个
4.qnap虚拟机安装win10 相关设定
4.1准备工作,下载amd驱动以及amd重置补丁
当然你也可以在win10初始安装时下载
amd驱动
https://www.amd.com/en/support/apu/amd-ryzen-processors/amd-ryzen-7-5000-g-series-desktop-processors-radeon-graphics/amd
我这里用的 22.5.2 Optional (WHQL)
下载备用
amd gpu win10重置补丁
https://github.com/inga-lovinde/RadeonResetBugFix
下载备用
4.2安装win10以及相关设定
先随便安装一个win10,带远程桌面方便调试,
我这里用的是win10-21h2专业版,先不要直通gpu
win10虚拟机设置里面,确保
cpu---passthrough
隐藏kvm虚拟机监控程序签名
启动固件 seabios
启用内存共享 未选
启用动态内存 未选
安装完成后win10里面
把qnap的windows guest tool光盘挂载上 补上驱动,
打开远程桌面,固定好IP,方便调试
随便在c盘建个mydev目录,把重置补丁RadeonResetBugFixService.exe放入和前面下载的amd显卡驱动解压到该目录。
如果不是最新的21h2 win10,把 我的电脑-属性-高级系统设置-硬件-设备安装设置-选否
防止win10自动下载老版本amd的驱动,直接把你系统卡死.
然后关闭win10,快照里面自己做个备份
4.3.直通上igpu
再启动win10,显示器会被直接点亮,看到显示屏出现登录画面,远程桌面或者直通usb键盘鼠标操作,安装前面解压的amd驱动,
否则win检测到amd gpu会自动下载老版本的简化驱动(当然你也可以在7.1准备阶段把win10的自动驱动更新给关了)
安装完前面解压驱动 ,最后不要点重启。
cmd目录 amdin权限进去执行RadeonResetBugFixService.exe install
等待数分钟不一定,会有1-2次黑屏,等安装完成后再重启.
此时重启 显示器会有1-2分钟黑屏,等待RadeonResetBugFixService激活amd gpu,耐心等待显示器被激活。
在我的机器上
每次宿主机重启后,虚拟机 win10第一次启动会直接点亮显示器,进系统后等待1-2分钟闪屏一下,激活amdgpu,
第二次启动会先黑屏1-2分钟.然后再激活amdgpu
RadeonResetBugFixService具体原理见作者连接最下方
https://github.com/inga-lovinde/RadeonResetBugFix
这样就避免了gpu重置的bug
最后把win10里面的休眠等关了,我发觉休眠有可能会引发宿主机宕机
内存只有2400随便跑个分,马马虎虎将就了,解码编码已经不成问题了
5.虚拟机其他相关设置
/share/CACHEDEV1_DATA/.qpkg/QKVM/usr/etc/qvsd.d/44-preload/01-module
改成如下,含双引号,重启nas,防止kvm错误溢出报告.
load_kvm()
{
___load_module kvm.ko "ignore_msrs=Y report_ignored_msrs=N"
check_ret
echo 1 > /sys/module/kvm/parameters/ignore_msrs
# load kvm module
if [ $VMX_FEATURE -ne 0 ]; then
___load_module kvm-intel.ko nested=0
check_ret
elif [ $SVM_FEATURE -ne 0 ]; then
___load_module kvm-amd.ko nested=0
当然如果要实现套中套的话,把
nested=1
https://pan.baidu.com/s/1PmejEGeMrB1OCmIpS3pQuw
另外把我的引导盘也给你们吧用qnap的最新版gpt格式的uefi引导盘修改,u盘大于3G
dd 把img写进U盘,bios设定为uefi引导,
工具我选用debian11官方基础包,内存中运行,
如果你跟我用的是同一块主板微星B450M-MORTAR-MAX同一款主板
只要下载固件解压就行了
具体看压缩包里面的说明吧
https://pan.baidu.com/s/1C0kHY_EjG-nh20uW5npfRg
|
|