在Proxmox中直通P106-090不认卡的解决方案(估计也适用于其他矿卡)

前言

目前P106系列矿卡价格已经下降到可以接受的程度

这种矿卡拿来弄VGPU与普通Pascal架构的显卡操作一样,很适合练手

本来是准备出一篇文章,发一下vgpu与直通的性能对比,也就一些跑分软件的结果截图

后续弄到正常显卡再重测重跑

与一般卡就算是用grid驱动但强打驱动也能用不同,如果直接直通使用,会出现找不到驱动或者是打上驱动但wddm的D3D无法使用的情况

实际上P106等卡已经被列入GL_SANDBAG_WHITELIST中,虽然我看它更像黑名单

于nvidia被开源的驱动源码dev/gpu_drv/stage_rel/drivers/common/inc/nvSandbagList.h

/*
 *
 * Bug 1838709,200295819, 200474593
 *
 * This file lists the device IDs which are sandbagged on OpenGL/Vulkan. 
 *
 * For queries, please contact SW-OGL-Driver
 *
 */

#define SANDBAG_NO_WHITELIST       0x00000001
#define SANDBAG_NO_CROSS_ADAPTER    0x00000002
#define SANDBAG_YELLOWBANG          0x00000004

#define SANDBAG_MINER_FLAGS (SANDBAG_NO_WHITELIST | SANDBAG_NO_CROSS_ADAPTER | SANDBAG_YELLOWBANG)

typedef struct _GL_SANDBAG_WHITELIST {
    unsigned int    ulDevID;               // This holds DeviceID
    unsigned int    ulSubSystemID;         // This holds SubSystemID
    unsigned int    ulSubSystemVendorID;   // This holds Vendor
    unsigned int    flags;
} GL_SANDBAG_WHITELIST;


static const GL_SANDBAG_WHITELIST aGLSandbagWhiteList[] = {
  { 0x01F8, 0, 0, 0 },
  { 0x1C2A, 0, 0, 0 },
  { 0x1D82, 0, 0, 0 },
  { 0x1DC2, 0, 0, 0 },
  { 0x1E03, 0, 0, 0 },
  { 0x1E06, 0, 0, 0 },
  { 0x1E10, 0, 0, 0 },
  { 0x1E2D, 0, 0, 0 },
  { 0x1E42, 0, 0, 0 },
  { 0x1E43, 0, 0, 0 },
  { 0x1E44, 0, 0, 0 },
  { 0x1E47, 0, 0, 0 },
  { 0x1E50, 0, 0, 0 },
  { 0x1E6D, 0, 0, 0 },
  { 0x1E80, 0, 0, 0 },
  { 0x1E91, 0, 0, 0 },
  { 0x1E93, 0, 0, 0 },
  { 0x1EAB, 0, 0, 0 },
  { 0x1EAC, 0, 0, 0 },
  { 0x1ED1, 0, 0, 0 },
  { 0x1ED3, 0, 0, 0 },
  { 0x1EEB, 0, 0, 0 },
  { 0x1EEC, 0, 0, 0 },
  { 0x1EF0, 0, 0, 0 },
  { 0x1EF1, 0, 0, 0 },
  { 0x1EF5, 0, 0, 0 },
  { 0x1EF6, 0, 0, 0 },
  { 0x1EF8, 0, 0, 0 },
  { 0x1EF9, 0, 0, 0 },
  { 0x1EFA, 0, 0, 0 },
  { 0x1EFB, 0, 0, 0 },
  { 0x1F01, 0, 0, 0 },
  { 0x1F04, 0, 0, 0 },
  { 0x1F09, 0, 0, 0 },
  { 0x1F13, 0, 0, 0 },
  { 0x1F14, 0, 0, 0 },
  { 0x1F41, 0, 0, 0 },
  { 0x1F44, 0, 0, 0 },
  { 0x1F46, 0, 0, 0 },
  { 0x1F48, 0, 0, 0 },
  { 0x1F49, 0, 0, 0 },
  { 0x1F53, 0, 0, 0 },
  { 0x1F54, 0, 0, 0 },
  { 0x1F76, 0, 0, 0 },
  { 0x1F80, 0, 0, 0 },
  { 0x1F81, 0, 0, 0 },
  { 0x1F93, 0, 0, 0 },
  { 0x1FC1, 0, 0, 0 },
  { 0x1FC2, 0, 0, 0 },
  { 0x1FD1, 0, 0, 0 },
  { 0x1FD2, 0, 0, 0 },
  { 0x1FD3, 0, 0, 0 },
  { 0x1FF8, 0, 0, 0 },
  { 0x1FF9, 0, 0, 0 },
  { 0x2080, 0, 0, 0 },
  { 0x20B0, 0, 0, 0 },
  { 0x20BF, 0, 0, 0 },
  { 0x20C0, 0, 0, 0 },
  { 0x20F0, 0, 0, 0 },
  { 0x20FE, 0, 0, 0 },
  { 0x20FF, 0, 0, 0 },
  { 0x2180, 0, 0, 0 },
  { 0x2183, 0, 0, 0 },
  { 0x2185, 0, 0, 0 },
  { 0x2187, 0, 0, 0 },
  { 0x2192, 0, 0, 0 },
  { 0x21AE, 0, 0, 0 },
  { 0x21AF, 0, 0, 0 },
  { 0x21C2, 0, 0, 0 },
  { 0x21C3, 0, 0, 0 },
  { 0x21C4, 0, 0, 0 },
  { 0x21C5, 0, 0, 0 },
  { 0x21C7, 0, 0, 0 },
  { 0x21D2, 0, 0, 0 },
  { 0x23B0, 0, 0, 0 },
  { 0x23BE, 0, 0, 0 },
  { 0x23F0, 0, 0, 0 },
  { 0x15C2, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1B07, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1B87, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1BC7, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1C07, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1C09, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1D83, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1D84, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1DC1, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1EBC, 0, 0, SANDBAG_MINER_FLAGS },
  { 0x1EFC, 0, 0, SANDBAG_MINER_FLAGS },
};

 

