Ubuntu22.04.1 LTS系统上实现KVM虚拟机显卡直通(AMD/NVIDIA+板载显卡)

Posted 上海一亩地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu22.04.1 LTS系统上实现KVM虚拟机显卡直通(AMD/NVIDIA+板载显卡)相关的知识,希望对你有一定的参考价值。

先告诉你们最终效果

我的服务器上有两块显卡:板载显卡+独立显卡(1U服务器半高显卡 AMD RX550)
板载显卡用于ibmc上的远程桌面控制连接,服务器日常bios操作和linux宿主机桌面操作。板载的性能很差,但是宿主机操作足够了。
独立显卡:单独用于虚拟机windows使用,跑游戏或者雷电安卓模拟器,真正的生产力。
原理:创建完虚拟机后,可以将物理服务器上的任意一个PCIE设备添加给虚拟机。PCIE设备可以是任意种类,所以自然也能添加物理显卡,最终达到虚拟机直通显卡。但是这个显卡一旦添加到虚拟机后,宿主机将无法使用独立显卡,所以宿主机使用板载显卡的方案非常完美!对于虚拟机而言,它并不知道你给它添加的PCIE设备是显卡,只有在虚拟机里安装完驱动才能使用。
当服务器有板载显卡和独立显卡的时候,很多人处理不好他俩的关系,有时宿主机使用独立显卡但是远程kvm操作就不行了,只使用板载显卡则虚拟机性能太低。那么宿主机用板载,虚拟机用独立不就行了。

硬件:
Huawei RH1288V3服务器,这是比较老旧的1U服务器。
CPU: 两颗Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
内存:16GB12根,型号Hynix 0x26AFCC08,频率2133MHZ
磁盘8块TLC颗粒SSD,每块300GB
Raid阵列卡:2208
网卡:intel I350,双口Ge
2
电源:两个 DELTA 460W PLATINUM PS,每个电源额定功率460W,所以总共920W
ibmc固件版本:3.23(U25)
bios固件版本:5.13(U47)
华为RH1288V3固件下载地址:
https://support.huawei.com/enterprise/en/intelligent-servers/rh1288-v3-pid-9901873/software/23882856?idAbsPath=fixnode01%7C23710424%7C251364409%7C21782478%7C9901873
和KVM远程桌面下载地址
https://download.csdn.net/download/qq_43626147/86269951

大致流程

如果在Ubuntu 16或18上实现显卡直通特别繁琐,所以请先将Ubuntu升级到20或22.

  1. 设置ibmc的IP、用户名、密码,并通过浏览器登录
  2. 升级固件
  3. ssh连接ibmc,将bios恢复出厂设置
  4. 安装Ubuntu Server 22.04.1(jammy)操作系统
  5. 确认服务器虚拟化可用
  6. 系统包升级并安装KVM
  7. 查看显卡设备,查看显卡状态,禁用默认驱动
  8. 开启iommu
  9. 创建虚拟机,添加显卡设备(显卡直通)

ibmc设置

这一步需要键盘和屏幕直连服务器,无法远程。
我的设置:
ibmc NIC:10.0.0.11(接交换机)
用户:root
密码:xxxxxx

网卡ip:
NIC1: 10.0.1.11(接交换机)
NIC2: 39.150.108.229 (公网ip)

升级ibmc和bios的固件

浏览器登录ibmc,固件文件获取地址上文已给出。

RH1288v3 bios恢复出厂设置

原理:我们需要通过ibmc将服务器上的cmos超级电容里的信息清空,这样bios的设置就还原到出厂设置了。
操作:通过xshell等ssh工具连接ibmc的22端口,进入ibmc命令行
执行命令:ipmcset -d clearcmos

bios默认设置中板载显卡是打开,boot选项中显卡使用板载显卡,所以直接还原就完事了。

安装Ubuntu 22.04(jammy)

通过ipmi安装或者U盘安装。

如果点击Connect发现过了几秒后没有出现Disconnect,即没有连上光驱,则可能原因是ibmc的带宽太小或者ibmc卡顿了。
那么就加大带宽或者重启ibmc。
安装过程中如果服务器有公网访问能力,ubuntu会检测第三方驱动,此时请不要安装NVIDIA驱动。

确认虚拟化可用

# 确认当前cpu具备虚拟化能力
egrep -o '(vmx|svm)' /proc/cpuinfo

你的cpu一共有多少线程,就会返回多少行。如果没有返回,则你的服务器不支持虚拟化。
由于RH1288v3服务器用的都是Intel 至强E5的CPU,而且bios还原了,所以不用担心虚拟化的问题。

# 查看当前内核是否支持vfio
ls /dev/vfio/

这个vfio是PCI设备编组器,本质上是一个驱动,当需要虚拟机设备直通的时候,vfio作为宿主机上的代理人。因为现在的AMD和NVIDIA显卡上不光有显卡,还有声卡和type-C接口,所以vfio会自动将这些设备放到一个组中。
在做显卡直通时,需要将同一个编组的所有设备都添加到虚拟机中,只添加显卡而不添加显卡上附带的其他设备(声卡等)在虚拟机启动时会报错。后面会有演示,这里不用关心。

