太长不看
浪潮5212M4机器,宿主系统Ubuntu 22.04 Server,直通显卡给KVM虚拟机。
宿主机GRUB参数内,除开启iommu、指定VFIO之外,需要添加video=efifb:off避免开机就使用显卡;
并且推荐把BIOS内首选显示设备改为onboard service(板载显卡,也就是IPMI控制台),否则引导界面可能会黑屏
碎碎念
这几年不更新,主要是觉得自己解决的问题、学到的知识无非是在互联网上做摘抄,很难有多少说是自己的创作,最近偶尔得到一点可能有价值的经验,因此时隔三年再水一篇文章,希望能帮到其他人。
还有,自己从硬件开始折腾虽然很爽,但是出了问题就会觉得IaaS或者PaaS的好,像Google Colab一样打开网页点两下就能用nvidia-smi看到显卡它不香吗?当然最后如果问题能解决完还是非常酣畅淋漓就是了。
-1 买卡
从22年9月矿难以来,10月份显卡达到最低价,当时3070只需1500左右,3080要2500左右;到后来4090发布,给各个性能档位的卡锚定了价格,加上各路翻新贩子入场,卡价又略涨500-1000不等。
我有幸在去年11月底,遇到一批涡轮2080ti,1500拿下一张;本以为这张卡满足我所有游戏需求,未来五年无需关注显卡市场,没想到1月将家里的各种软路由、NAS换为一台浪潮5212M4服务器后,发现它可以用转接卡再接一张双槽全高x16设备,加一张单槽全高x8设备;于是蠢蠢欲动,每日刷咸鱼权当消遣。
但此时大车已经开走,虽然2080ti相对30系,仍然是性价比较高的存在;但望着偶尔出现一张1600左右就会被秒的市场,我总是无法说服自己用这个价格买一张玩具。
直到我蹲到一个老哥,改风扇烧了接口,找人修过之后1400出手,送那个把卡烧了的散热器,一番沟通之下,刀到1350不要散热器。付款后,卖家测试时意外发现风扇供电仍然有些问题,风扇只能全速运行,4500转的涡轮约等于最大档的空气净化器的噪音,于是我顺手再刀了50,最后1300到手。
0 上机
这台机器上显卡,需要买3个额外配件:
1U散热器
供电线
转接卡
与家用机器不一样,这个机器的显卡供电是从主板上取电,再转接成双8pin口;
而且显卡目测只支持20公分,否则会顶到左侧CPU的散热器,上2080ti需要将左侧散热器换成1U高度的,我贪便宜买了个20块的,没有热管,后果就是CPU1比CPU0高10度。
1 上网查资料
从stackexchange、reddit等网站看到,显卡直通大致分为4个步骤:
- 调节BIOS选项,开启VT-x,调节GRUB选项和BIOS,开启IOMMU(VT-d)
- 找到你的设备,调节GRUB选项(或者在initramfs里添加脚本,在/etc/modprobe.d下面建一个配置文件添加选项应该也有效),在开源的显卡驱动接管显卡之前,让显卡使用VFIO驱动
- 卸载掉显卡默认驱动对应的内核模块
- 开一个虚拟机,添加PCI设备,正确填写宿主机显卡所有PCI设备的bus、slot、function
2 踩坑
实践下来,其中第二步是最难的!
最开始的问题1:指定完VFIO驱动之后,重启,宿主机直接死机,IPMI控制台无输出;同时IPMI页面的日志里每秒都在报错:PCI总线出现不可恢复的错误。
当时慌得一批,以为主板和显卡里面有一个烧了,拔掉显卡试着开机,倒是能正常开机。
无奈,只能修改成pci-stub方案,这回倒是能开机了,但是问题2出现了:显卡自带的USB控制器仍然使用的是系统提供的驱动xhci_pci。
当时我以为是没卸载掉哪个驱动,于是反复修改blacklist文件,无果;
于是尝试从直通到虚拟机的设备里,去掉这个USB控制器,虚拟机一开机直接死机。
只能又改回VFIO方案,同时尝试修改GRUB启动参数,不断的搜PCI Bus Error,根据别人的回帖添加了一些抑制错误的参数:
1
| pci=nommconf pcie_aspm=off pci=noaer pci=nomsi
|
当然了,没什么用。
后来我灵机一动,想着IPMI控制台没有输出,会不会是因为插了显卡屏蔽了集显;于是插了一个便携屏上去,终于看到了熟悉的引导进度条,也看到了死机前最后一条日志:
1
| vfio-pci: 0000:83:00:0: vgaarb: changed VGA decodes: olddecodes= io+mem, decodes=io+mem:owns=io+mem
|
这并不是一条报错,而是VFIO提示正在接管显卡,顺手改BIOS把默认设备改回集显,恢复IPMI控制台显示。
再根据这句日志再去搜索,看到一个参数:video=efifb:off,可以关闭帧缓冲区,在系统启动之后完全不使用显卡。
添加之后,终于宿主机可以正常开机了,虚拟机也能启动了,但还没完,出现了问题3:整个宿主机和所有虚拟机的IO都非常慢,我的虚拟机和宿主机都放在一块NVME硬盘上,但是实际用起来反应像装在U盘上一样。
尝试在一台Windows虚拟机里用AS SSD测速,IO变得非常奇怪,偶尔能跑到正常速度,偶尔完全没有速度,导致平均数字慢慢下降。
最后想到了之前加的GRUB选项,全部去除,只保留最后关闭帧缓冲区的,终于一切回归正常了。
附上最后nvidia-smi输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| qhs@ml:~$ nvidia-smi -a
==============NVSMI LOG==============
Timestamp : Mon Feb 13 06:41:04 2023 Driver Version : 510.108.03 CUDA Version : 11.6
Attached GPUs : 1 GPU 00000000:83:00.0 Product Name : NVIDIA GeForce RTX 2080 Ti Product Brand : GeForce Product Architecture : Turing Display Mode : Disabled Display Active : Disabled Persistence Mode : Disabled ...略
|