至于这些是什么卡,能在dev/gpu_drv/stage_rel/drivers/common/inc/nv_name.h源码中明确找到的有

{ 0x15C2, 0x0000, "GP100-A", "CMP 100-100"},
{ 0x1B07, 0x0000, "GP102-A", "P102-100"},
{ 0x1B87, 0x0000, "GP104-A", "P104-100"},
{ 0x1BC7, 0x0000, "GP104-B", "P104-101"},
{ 0x1C07, 0x0000, "GP106-A", "P106-100"},
{ 0x1C09, 0x0000, "GP106-A", "P106-090"},
{ 0x1D83, 0x0000, "GV100-A", "CMP 100-200"},
{ 0x1D84, 0x0000, "GV100-A", "CMP 100-210"},
{ 0x1DC1, 0x0000, "GV100-B", "CMP 100-200"},

剩下的均为写出名称只有架构,例如

{ 0x23F0, 0x0000, "GA101-B", "Graphics Device"},

至于被列入名单的卡,会走什么逻辑,后续会在nvidia被开源源码阅读笔记系列文章中逐步解释

包括glNVIsQuadroDevice以及__glNVIsQuadroDevice等解锁非专业卡的负优化的内容也会在后续释出

Patch驱动

由于针对此名单的引用及其复杂,如果直接修改,怕不是直接升天,因此换个思路把它patch掉就行

有一个简单搜寻的方法,SANDBAG_MINER_FLAGS = 0x07

至于为什么是7,因为

#define SANDBAG_NO_WHITELIST       0x00000001
#define SANDBAG_NO_CROSS_ADAPTER    0x00000002
#define SANDBAG_YELLOWBANG          0x00000004

#define SANDBAG_MINER_FLAGS (SANDBAG_NO_WHITELIST | SANDBAG_NO_CROSS_ADAPTER | SANDBAG_YELLOWBANG)

因此SANDBAG_MINER_FLAGS就是7

而我们的windows是小端系统,因此第一个0x15C2在实际的程序中会是C215