系统升级并安装KVM

sudo apt -y update
sudo apt -y upgrade
sudo apt -y install ubuntu-desktop  # 安装gnome桌面,这么大个服务器,不差这点性能。不安装桌面无法使用virt-manager
sudo apt -y install qemu qemu-system qemu-kvm virt-manager bridge-utils libvirt-daemon-system libvirt-clients virtinst

查看本机的libvirtd服务是否启动:

systemctl is-active libvirtd 

正常是active,如果不是,则手动开启

systemctl start libvirtd

开启显卡直通

确保显卡被服务器ibmc识别到

进入ibmc查看显卡设备是否被服务器识别,下图是操作系统没有安装驱动时ibmc显示AMD和NVIDIA显卡的信息。
AMD RX550:

NVIDIA gtx 750Ti

Ubuntu中查看显卡信息:
使用 lspci | grep -i vga 查看linux能识别到的显卡设备。

异常修复:
如果服务器识别不到显卡如何处理?重启ibmc都无法识别陌生设备,那就让ibmc彻底断电!请把服务器电源插头全部拔掉,把显卡插到Raiser上,即服务器的那个框里。然后重复进行“拔电----接电----开机”这个动作知道ibmc能识别到显卡。Raiser如下图。

请仔细看raiser里,里面有个PCIE接口的,这个接口兼容性很好的,别浪费了它。有人害怕显卡放不进去,别担心,raiser里确实有网卡,但是这个网卡很薄,是可以容纳2cm厚的半高显卡。1U服务器用的显卡都是半高显卡,去淘宝放心大胆的购买就行了。显卡的挡板有8cm和12cm长两种。在购买时记得向卖家索要两种挡板

禁用Ubuntu默认显卡驱动

因为linux内核携带通用GPU驱动,所以像板载显卡这样的亮机卡linux是直接可以识别的,无需驱动。
如果服务器上已经插上独立显卡,在Ubuntu系统安装时,系统自动识别显卡厂商并自动安装驱动
AMD显卡默认驱动:amdgpu
NVIDIA显卡默认驱动:nouveau
当宿主机Ubuntu启动后,操作系统是接管独立显卡的。如果我们想实现虚拟机直通显卡,则必须让宿主机Ubuntu放弃对独立显卡的控制。如何放弃呢,那就禁用默认的驱动。
查看显卡的设备ID和PCIE地址

# AMD显卡
lspci -nn | grep AMD
81:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Lexa PRO [Radeon 540/540X/550/550X / RX 540X/550/550X] [1002:699f] (rev c7)
81:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] [1002:aae0]

# NVIDIA显卡
lspci -nn | grep NVIDIA
04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] [10de:1380] (rev a2)
04:00.1 Audio device [0403]: NVIDIA Corporation GM107 High Definition Audio Controller [GeForce 940MX] [10de:0fbc] (rev a1)

开头的xx:xx.x就是设备ID,末尾的[xxxx:xxxx]就是PCIE地址。可以发现显卡上有Audio声卡设备,部分高端显卡还会携带其他设备,命令返回就不止两行了。

然后根据显卡设备ID查看显卡驱动

# AMD显卡默认驱动
lspci -vv -s 81:00.0 | grep driver
	    Kernel driver in use: amdgpu  # 显卡驱动
lspci -vv -s 81:00.1 | grep driver
        Kernel driver in use: snd_hda_intel  # 声卡驱动

# NVIDIA显卡默认驱动
lspci -vv -s 04:00.0 | grep driver
        Kernel driver in use: nouveau  # 显卡驱动
lspci -vv -s 04:00.1 | grep driver
        Kernel driver in use: snd_hda_intel  # 声卡驱动

nouveau是ubuntu社区为N卡专门设立的开源项目,这个项目2020年开设,目前对RTX显卡支持不是太好,对GTX的支持还不错。但是我们统一把它禁用掉,用官方驱动他不香吗?
amdgpu早在Ubuntu16中就作为默认系统包了,所以ubuntu天生对amd的gpu支持的比较好。但是我们为了直通,也把它禁了。
如果你用的是高档显卡,显卡上除了声卡有其他设备和驱动,也是要禁用的。查询方法同上。

开始禁用默认驱动,编写黑名单文件

vim /etc/modprobe.d/blacklist.conf
------------------------
# 文件末尾添加如下两行
blacklist amdgpu
blacklist nouveau
blacklist snd_hda_intel
# 保存退出

# 重启服务器,把显卡空出来
reboot

重启后再次查看显卡驱动,可能还会有amdgpu或者nouveau,不用管它。声卡的驱动是彻底被禁了。

开启Ubuntu系统的iommu,提供虚拟机显卡直通能力

查看当前linux内核是否支持iommu

cat /proc/cmdline | grep iommu

如果这条命令没有任何返回,则当前内核不支持iommu!需要开启。

