我的服务器上有两块显卡:板载显卡+独立显卡(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,双口Ge2
电源:两个 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.
这一步需要键盘和屏幕直连服务器,无法远程。
我的设置:
ibmc NIC:10.0.0.11(接交换机)
用户:root
密码:xxxxxx
网卡ip:
NIC1: 10.0.1.11(接交换机)
NIC2: 39.150.108.229 (公网ip)
原理:我们需要通过ibmc将服务器上的cmos超级电容里的信息清空,这样bios的设置就还原到出厂设置了。
操作:通过xshell等ssh工具连接ibmc的22端口,进入ibmc命令行
执行命令:ipmcset -d clearcmos
bios默认设置中板载显卡是打开,boot选项中显卡使用板载显卡,所以直接还原就完事了。
通过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会自动将这些设备放到一个组中。
在做显卡直通时,需要将同一个编组的所有设备都添加到虚拟机中,只添加显卡而不添加显卡上附带的其他设备(声卡等)在虚拟机启动时会报错。后面会有演示,这里不用关心。
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显示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长两种。在购买时记得向卖家索要两种挡板!
因为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,不用管它。声卡的驱动是彻底被禁了。
查看当前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设备即可。
百度直接搜索你的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
驱动统一下载地址:
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 |
+-----------------------------------------------------------------------------+
半高显卡几乎适用于所有1U服务器,性能一般不是太好,属于入门级。半高的厚度不超过2cm,长度不超过18cm,宽不超过6cm。
随便举几个例子:淘宝上AMD系列有RX550 、640 、wx系列等。NVIDIA的有gtx 750 、1050等。