ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

ubuntu 25.04 安装 qemu ,并实现 Intel 核显和 Nvidia 显卡直通,让 Linux 可以也可以玩大型游戏,性能不输 Windows ——Linux 下游戏3D加速全图详解,一看就会!

众所周知,linux 下玩游戏绝对是硬伤,即便有 wine 这样的 windows 工具,可以运行 windows 程序,但是也只有部分游戏可以运行,大多数需要显卡支持的 3D 游戏很难运行。即使能运行,效果也很不理想。

一种解决思路是通过安装 Virtual Box 或 Vmware 虚拟机软件来模拟 Windows 环境,从而运行游戏。但是有个缺点,游戏比较吃显卡,Virtual Box 显存只有64M,根本无法运行3D类游戏,会提示各种运行库错误,即使安装上也不能正常运行,基本上是不能用。Vmware 的显卡加速效果比 Virtual Box 好,能够正常启动游戏,一般对显卡要求不高的游戏,Vmware 是可以流畅玩游戏的。笔者上学之前玩《仙剑奇侠传五》就是在 Vmware 虚拟机里玩的,一点都不卡,3D效果也很好。不过如果是要运行最新的游戏,虚拟机就不行了。

所以要让 linux 可以正常玩游戏,就必须直通显卡给虚拟机,让虚拟机中使用真实的物理显卡,而不是虚拟加速卡,这样就能在 linux 下玩各种游戏了。

本教程在 TinkPad E470C 测试通过。这款电脑,显卡属于 MUXless 架构,独显没有单独的显示输出,都是需要经过核显输出,因此有些小问题,具体见文尾。

硬件直通(Passthrough) VT-d 、DirectPath I/O,通过 DirectPath I/O,虚拟机可以使用 I/O 内存管理单元访问平台上的物理 PCI 功能,虚拟机会以直通独占的方式使用硬件,宿主机将不能再使用此硬件。

1. 检查 cpu 是否支持 VT-d(Intel)或 AMD-Vi(AMD),近年来的 cpu 如 intel i3 和 i5 都支持,10 代以上驱动有变化

在电脑 BIOS 中,开启虚拟化 VT-x、VT-d 的支持。可以到 Intel 的官方网站:https://www.intel.cn/ 输入cpu型号查询。

查看cpu信息,检查是否支持虚拟化

egrep -c '(svm|vm)' /proc/cpuinfo

如果显示0,则不支持虚拟化。

查看显卡的架构:

lspci|egrep '(VGA|NVIDIA)'

查看有关Intel 和 NVIDIA 显卡的相关信息:

  • 如果独显设备名以 3D Controller 开头,那你的就是MUXless架构(核显直连显示器),独显通过核显输出。
  • 如果独显设备名以 VGA Controller 开头,并且有一个 HD Graphics 核显,那你的电脑是第二种 MUXed 架构(核显、独显切换),独显和核显可各自输出。
  • 如果独显设备名以 VGA Controller 开头,并且没有 HD Graphics 核显,那你的电脑是第三种屏蔽核显的架构,单独核显输出。

我的显卡是以 3D Controller开头的,所以属于MUXless架构,先把核显直通了,再直通NVIDIA。

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

2.启用 IOMMU 组,配置 Intel GVT-g 虚拟核显

打开/etc/default/grub,在找到GRUB_CMDLINE_LINUX=“”,添加内核启动参数:

GRUB_CMDLINE_LINUX=“intel_iommu=on”

AMD 开启参数为“ amd_iommu=on”

更新grub:

sudo update-grub

重启电脑。

检查内核是否启用了iommu:

sudo dmesg|grep -i iommu

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

如果看到 “pci XXXXX:XXX:XX.XX: Adding to iommu grep 1 ”这种字样,那么iommu 就启用成功了。没有看到的话,检查 BIOS 是否开启了虚拟化和 IOMMU,部分主板会在BIOS中设置这样的选项,有的话就开启,没有的话检查grub命令行是否拼写有错。

注意:显卡所在的 group 组可能还有其他设备,比如台式机 NVIDIA 显卡会有一个声音设备,在做显卡直通时,需要将group组内的所有设备都直通,不能单独直通其中的某一个设备。当然,也有可能将其中的显卡设备单独直通,这需要给内核打补丁,比较复杂,在此不做深入讨论,有兴趣的可以研究讨论。