就这个思路,可以直接在512.78_grid_win10_win11_server2016_server2019_server2022_64bit_international这个驱动中找到

C2150700071B0700871B0700C71B0700071C0700091C0700831D0700841D0700C11D0700091E0700491E0700BC1E0700FC1E07000B1F0700812007008220070083200700C2200700892107000D2207004D2207008A240700CA2407000A250700

这里还有之前被开源源码没有的

248A (GA104 [CMP 70HX]),220D (GA102 [CMP 90HX]), 2189 (TU116 [CMP 30HX]),20C2 (GA100 [CMP 170HX]),2082 (GA100 [CMP 170HX]), 1F0B (TU106 [CMP 40HX]), 1E09(TU102 [CMP 50HX])

把它直接做掉,就代码层面上就能去掉矿卡不认驱动限制了(编解码驱动限制不在这里,在别的地方)

在本站https://foxi.buduanwang.vip/pan/foxi/Virtualization/vGPU/NVIDIA-GRID-Linux-KVM-510.73.06-510.73.08-512.78.zip

下载后解压可得512.78_grid_win10_win11_server2016_server2019_server2022_64bit_international.exe,再次用7zip解压

把512.78_grid_win10_win11_server2016_server2019_server2022_64bit_international\Display.Driver,下面的全部sys还有dll都撸一次

人工是不可能人工的

这里写一个golang小程序干这事情

package main

import (
	"context"
	"encoding/hex"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gfile"
	"sync"
	"time"
)

func main() {
	patch()
}
func patch() {
	var err error
	rawHexString := "C2150700071B0700871B0700C71B0700071C0700091C0700831D0700841D0700C11D0700091E0700491E0700BC1E0700FC1E07000B1F0700812007008220070083200700C2200700892107000D2207004D2207008A240700CA2407000A250700"
	rawBytes, _ := hex.DecodeString(rawHexString)
	patchHexString := ""
	for i := 0; i < len(rawBytes); i = i + 4 {
		patchHexString = patchHexString + "FFFF0700"
	}
	patchBytes, _ := hex.DecodeString(patchHexString)
	globDll, err := gfile.Glob(gfile.Pwd() + gfile.Separator + "*.dll")
	globSys, err := gfile.Glob(gfile.Pwd() + gfile.Separator + "*.sys")
	glob := append(globDll, globSys...)
	if err != nil {
		g.Log().Line().Warning(context.TODO(), err)
		return
	}
	g.Log().Line().Debugf(context.TODO(), "match %v files", len(glob))
	wg := &sync.WaitGroup{}
	for _, v := range glob {
		wg.Add(1)
		go func(group *sync.WaitGroup, v string) {
			defer wg.Done()
			g.Log().Line().Debug(context.TODO(), v)
			err = gfile.ReplaceFile(string(rawBytes), string(patchBytes), v)
			if err != nil {
				g.Log().Line().Warning(context.TODO(), err)
				return
			}
		}(wg, v)
	}
	wg.Wait()
	g.Log().Line().Debug(context.TODO(), "done")
	time.Sleep(time.Second * 100)
}

 

二次解压必要的文件

但是很多朋友就会发现,诶怎么我驱动就没sys也没dll啊

其实吧这里需要用7zip解压一下就有了

然后跑一下那个批量替换的代码,就能把这个名单去掉了

修改inf文件

接下来就看你喜好,把设备加进nvgridsw.inf里面,不加在设备管理器手动选个gtx1060也能用就是

至于其他设备的ID,你可以自己看看GPUZ然后抄作业

 

%NVIDIA_DEV.1B07% = Section021, PCI\VEN_10DE&DEV_1B07
%NVIDIA_DEV.1C07% = Section021, PCI\VEN_10DE&DEV_1C07
%NVIDIA_DEV.1C09% = Section021, PCI\VEN_10DE&DEV_1C09

NVIDIA_DEV.1B07 = "NVIDIA P102-100"
NVIDIA_DEV.1C07 = "NVIDIA P106-100"
NVIDIA_DEV.1C09 = "NVIDIA P106-090"

添加注册表