# 修改grub启动器(linux启动的时候会读取grub文件)
vim /etc/default/grub
------------------------------------
# 找到文件中的GRUB_CMDLINE_LINUX="",修改成如下
GRUB_CMDLINE_LINUX="intel_iommu=on"
# 保存退出

# 更新grub
update-grub

# 重启服务器,必须重启!
reboot

重启服务器后,执行 dmesg | grep IOMMU
必须看到这句话:DMAR: IOMMU enabled ,表示iommu启动成功

dmesg | grep IOMMU
[    0.791811] DMAR: IOMMU enabled
[    1.526761] DMAR-IR: IOAPIC id 10 under DRHD base  0xfbffc000 IOMMU 0
[    1.526765] DMAR-IR: IOAPIC id 8 under DRHD base  0xc7ffc000 IOMMU 1
[    1.526768] DMAR-IR: IOAPIC id 9 under DRHD base  0xc7ffc000 IOMMU 1
[   17.766971] AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.

创建虚拟机

先使用板载显卡创建一个windows虚拟机,并进入windows桌面。
关闭虚拟机,进入设备设置,添加独立显卡和附带声卡。如果你只添加显卡而不添加声卡,启动虚拟机时会报错。因为显卡直通依赖vfio,而vfio已经把显卡和声卡编成一个PCIE组了,不能分开。


开启虚拟机。添加独立显卡后第一次开启虚拟机会墨迹很长时间,kvm后台正在做直通,需要耐心等待,所以不要疯狂点击运行按钮。windows启动后,Cortana(小娜)也会墨迹很长时间。一切等待都是值得的。
进入虚拟机windows 后,右键我的电脑----管理----设备管理器----显示适配器就能看到显卡。
AMD RX 550

NVIDIA gtx 750Ti

Microsoft基本显示适配器的性能非常低,所以右键把它禁用了。
都成功了,后面安装驱动精灵,安装显卡驱动等操作和平时一样。再装个向日葵远程登录,不要太香。
最后总结一下显卡直通技术:
cpu支持虚拟化,能使用kvm是前提。然后开启iommu,禁用默认驱动,给虚拟机添加设备独立显卡PCIE设备即可。

附录1:Ubuntu显卡驱动安装(与本文无关,只是做个笔记)

AMD官方闭源驱动安装

百度直接搜索你的AMD显卡驱动,比如我的事RX550,百度搜索AMD 官网+显卡型号,进入amd官网。下载deb文件


安装驱动

dpkg -i xxxxx.deb
或者
apt -y install ./xxxxx.deb

# 重启服务器
reboot

确认安装完成

# 安装amd显卡查询工具
# top命令可以监控linux系统,radeontop可以监控显卡。
apt install mesa-utils radeontop
radeontop

NVIDIA官方闭源驱动安装

驱动统一下载地址:
https://www.nvidia.cn/Download/index.aspx?lang=cn
选择你的显卡型号,下载xxxx.run文件

# 安装
chmod +x xxxx.run
./xxxx.run

根据命令行提示完成安装即可。NVIDIA驱动智能的地方就在于,如果你的服务器当前正在使用nouveau开源驱动的话,NVIDIA的驱动会创建两个文件自动帮助你禁用nouveau,然后给你提示:
One or more modprobe configuration files to disable Nouveau have been written. For some distributions, this may be sufficient to disable Nouveau; other distributions may require modification of the initial ramdisk. Please reboot your system and attempt NVIDIA
driver installation again. Note if you later wish to re-enable Nouveau, you will need to delete these files: /usr/lib/modprobe.d/nvidia-installer-disable-nouveau.conf, /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
这段话的意思是,NVIDIA驱动帮你新建了两个conf文件,现在nouveau已经禁用了,想要解禁的话只要将这两个文件删了然后重启服务器就行了。由于上面我们手动禁用了nouveau,所以这段话不会出现。
验证驱动的安装:
使用nvidia-smi命令查看N卡的使用情况

nvidia-smi
Fri Sep 30 09:26:41 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.76       Driver Version: 515.76       CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:04:00.0 Off |                  N/A |
| 30%   41C    P0     1W /  38W |      0MiB /  4096MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

附录2:半高显卡

半高显卡几乎适用于所有1U服务器,性能一般不是太好,属于入门级。半高的厚度不超过2cm,长度不超过18cm,宽不超过6cm。
随便举几个例子:淘宝上AMD系列有RX550 、640 、wx系列等。NVIDIA的有gtx 750 、1050等。


以上是关于Ubuntu22.04.1 LTS系统上实现KVM虚拟机显卡直通(AMD/NVIDIA+板载显卡)的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu22.04.1 LTS系统上实现KVM虚拟机显卡直通(AMD/NVIDIA+板载显卡)

AvaloniaUI 之 Linux 常见问题

linux ubuntu 虚拟化,使用Ubuntu 16.04和KVM进行简单的虚拟化

如何在 Ubuntu 10.04 LTS 中升级现有的 phpmyadmin 版本?

Android Studio KVM 设置?

Ubuntu配置软件镜像源