changelog
现在是unraid6.12.8,之前是unraid6.11.5。
修改了下N卡驱动部分和嵌套虚拟化部分,添加了核显直通部分
前言
在学校实验室有需求组装一台服务器,加上预算限制,又有玩虚拟化的想法,于是拼了一台I9-13900K+Tesla P40这种看似洋垃圾又不是洋垃圾方案的玩意(
由于早年在unraid上有一些不是很好的体验,认为还是business稳定,尝试了esxi。ESXI先是由于大小核问题会PSOD,解决办法是启动项加上
cpuUniformityHardCheckPanic=FALSE
禁掉cpu统一性检测。最后放弃的原因是核显无法sr-iov虚拟化,显示支持,但是无法拆分,状况就是一直重启。
后面换了pve7,先是碰到了安装界面都进不去,倒腾半天。然后IGPU SR-IOV需要6.1内核,搞上了后发现Nvidia的grid驱动装不上了,可能因为内核太新,也没找到相关patch。无奈退到最后的unraid上。
(pve还碰到了13th报mce hardware的问题,引导参数带上intel_idle.max_cstate=1解决)
别问为啥没winserver,winserver各种去掉打不上,一小时蓝屏10次给我整麻了
偷了个懒,直接用的开心整合版(
需求
这么搞是有几个需求,一是有多个人,所以要多台“云主机”,然后其中有两台需要nvidia的vgpu跑模型之类的,剩下的给核显+虚拟显示器就够了。虽然uhd770可以sr-iov虚拟化7个出来,但是这玩意的性能emmm,自己掂量(
所以还是就带个显卡亮个机就好
核显直通
为了满足多屏幕需求(parsec没开warp没办法多屏幕连接,只能物理),可以进行核显直通。
简略说下步骤:
- 需要使用Vbios,链接来源于油管老高的视频。
- vbios扔unraid上,虚拟机添加核显,romfile带上vbios,保存虚拟机。
- 修改虚拟机的xml,开头domain type kvm部分修改为
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
再拉到最底部,/domain之前,/devices之后加上
<qemu:override> <qemu:device alias='hostdev0'> <qemu:frontend> <qemu:property name='x-igd-opregion' type='bool' value='true'/> <qemu:property name='x-igd-gms' type='unsigned' value='1'/> </qemu:frontend> </qemu:device> </qemu:override>
然后保存,开机,用vnc或者mstsc进去装驱动即可
注意:无论是sriov的核显还是直通的核显,目前测试禁用hypervisor或者非cpu直通都会导致驱动炸了,code43或者不开机
核显虚拟化
修改
核显为uhd770,unraid 6.11.5为5.19内核来着。
需要用到
Kernel image supported SR-IOV for Unraid OS
unraid的引导参数可能要加上
intel_iommu=on iommu=pt
把release的文件替换掉unraid u盘根目录的文件,原文件自行做好备份。
然后在u盘下的config/modprobe.d下修改i915.conf(没有文件/文件夹就自行创建)在i915.conf的最后一行添加上
options i915 enable_guc=7
然后修改config下的go文件
最后添加上
modprobe i915
echo 7 > /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs
注意,这里的echo后面的数字,是指要开几个虚拟显卡,比如我这开7个就是7,2个就是改成2,最大为7。
开机,改qemu参数
开机,去直通的地方看。可以看到类似下图所示的
此处不需要勾选拆分直通啥的,看到有你设定数量的虚拟显卡就行。
然后装系统方面可以参考vGPU (SR-IOV) with Intel 12th Gen iGPU [Updated 2023]
大概就是,win的话就是vnc模式装机,装好进去后开3389。关机,把虚拟化出来的核显分配,关掉vnc,用mstsc连进去,打最新驱动就行。linux的话6.1内核以上,然后装i915-sriov-dkms,grub设定i915.enable_nuc=3啥的,具体看上面那个参考吧。
此处重点说下把虚拟化的核显给虚拟机的步骤
注:千万不要把原来的核显通给虚拟机,只能通虚拟出来的!
正常情况如上图通给虚拟机,然后切换到xml视图,找到这张显卡的部分,例如我这里是
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
</source>
<alias name='hostdev0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
</hostdev>
我给的设备是00:02.1的,正常igpu是00:02.0,中间02是slot,小数点后是function。如果不修改的话开机是看不到这个设备的。我们要改成
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
</source>
<alias name='hostdev0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</hostdev>
source不动,因为原地址本来就是这个值,改下面的address中的function为0,开机就能看到设备了。
注意unraid特性,从xml视图切回去修改后在xml中改的会部分失效
虚拟显示器
给两个方案,一是直接用parsec远程软件自带的Virtual Display Driver,然后parsec设置里打开Fall back to virtual display。
二是用usbmmidd驱动,这个教程网上大把,但是我这边测得装了这个后parsec连上去鼠标会重影,没找到好的办法解决。
Nvidia Tesla直通(未完成)
这部分没搞定,先放着,坑太大了。p40直通进win下打完驱动重启后直接整个主机卡到用不了/黑屏状态。但是我5105上的esxi直通进去就完全正常。。。另外一台xeon跑的unraid直通V100进去也就第一次能用,虚拟机重启后就寄了,必须物理机重启。。。
看论坛说大现存开resize bar,先不说这老卡支不支持,我开了也没解决。。。。resize bar部分参考VM GPU PASSTHROUGH RESIZABLE BAR SUPPORT IN 6.1 KERNEL
Nvidia vgpu
家用卡自行想办法用vgpu_unlock啥的,此处不提。
关于vgpu驱动,验证,分类等自行参考Proxmox Nvidia Telsa P4 显卡 vGPU 方案
驱动用法
在网上有看到插件版的,要会员,就先跳过(
新用法
使用stl88083365制作的unraid-nvidia-vgpu-driver
1.手动安装plg插件,unraid->插件->安装插件->输入地址nvidia-vgpu-driver.plg
2.参考驱动github上readme中给的脚本,把脚本放在user scripts插件中,设置启动为 at startup of arrary
3.自行修改脚本中环境变量,设置UUID,指定显卡PCI地址以及虚拟化类型
4.重启或手动运行脚本
(脚本内容与之前写的手动用法基本相同)
win下开win内的hyperv(不是unraid虚拟机配置的hyperv)貌似会导致nvidia vgpu认不到。
以下为过时用法,供参考
然后在unraid论坛看到有人制作了一份驱动
UNRAID 6.11.5 NVIDIA VGPU 驱动
在其中给定的链接中下驱动,这边建议直接扔进启动u盘的根目录。
文中说了主机不能硬解,没有其需求,跳过。
打开unraid的终端,输入
installpkg /boot/nvidia-vgpu-525.60.12-unraid.txz
装上驱动后输入
nvidia-smi
能出现信息就正常。
输入
mdevctl types
可以看到支持虚拟出来的种类和参数,各取所需。
然后创建设备
自行生成一个uuid,一个设备对应一个uuid
mdevctl start -u xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx -p 0000:01:00.0 --type nvidia-53
xxx代表的就是uuid,-p后面跟着独显pci地址,type是你选择的哪种类型,我这里是nvidia-53。
创好后输入
mdevctl list
可以看到你创的设备。
修改qemu参数
打开你要给的虚拟机编辑界面,xml模式。
在device中,可以考虑加在
<memballoon model='none'/>
上面
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'>
<source>
<address uuid='xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</hostdev>
其中,xxx就是刚刚创建用到的uuid,slot可以自行改,不冲突即可。
保存,开机,打上vgpu专用的驱动,驱动版本不能大于主机用的版本。
修改为开机自启
由于unraid的系统是只读的,所以除了插件外,系统中的更改重启复原。
一句话,把安装驱动命令,创建设备命令,直接写进/boot/config/go文件中,往下加就完事了。
虚拟显示器
三个字:不需要
Nvidia的vgpu估计是考虑到给服务器用,自带一个叫Nvidia NGX的虚拟显示器,还是独显直连(
获取vgpu授权
参考来自民间的VGPU授权fastapi-dls
unraid直接有docker功能,参考里面的直接把docker搭上就完事了,端口不和ssl冲突的话自定义下。
win篇:
开好docker后,有vgpu的虚拟机中浏览器打开
https://x.x.x.x/client-token
x是这个docker所在的ip地址,改了端口的自行加上端口号。
正常情况会有个文件下载,把文件放到
C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken
重启虚拟机,powershell输入
nvidia-smi -q
可以看到已经授权。
Linux:
curl --insecure -X GET https://x.x.x.x/client-tokenn -o /etc/nvidia/ClientConfigToken/client_configuration_token.tok
service nvidia-gridd restart
nvidia-smi -q | grep "License"
此处为collinwebdesigns/fastapi-dls的readme,查看授权方式与win一样。
最后来张虚拟机图:
KVM隐藏
修改虚拟机参数的features部分
<features>
<acpi/>
<apic/>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
<vendor_id state='on' value='anything'/>
</hyperv>
<kvm>
<hidden state='on'/>
</kvm>
<vmport state='off'/>
<ioapic driver='kvm'/>
</features>
加上kvm这段。
嵌套虚拟化&过一般游戏检测
- unraid6.12.8的嵌套虚拟化不需要加任何grub启动参数,看是否开启直接终端
systool -m kvm_intel -v | grep nested
返回nested = "Y"就是开了。
其中,12th,13th,14th截止到6.12.8,在win虚拟机下开hyperv会导致vm不开机。参考unraid论坛帖子WINDOWS 10 VM DOES NOT BOOT ANYMORE AFTER UPGRADE OF MOTHERBOARD + CPU,解决方案也如帖子下的,cpu改非直通模式,模拟cpu来解决。
- 过检测部分在cpu这块里加上这段(理论上开了嵌套虚拟化的情况下,在win下直接开hyper-v就可以过原神检测。但是我的13900k没有办法开,所以只能通过禁用hypervisior来实现。)
<feature policy='disable' name='hypervisor'/>
(禁用hypervisior网上有相关讨论说会导致性能降低,所以还是能通过开hyperv解决就最好)
以下为旧版,已经过时,仅供参考
貌似是说unraid6.11以上已经默认开了嵌套虚拟化。
如果没有的话去unraid的grub启动参数加上
pcie_acs_override=downstream pci=assign-busses acpi_enforce_resources=lax kvm-intel.nested=1
修改虚拟机参数
<cpu mode='host-passthrough' check='partial' migratable='on'>
<topology sockets='1' dies='1' cores='10' threads='2'/>
<feature policy='require' name='ds'/>
<feature policy='require' name='acpi'/>
<feature policy='require' name='ss'/>
<feature policy='require' name='ht'/>
<feature policy='require' name='tm'/>
<feature policy='require' name='pbe'/>
<feature policy='require' name='dtes64'/>
<feature policy='require' name='monitor'/>
<feature policy='require' name='ds_cpl'/>
<feature policy='require' name='vmx'/>
<feature policy='require' name='smx'/>
<feature policy='require' name='est'/>
<feature policy='require' name='tm2'/>
<feature policy='require' name='xtpr'/>
<feature policy='require' name='pdcm'/>
<feature policy='require' name='osxsave'/>
<feature policy='require' name='tsc_adjust'/>
<feature policy='require' name='clflushopt'/>
<feature policy='require' name='intel-pt'/>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='stibp'/>
<feature policy='require' name='ssbd'/>
<feature policy='require' name='xsaves'/>
<feature policy='require' name='pdpe1gb'/>
<feature policy='require' name='invtsc'/>
<feature policy='disable' name='hypervisor'/>
</cpu>
在cpu这块里加上或者修改
<feature policy='disable' name='hypervisor'/>
可以看到任务管理器里不会有“虚拟机:是”的文字了,而是显示L1,L2,L3缓存和虚拟化已启用。这种情况下一些游戏检测就可以过了,例如原神(
END
目前就记得这些,以后还有啥坑在补上。
代码发不出来。。。问题就是出现核显不识别或者驱动打不上的问题,装好驱动再去虚拟化还会连不上远程桌面
By doudou at April 11th, 2023 at 12:57 pm.
@doudou
是的,这个问题我后面也发现了。nvidia的vgpu不受影响,但是牙膏厂的会,去虚拟化检测后会code43,感觉是牙膏厂官方驱动问题,估计有检测驱动虚拟化的显卡得在虚拟机下才给驱动啥的,因为我主要用n卡,所以没有研究过有无解决方案。
By rote66 at April 11th, 2023 at 04:08 pm.
@rote66
这样的话如果550换成P106,是不是用不了,因为没有核显输出?我还想要是能用远程虚拟机玩游戏就好了
By doudou at April 11th, 2023 at 11:30 pm.
@doudou
直通独显,然后诱骗器或者虚拟显示器方案,远程的话没问题。
By rote66 at April 11th, 2023 at 11:43 pm.
kvm
hidden state='on'
kvm
和
feature policy='disable' name='hypervisor'
By doudou at April 11th, 2023 at 12:54 pm.
博主你好,我也是6.11.5,我用的是i3-12100+RX550,按照你给方式去虚拟化时,我在feature字段添加了
,在cpu字段添加了
By doudou at April 11th, 2023 at 12:49 pm.
@doudou
```
```
和
``
By doudou at April 11th, 2023 at 12:52 pm.