在 qemu 中安装好 win 10 虚拟机,确保虚拟机能正常运行,安装教程见下:

qemu 安装 win 10 教程

安装好 win 10 系统后,关闭虚拟机,接下来开始显卡直通。

3.启用 GVT-g,添加内核所需的模块。

编辑grub,添加内核启动参数:

GRUB_CMDLINE_LINUX="i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on"

添加vfio虚拟化模块:

sudo nano /etc/modules

添加以下内容,每个一行:

kvmgt
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

更新grub:

sudo update-grub

重启电脑。

4.创建 Intel 虚拟显卡

查找核显的 PCIe 总线编号:

lspci | grep "HD Graphics"

输出如下:

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

“00:02.0″就是核显的总线位置,记住它,一会需要用到。

首先生成UUID:

uuidgen

会生成一串16进制的数字,复制它,类似这样的“12e482d1-3b98-457f-8f2b-6eb52370e0e0”。

创建虚拟显卡:

sudo su
echo "12e482d1-3b98-457f-8f2b-6eb52370e0e0" > "/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"

其中核显的 PCIe 编号,根据实际编号替换,UUID 同样根据生成的编号替换,不确定路径是否正确的话,可以打开/sys/devices目录,对应目录下查找是否存在相应的目录或文件。第一次配置虚拟机的时候,一定!!!先运行这个代码,不然后面虚拟机配置的时候会找不到虚拟显卡。

可以将此添加开机启动脚本,也可以将此代码写入 qemu 钩子脚本,在虚拟机开启的时候注入脚本:

sudo nano /etc/libvirt/hooks/qemu

将下列代码粘贴进去,注意 GVT_PCI、GVT_GUID、MDEV_TYPE、DOMAIN 这些变量换成你自己的,变量一定要用“ ”包起来。

