KVM 使用主机 GPU

KVM 如何使用主机的 GPU,首先安装 KVM。

配置Grub

vi /etc//etc/default/grub

GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt video=efifb:off vfio_pci.ids=10de:1e07,10de:10f7,10de:1ad6,10de:1ad7"

查看主机显卡信息

lspci -nnk | grep -A 3 'VGA'
在这里插入图片描述

找到GPU 地址

使用下面的脚本找到 vfio_pci.ids 地址

#!/bin/bash
shopt -s nullglob
for g in /sys/kernel/iommu_groups/*; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

在这里插入图片描述

创建 vfio 配置文件

vi /etc/modprobe.d/vfio.conf

blacklist snd_hda_intel
blacklist nouveau
options vfio_pci ids=10de:1e07,10de:10f7,10de:1ad6,10de:1ad7

vi /etc/initramfs-tools/modules

softdep nvidiafb pre: vfio vfio_pci

vfio
vfio_iommu_type1
vfio_virqfd
options vfio_pci ids=10de:1e07,10de:10f7,10de:1ad6,10de:1ad7
vfio_pci ids=10de:1e07,10de:10f7,10de:1ad6,10de:1ad7
vfio_pci
nvidiafb
nvidia

应用配置并重启

update-initramfs -u
update-grub

virsh edit xxx添加配置

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x26' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </hostdev>

在这里插入图片描述
重启服务器

启动 Windows 并安装 驱动

在这里插入图片描述

<think>我们正在处理一个关于在KVM中配置GPU直通以创建支持GPU硬件加速的虚拟机的问题。 根据引用[1]和引用[2],我们知道KVM支持GPU直通(GPU Passthrough)技术,允许将物理GPU直接分配给虚拟机。 此外,引用[2]提到NVIDIA有专门支持GPU虚拟化的显卡(如GRID系列),但即使不是这样的显卡,也可以尝试进行直通(但可能遇到驱动限制,如NVIDIA消费级显卡在虚拟机中会报错43,需要额外处理)。 步骤概述: 1. 确认硬件支持:需要CPU支持VT-d(Intel)或AMD-Vi(AMD)技术,主板也需要支持IOMMU。 2. 启用IOMMU:在宿主机上启用IOMMU功能。 3. 隔离GPU:将目标GPU与其音频设备(如果有)从宿主机驱动中解绑,以便分配给虚拟机。 4. 配置虚拟机:创建虚拟机时,将GPU设备通过VFIO驱动直通给虚拟机。 5. 安装驱动:在虚拟机中安装对应的GPU驱动程序。 详细步骤: 1. 确认硬件支持: 检查CPU是否支持虚拟化技术并开启(在BIOS中设置): - Intel: VT-x 和 VT-d - AMD: SVM 和 IOMMU 检查是否支持IOMMU: ```bash dmesg | grep -e DMAR -e IOMMU ``` 如果看到DMAR或IOMMU相关的启用信息,则支持。 2. 启用IOMMU: 编辑GRUB配置文件(通常为`/etc/default/grub`): - Intel: 在`GRUB_CMDLINE_LINUX`行添加 `intel_iommu=on` - AMD: 添加 `amd_iommu=on` 例如: GRUB_CMDLINE_LINUX="intel_iommu=on" 更新GRUB并重启: sudo update-grub sudo reboot 3. 隔离GPU: 查找GPU及其音频设备的PCI地址: lspci -nn | grep -i nvidia # 假设是NVIDIA显卡 输出示例: 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] [10de:1c03] (rev a1) 01:00.1 Audio device [0403]: NVIDIA Corporation GP106 High Definition Audio Controller [10de:10f1] (rev a1) 记录PCI地址(如01:00.0和01:00.1)和设备ID(如[10de:1c03]和[10de:10f1])。 将设备ID添加到VFIO的模块参数中,以便在启动时加载VFIO驱动并绑定这些设备。 编辑`/etc/modprobe.d/vfio.conf`(如果不存在则创建): options vfio-pci ids=10de:1c03,10de:10f1 然后,确保在启动时提前加载VFIO驱动,编辑`/etc/initramfs-tools/modules`: vfio vfio_iommu_type1 vfio_pci vfio_virqfd 更新initramfs: sudo update-initramfs -u 重启。 验证设备是否由vfio-pci驱动绑定: lspci -nnk -s 01:00.0 应该显示Kernel driver in use: vfio-pci 4. 配置虚拟机使用virt-manager或virsh命令行): 这里以virt-manager图形界面为例: a. 创建虚拟机(安装操作系统时,选择自定义配置)。 b. 在虚拟机配置的“添加硬件”中,选择“PCI主机设备”,然后添加之前隔离的两个设备(GPU和音频设备)。 c. 注意:虚拟机芯片组建议选择Q35,固件选择UEFI(如果是Windows虚拟机,推荐使用UEFI并启用安全启动,但有时需要关闭安全启动以避免驱动签名问题)。 d. CPU模式设置为host-passthrough,以获得更好的性能。 e. 如果虚拟机是Windows,需要添加Hyper-V的屏蔽(hyperv)特性,以避免NVIDIA驱动检测到虚拟机而报错43(对于消费级显卡): 在XML配置中,在<features>部分添加: <hyperv> <vendor_id state='on' value='whatever'/> ... 其他Hyper-V特性根据需求添加 </hyperv> 或者使用kvm的隐藏标志(但注意,这可能会影响性能): <kvm> <hidden state='on'/> </kvm> 具体方法需要根据显卡和驱动版本调整。 如果使用virsh命令行,需要编辑虚拟机的XML配置文件,在<devices>部分添加: <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/> </source> </hostdev> 5. 在虚拟机中安装驱动: - 启动虚拟机,安装对应的GPU驱动程序(如NVIDIA官网下载的驱动)。 - 如果遇到错误43(NVIDIA消费级显卡在虚拟机中常见),需要额外处理: 方法1:使用libvirt的钩子脚本在虚拟机启动前修改设备ROM,隐藏虚拟机特征(但可能违反用户许可协议)。 方法2:使用打过补丁的驱动程序(同样可能违反协议,不推荐)。 方法3:使用支持虚拟化的专业显卡(如GRID系列)则不会出现此问题。 注意事项: - 直通GPU后,宿主机将无法使用GPU。 - 如果宿主机使用的是该GPU,需要切换到集成显卡或其他GPU,否则无法解绑。 - 对于NVIDIA显卡,在Windows虚拟机中可能会遇到错误43,需要采取额外措施(如上述的Hyper-V屏蔽或隐藏kvm)。 根据引用[2],对于NVIDIA GRID系列显卡,则不需要担心错误43,因为它们是专为虚拟化设计的。 以上步骤是配置GPU直通的基本流程,具体细节可能因硬件和软件版本而异。 相关问题: 1. 如何解决KVM中NVIDIA显卡直通时的错误43? 2. KVM中配置GPU直通有哪些性能优化方法? 3. 除了GPU直通,KVM还有哪些方式实现GPU虚拟化?</think>### 在KVM中配置GPU直通实现硬件加速的步骤 #### 1. **前置条件检查** - **硬件要求**: - CPU支持VT-d(Intel)或AMD-Vi(AMD)技术 - 主板启用IOMMU(在BIOS/UEFI中开启) - GPU支持直通(NVIDIA Tesla/GRID系列兼容性最佳[^2]) - **软件要求**: - Linux内核 ≥ 4.5(推荐5.x+) - QEMU ≥ 3.0 - libvirt ≥ 5.6 #### 2. **宿主机配置** **(1) 启用IOMMU** 编辑GRUB配置文件(如`/etc/default/grub`): ```bash # Intel CPU GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt" # AMD CPU GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt" ``` 更新并重启: ```bash sudo update-grub && sudo reboot ``` **(2) 绑定GPU到VFIO驱动** ```bash # 查看GPU PCI地址 lspci -nn | grep -i nvidia # 输出示例:01:00.0 VGA [0300]: NVIDIA Corporation GP106 [10de:1c03] ``` 创建VFIO绑定配置(`/etc/modprobe.d/vfio.conf`): ```bash options vfio-pci ids=10de:1c03,10de:10f1 # 替换为实际设备ID ``` **(3) 加载内核模块** ```bash echo vfio_pci >> /etc/modules echo vfio_iommu_type1 >> /etc/modules echo vfio >> /etc/modules sudo update-initramfs -u ``` #### 3. **虚拟机配置** **(1) 创建虚拟机XML配置** ```xml <domain type='kvm'> <devices> <!-- GPU直通 --> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> </hostdev> <!-- GPU音频设备(如有) --> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/> </source> </hostdev> <!-- 启用Hyper-V扩展(Windows必需) --> <features> <hyperv> <vendor_id state='on' value='1234567890ab'/> </hyperv> </features> </devices> </domain> ``` **(2) 应用配置** ```bash sudo virsh define vm-gpu.xml sudo virsh start vm-name ``` #### 4. **虚拟机内部配置** - **Windows虚拟机**: 1. 安装官方GPU驱动 2. 若遇Error 43,需添加注册表项: ```regedit [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}] "DriverFlags"=dword:00000002 ``` - **Linux虚拟机**: ```bash sudo apt install nvidia-driver-510 # 安装对应驱动 ``` #### 5. **验证GPU直通** ```bash # 虚拟机内执行 nvidia-smi # 应显示GPU信息 glxinfo | grep "OpenGL renderer" # 应显示GPU型号 ``` ### 关键注意事项 1. **GPU兼容性**:消费级GPU(如GeForce)在Windows虚拟机中可能触发Error 43,专业卡(Tesla/GRID)无此问题[^2] 2. **性能优化**: - CPU模式设置为`host-passthrough` - 使用`virtio`磁盘和网络驱动 - 启用巨页内存:`<memoryBacking><hugepages/></memoryBacking>` 3. **多GPU隔离**:需在宿主机屏蔽所有直通设备驱动: ```bash echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf ``` ### 替代方案:GPU分区虚拟化 若需**单GPU共享给多虚拟机**(如NVIDIA vGPU): 1. 需特定硬件(如Tesla v100/vGPU授权) 2. 安装GPU厂商虚拟化驱动(如NVIDIA GRID驱动) 3. 配置MDEV设备: ```xml <device> <parent>pci_0000_01_00_0</parent> <capability type='mdev'> <type id='nvidia-63'/> <!-- GPU分片类型 --> </capability> </device> ``` > **提示**:生产环境推荐使用专业级GPU+厂商虚拟化方案,消费级GPU直通适合实验环境[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值