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


    先告诉你们最终效果

    我的服务器上有两块显卡:板载显卡+独立显卡(1U服务器半高显卡 GTX 750ti 和 Tesla P4)
    板载显卡用于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

    大致流程

    想让宿主机上显卡直通入KVM虚拟机,需要宿主机Linux具备3个条件

    1. 启动iommu
    2. 启动vfio
    3. 禁用宿主机开源显卡驱动

    确认虚拟化可用

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

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

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

    这个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
    
    • 1
    • 2
    • 3
    • 4

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

    systemctl is-active libvirtd 
    
    • 1

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

    systemctl start libvirtd
    
    • 1

    开启显卡直通

    确保显卡被服务器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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    开头的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  # 声卡驱动
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    vim /etc/modprobe.d/blacklist.conf
    ------------------------
    # 文件末尾添加如下配置,禁用默认的amd、nvidia、声卡驱动
    blacklist amdgpu
    blacklist nouveau
    blacklist snd_hda_intel
    options nouveau modeset=0   
    # 保存退出
    
    # 更新内核设备信息
    update-initramfs -u
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    启动vfio,这是显卡直通进虚拟机的核心服务!

    vim /etc/modules,追加如下内容:

    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd
    
    • 1
    • 2
    • 3
    • 4

    开启Ubuntu系统的iommu,将开机后pcie读写控制权交给cpu

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

    cat /proc/cmdline | grep iommu
    
    • 1

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

    # 修改grub启动器(linux启动的时候会读取grub文件)
    vim /etc/default/grub
    ------------------------------------
    # 如果是intel的CPU
    GRUB_CMDLINE_LINUX="intel_iommu=on"
    # 如果是amd的CPU
    GRUB_CMDLINE_LINUX="amd_iommu=on"
    # 保存退出
    
    # 更新grub启动器
    update-grub
    
    # 重启服务器,必须重启!
    reboot
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    重启服务器后,执行 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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建虚拟机

    先使用板载显卡创建一个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文件
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/06d4ececb0e946a595d39bd5c2358b1a.png
    在这里插入图片描述
    安装驱动

    dpkg -i xxxxx.deb
    或者
    apt -y install ./xxxxx.deb
    
    # 重启服务器
    reboot
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    确认安装完成

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

    NVIDIA官方闭源驱动安装

    驱动统一下载地址:
    https://www.nvidia.cn/Download/index.aspx?lang=cn
    选择你的显卡型号,下载xxxx.run文件
    在这里插入图片描述

    # 安装
    chmod +x xxxx.run
    ./xxxx.run
    
    • 1
    • 2
    • 3

    根据命令行提示完成安装即可。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                                                 |
    +-----------------------------------------------------------------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    附录2:半高显卡

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

  • 相关阅读:
    windows安装MongoDB后进入命令交互界面失败解决方案
    JavaSE 第五章 面向对象基础(上)
    实践分享:30分钟在电脑端运行小程序
    Shopee市场爆单难?找准选品逻辑方式
    Keras深度学习实战(16)——自编码器详解
    2022“杭电杯”中国大学生算法设计超级联赛(1)签到题5题
    java计算机毕业设计影院资源管理系统演示录像2020源程序+mysql+系统+lw文档+远程调试
    浅谈CAD如何精准导入图新地球并应用在工程行业
    【JavaWeb】JavaWeb与JavaWeb技术栈
    MySQL——增删改查进阶
  • 原文地址:https://blog.csdn.net/qq_43626147/article/details/127111911