#!/bin/bash
GVT_PCI="0000:00:02.0"
GVT_GUID="12e482d1-3b98-457f-8f2b-6eb52370e0e0"
MDEV_TYPE="i915-GVTg_V5_4"
DOMAIN="win10"
if [ $# -ge 3 ]; then
    if [[ " $DOMAIN " =~ .*\ $1\ .* ]] && [ "$2" = "prepare" ] && [ "$3" = "begin" ]; then
        echo "$GVT_GUID" > "/sys/devices/pci0000:00/$GVT_PCI/mdev_supported_types/$MDEV_TYPE/create"
    elif [[ " $DOMAIN " =~ .*\ $1\ .* ]] && [ "$2" = "release" ] && [ "$3" = "end" ]; then
        echo 1 > "/sys/devices/pci0000:00/$GVT_PCI/$GVT_GUID/remove"
    fi
fi
5.禁用 QXL,启用虚拟机 intel 核显

打开虚拟机管理器,查看虚拟机配置,点击“添加硬件”。此时,应该会看到“MDEV Host Device”中有主机设备:“MDEV_12e482d1_3b98_457f_8f2b_6eb52370e0e0”这样的设备,添加进主机。

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

启动虚拟机,打开设备管理器,应该会多出一个 Microsoft 基本显示适配器或者带感叹号的显示适配器,右键它选择自动更新驱动,系统会自动装好 Intel 的核显驱动,开始菜单里会出现 Intel 控制面板。如果无法使用自动更新,提前下好驱动拷贝到虚拟机里手动安装。

安装好驱动后,在任务管理器中能正常显示 Intel 核显后,关闭虚拟机。

禁用QXL

运行 virsh edit Win10,其中 Win10 是你的虚拟机名,找到如下内容,把 display='off' 改成 display='on',添加 ramfb='on'

<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on' ramfb='on'>
  <source>
    <address uuid='12e482d1-3b98-457f-8f2b-6eb52370e0e0'/>
  </source>
</hostdev>

找到 <graphics>...</graphics><video>...</video> ,将中间的所有内容,替换成下列内容:

  <graphics type='spice'>
    <listen type='none'/>
    <image compression='off'/>
    <gl enable='yes'/>
  </graphics>
  <video>
    <model type='none'/>
  </video>

同时在 </domain> 之前添加如下内容:

<qemu:commandline>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.xres=1366'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.yres=768'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.romfile=/usr/share/seabios/vbios_gvt_uefi.rom'/>
</qemu:commandline>

qemu 7.0 以上的版本,要使用<qemu:override> 进行配置:

 <qemu:override>
    <qemu:device alias='hostdev0'>
      <qemu:frontend>
        <qemu:property name='x-igd-opregion' type='bool' value='true'/>
        <qemu:property name='driver' type='string' value='vfio-pci-nohotplug'/>
        <qemu:property name='xres' type='unsigned' value='1366'/>
        <qemu:property name='yres' type='unsigned' value='768'/>
        <qemu:property name='romfile' type='string' value='/usr/share/seabios/vbios_gvt_uefi.rom'/>
      </qemu:frontend>
    </qemu:device>
 </qemu:override>

其中 vbios_gvt_uefi.rom 从 http://120.25.59.132:3000/vbios_gvt_uefi.rom 下载。

把整个文件第一行的<domain type='kvm'> 改成<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

重新启动虚拟机,应该有正常的图像显示,此时虚拟机使用的是 GVT-g 物理虚拟显卡。

6.直通 NVIDIA 显卡

首先在 Windows 系统中使用 GPU-Z 工具导出显卡 BIOS,一般笔记本电脑导出会出错,那就不要管。使用提取官网 BIOS 更新包里的显卡 BIOS。注意,这是显卡的 BIOS,不是电脑的 BIOS。

(1)打开 win10 虚拟机,进入设备管理器,找到你的显卡,查看它的硬件 ID,类似 PCI\VEN_10DE&DEV_134F&SUBSYS_505C17AA&REV_A2,记录下来备用。

(2)到联想官网,找到对应型号电脑的 BIOS 更新程序,比如 ThinkPad E470C:

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

(3)选择 BIOS 升级程序,一般是exe格式,不要选择光盘版,比如这里下的是 BIOS-r0duj36w.exe

接着,提取程序里的显卡 BIOS,需要用到几个工具,按照下列代码所示操作:


git clone https://github.com/coderobe/VBiosFinder.git
mv BIOS-r0duj36w.exe VBiosFinder/

sudo apt install ruby ruby-bundler innoextract p7zip upx-ucl

git clone https://github.com/awilliam/rom-parser.git
cd rom-parser
make
mv rom-parser ../VBiosFinder/3rdparty
cd ..

git clone https://github.com/LongSoft/UEFITool.git
cd UEFITool
./unixbuild.sh
mv UEFIExtract/UEFIExtract ../VBiosFinder/3rdparty
cd ..

cd VBiosFinder
bundle update --bundler
bundle install --path=vendor/bundle
./vbiosfinder extract BIOS-r0duj36w.exe
ls output

cp ./output/vbios_10de_134f_1.rom /home/bios-vbios.rom

(4)把显卡 BIOS 添加到虚拟机的 UEFI 固件(即 OVMF)中,此处需要编译OVMF固件,编译OVMF需要老旧的编译工具,新系统安装很容易出错,因此这里采用 docker 编译安装。

安装好docker后,下载 ovmf 显卡补丁源码:

git clone https://github.com/T-vK/ovmf-with-vbios-patch.git
cd ovmf-with-vbios-patch && mkdir ./build && mkdir ./roms
sudo docker build -t ovmf-vbios-patch .

注意,最后这句代码,在国内环境下很难完成,因为程序要下载编译环境和一些软件包,国内网络经常超时出错,尤其是 github,经常下载超时,这里修改 Dockerfile 文件,使用国内源替换掉。

cd ovmf-with-vbios-patch

FROM debian:buster-20210721-slim

RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list  && \
    sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && \
    apt-get -qq -y update && \
    apt-get -qq -y upgrade && \
    apt-get -qq -y install -y build-essential python2.7 iasl nasm subversion libwww-perl uuid-dev dos2unix vim git && \
    git config --global url."https://gitclone.com/".insteadOf https:// && \
    git clone --depth 1 --single-branch --branch edk2-stable201905 https://github.com/tianocore/edk2.git && \
    cd edk2 && \ 
    git submodule init && \
    git submodule update --depth 1 CryptoPkg/Library/OpensslLib/openssl && \
    apt-get remove -y git && \
    apt-get clean -y && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf .git && \
    rm -rf CryptoPkg/Library/OpensslLib/openssl/.git

COPY files/ /ovmf
CMD /ovmf/compile-ovmf.sh ${VROM}

替换后再执行sudo docker build -t ovmf-vbios-patch .就能成功,成功后将上面提取的显卡rom复制到刚刚新建的 roms 文件夹内。

cp /home/bios-vbios.rom ./roms

使用 Docker 编译 ovmf :

sudo docker run --rm -ti -v "$(pwd)/build:/build:z" -v "$(pwd)/roms:/roms:z" -e "VROM=bios-vbios.rom" ovmf-vbios-patch

编译的结果保存在 build 目录下:

ls ./build

复制编译好的 OVMF 结果到 qemu 默认目录下:

sudo cp ./build/OVMF* /usr/share/OVMF

打开虚拟机配置界面,添加NVIDIA显卡:

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

注意:右边含有 NVIDIA 字样的设备都要添加进去,虚拟机直通就是整个物理设备都要直通。修改虚拟机配置virsh edit win10,参照如下的配置修改:

os 段配置参考:

<os>
    <type arch='x86_64' machine='pc-q35-8.2'>hvm</type>
    <loader readonly='yes' secure='no' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
    <nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/qemu/nvram/OVMF_VARS.fd</nvram>
</os>

features 段配置参考:

 <features>
    <acpi/>
    <apic/>
    <hyperv mode='custom'>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on'/>
      <synic state='on'/>
      <stimer state='on'/>
      <reset state='on'/>
      <vendor_id state='on' value='GenuineIntel'/>
      <frequencies state='on'/>
      <tlbflush state='on'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
    <ioapic driver='kvm'/>
  </features>

NVIDIA 显卡配置参考:

<hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      </source>
      <rom bar='off'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
</hostdev>

NVIDIA 显卡驱动会检测电池是否存在,来判断是否是虚拟机,所以添加模拟电池的代码:

nano battery.txt

将下列代码复制粘贴进txt中:

U1NEVKEAAAAB9EJPQ0hTAEJYUENTU0RUAQAAAElOVEwYEBkgoA8AFVwuX1NCX1BDSTAGABBMBi5f
U0JfUENJMFuCTwVCQVQwCF9ISUQMQdAMCghfVUlEABQJX1NUQQCkCh8UK19CSUYApBIjDQELcBcL
cBcBC9A5C1gCCywBCjwKPA0ADQANTElPTgANABQSX0JTVACkEgoEAAALcBcL0Dk=

转换成二进制文件 ,复制到指定目录:

base64 --decode battery.txt > battery.dat
sudo cp ./battery.dat /usr/share/seabios/battery.dat

</devices>后面添加命令参数:

  <qemu:commandline>
    <qemu:arg value='-acpitable'/>
    <qemu:arg value='file=/usr/share/seabios/battery.dat'/>
  </qemu:commandline>

最后在</qemu:override>前添加下列参数,设备号对照着PCI\VEN_10DE&DEV_134F&SUBSYS_505C17AA&REV_A2修改,4318是16进制10DE的十进制,其他数字同理:

    <qemu:device alias='hostdev1'>
      <qemu:frontend>
        <qemu:property name='x-pci-vendor-id' type='unsigned' value='4318'/>
        <qemu:property name='x-pci-device-id' type='unsigned' value='4943'/>
        <qemu:property name='x-pci-sub-vendor-id' type='unsigned' value='6058'/>
        <qemu:property name='x-pci-sub-device-id' type='unsigned' value='20572'/>
      </qemu:frontend>
    </qemu:device>

如果是qemu 7.0 版本以下的,参数使用 commandline 的方式:

<!-- 在 </qemu:commandline> 之前添加这些参数 -->
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-vendor-id=0x10de'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-device-id=0x134f'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-sub-vendor-id=0x17aa'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-sub-device-id=0x505c'/>
<qemu:arg value='-acpitable'/>
<qemu:arg value='file=/usr/share/seabios/battery.dat'/>

所有工作做完后,启动虚拟机,进入设备管理器,应该能看到3D 控制器类似的字样,右键更新驱动程序,Windows 会自动搜索安装好程序。如果搜索不到,手动下载驱动安装。

安装完效果如下,除了正常的软件可以使用外,玩游戏都不在话下,跟真实电脑一样。

ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!
ubuntu 25.04 qemu 虚拟机 inter 和 nvidia 显卡直通,linux 下游戏3D加速全图详解,一学就会!

一定要严格按照步骤来操作,如果操作不正确,那么在设备管理器里显卡会显示黄色感叹号,显示代码 43 错误,即驱动程序加载失败。

如果按照以上步骤正确操作,还是显示黄色感叹号和43错误,那么最后检查一下pci 总线和设备号,在配置文件里,重点配置一下 address 项里各个设备的 domainbusslot 号,按照以下的设备插槽进行调整:

附件:下面是我的完整 win10.xml 配置:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>win10</name>
  <uuid>3e28d59c-c891-4864-82e1-430ec83ab73a</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-8.2'>hvm</type>
    <loader readonly='yes' secure='no' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
    <nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/qemu/nvram/OVMF_VARS.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode='custom'>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on'/>
      <synic state='on'/>
      <stimer state='on'/>
      <reset state='on'/>
      <vendor_id state='on' value='GenuineIntel'/>
      <frequencies state='on'/>
      <tlbflush state='on'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
    <ioapic driver='kvm'/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='on'/>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/edsolo/qemu/win10.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/home/edsolo/下载/virtio-win-0.1.240.iso'/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='15'>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </controller>
    <controller type='sata' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x10'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x11'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0x12'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0x13'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0x14'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x4'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0x15'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x5'/>
    </controller>
    <controller type='pci' index='7' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='7' port='0x8'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x6'/>
    </controller>
    <controller type='pci' index='8' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='8' port='0x9'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x7'/>
    </controller>
    <controller type='pci' index='9' model='pcie-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='10' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='10' port='0xa'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='11' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='11' port='0xb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </controller>
    <controller type='scsi' index='0' model='virtio-scsi'>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:b0:65:51'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice'>
      <listen type='none'/>
      <image compression='off'/>
      <gl enable='yes'/>
    </graphics>
    <sound model='ich9'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
    </sound>
    <audio id='1' type='spice'/>
    <video>
      <model type='none'/>
    </video>
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on' ramfb='on'>
      <source>
        <address uuid='12e482d1-3b98-457f-8f2b-6eb52370e0e0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x0a' slot='0x00' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      </source>
      <rom bar='off'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
    </hostdev>
    <watchdog model='itco' action='reset'/>
    <memballoon model='none'/>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-acpitable'/>
    <qemu:arg value='file=/usr/share/seabios/battery.dat'/>
  </qemu:commandline>
  <qemu:override>
    <qemu:device alias='hostdev0'>
      <qemu:frontend>
        <qemu:property name='x-igd-opregion' type='bool' value='true'/>
        <qemu:property name='driver' type='string' value='vfio-pci-nohotplug'/>
        <qemu:property name='xres' type='unsigned' value='1366'/>
        <qemu:property name='yres' type='unsigned' value='768'/>
        <qemu:property name='romfile' type='string' value='/usr/share/seabios/vbios_gvt_uefi.rom'/>
      </qemu:frontend>
    </qemu:device>
    <qemu:device alias='hostdev1'>
      <qemu:frontend>
        <qemu:property name='x-pci-vendor-id' type='unsigned' value='4318'/>
        <qemu:property name='x-pci-device-id' type='unsigned' value='4943'/>
        <qemu:property name='x-pci-sub-vendor-id' type='unsigned' value='6058'/>
        <qemu:property name='x-pci-sub-device-id' type='unsigned' value='20572'/>
      </qemu:frontend>
    </qemu:device>
  </qemu:override>
</domain>
小问题:

MUXless 架构的笔记本电脑,虚拟机直通显卡后,几乎所有的渲染都是由 intel 核显输出的,直通的NVIDIA 显卡几乎起不到作用。所以直通 NVIIDIA 显卡只是一种花里胡哨的技术秀,没有多大的意义。除非是笔记本有单独的独显输出,这时候就有意义了。

参考文献:

Nvidia GPU passthrough with QEMU on Lenovo ThinkPad P53

笔记本 Optimus MUXless 下的 Intel 和 NVIDIA 虚拟机显卡直通

Ubuntu 22.04直通显卡给虚拟机使用 – alx696/share GitHub Wiki

知识拆解

Linux ubuntu 25.04 安装 qemu kvm,运行 win10 虚拟机,保姆级教程,一看就会!

2025-11-19 16:40:02

知识拆解

PINCE——Linux 原生游戏内存修改器,一款替代 Cheat Engine 的强大游戏修改器,Linux 游戏玩家必备神器!

2025-11-19 16:51:21

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索