加完inf文件,接下来是给系统加注册表,以下内容保存为reg文件,双击导入注册表

作用是,让nvidia驱动安装完后,跳过nv签名加载验证,不会出现驱动没报错然后愣是加载不上dll的情况

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\Global]
"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\nvlddmkm]
"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}"=dword:00000001

至于这玩意怎么来的?敬请期待后续的nvidia被开源源码阅读笔记

#define NV_PE_SIGNATURE_OVERRIDE_REGKEY     L"SOFTWARE\\NVIDIA Corporation\\Global"
#define NV_PE_SIGNATURE_OVERRIDE_REGKEY_RS4 L"SYSTEM\\ControlSet001\\Services\\nvlddmkm"
#define NV_PE_SIGNATURE_OVERRIDE_REGVALUE {0x41FCC608, 0x8496, 0x4DEF, {0xB4, 0x3E, 0x7D, 0x9B, 0xD6, 0x75, 0xA6, 0xFF}}
/*    (translates to a "{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}" regvalue name)
 *
 *    , or b) when compiling your module by defining NV_PE_SIGNATURE_OVERRIDE
 *    at build-time, or by just temporarily toggling this #define right here:
 */

开启测试模式

然后为系统开启测试模式,在任务栏管理器中以管理员身份运行

bcdedit /set testsigning on

禁止系统联网检索驱动

接着关闭系统联网更新驱动功能,于组策略gpedit.msc中

完事了就可以重启,进行驱动签名,由于开启了测试模式,因此只需要签名nvlddmkm.sys即可

签名nvlddmkm.sys

如果不希望使用测试模式,也可以自己去捞nvidia的开源代码里面的证书签名

要处理安全编录CAT以及修改过的全部dll,然后那个签名还是过期的,要想办法解决时间戳的事情

所以就交给有精力的人弄吧,不难,就是累

这里我们用这工具随便签个

安装驱动

签名完成后,就可以进行驱动安装了

稍等片刻,就可以看见它安装完毕了可以跑分试试

图形设置中指定程序为高性能

在跑分之前,可能需要在系统中把目标程序设置为高性能,但有时候也不用,不知道啥时候需要设置这玩意

PSO2NGS跑分

首先是PSO2NGS跑分

娱乐大师跑分

然后是新版娱乐大师

结尾

至此,直通的P106-090就可以在PVE的虚拟机中,正常工作了

但比起vgpu,直通真的有意义吗?

如果是正常卡还能接个显示器,但P106没接口啊!

VGPU比起直通怎么感觉跑分还更高了?

由于P106这卡过于特殊,后续的VGPU与直通性能对比不会使用该卡作为测试卡

等我蹲到张正常卡再做直通与VGPU性能对比测试吧

如果有跑分软件推荐可以在后面留言,不需要操作的东西都可以推荐,要手动跑圈的比如说吃鸡之类的就不要推荐了,VGPU跑那玩意要命的

测试会测,2台虚拟机同时VGPU,1台虚拟机VGPU,1台虚拟机直通,三个场景

至于为什么没有2台虚拟机直通,因为一张卡不能直通到两台机

一顿操作猛如虎实际不如二百五

有没有可能,PVE可以直接改PCIe设备的deviceID,而不用大费周章去改驱动?

好想玩CMP HX系列矿卡啊,什么时候才掉价啊

好想玩CMP HX系列矿卡啊,什么时候才掉价啊

好想玩CMP HX系列矿卡啊,什么时候才掉价啊

版权声明:
作者:Intel
链接:https://foxi.buduanwang.vip/windows/2139.html/
文章版权归作者所有,未经允许请勿转载
如需获得支持,请点击网页右上角
THE END
分享
二维码
海报
在Proxmox中直通P106-090不认卡的解决方案(估计也适用于其他矿卡)
前言 目前P106系列矿卡价格已经下降到可以接受的程度 这种矿卡拿来弄VGPU与普通Pascal架构的显卡操作一样,很适合练手 本来是准备出一篇文章,发一下vgpu与直……
<<上一篇
下一篇>>
文章目录
关闭
目 录