news 2026/9/19 15:46:59

银河麒麟V11下KVM GPU直通实战:GT 710直通Win10虚拟机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
银河麒麟V11下KVM GPU直通实战:GT 710直通Win10虚拟机

1. 为什么要在银河麒麟V11上折腾GPU直通

把一块独立显卡完整地"交给"虚拟机使用,这件事在服务器领域早就不是新鲜事了,但放到国产化桌面操作系统上,尤其是银河麒麟V11这种基于较新内核的发行版,踩坑的概率会明显上升。我这次的目标很明确:在一台装有银河麒麟V11的物理机上,通过KVM/QEMU把一块NVIDIA GT 710显卡直通给Windows 10虚拟机,让Win10能真正调用这块卡做图形输出,而不是靠虚拟显卡软渲染。

先说清楚这件事的价值。GT 710是一块非常典型的"亮机卡",功耗低、价格便宜、驱动成熟,很多人手里都有闲置的。把它直通给Win10虚拟机,可以解决几个实际痛点:一是某些只能在Windows下运行的行业软件需要真实的GPU加速;二是虚拟机里跑一些老游戏或者图形工具时,虚拟显卡的性能实在不够看;三是做多系统隔离测试时,希望Windows环境能独占一块物理显卡,避免和宿主机抢资源。

适合读这篇内容的人,应该已经对Linux基本操作不陌生,知道怎么用命令行、会看日志、能自己解决一些依赖问题。如果你连lspci都没用过,建议先补一下Linux设备管理的基础,否则后面排查IOMMU分组的时候会很痛苦。整篇内容我会按照真实操作的顺序来写,包括我实际踩过的坑和最后跑通的配置,你可以直接照着复现。

需要提前说明的是,GPU直通对硬件有硬性要求,不是所有主板和CPU都支持。Intel平台需要CPU支持VT-d,AMD平台需要支持AMD-Vi,主板BIOS里必须能开启IOMMU。如果这两点不满足,后面的操作一步都走不下去。GT 710本身是支持直通的,它没有那些消费级新卡常见的复位问题,这一点反而比很多高端卡省心。

2. 动手前的硬件与系统底子确认

2.1 确认CPU虚拟化与IOMMU能力

第一步永远是确认硬件底子。打开终端,先看CPU是否支持必要的虚拟化指令:

grep -E "vmx|svm" /proc/cpuinfo | head -1

Intel平台出现vmx、AMD平台出现svm,说明CPU虚拟化是开的。如果什么都没有,先去BIOS里把虚拟化打开。接着确认IOMMU支持:

dmesg | grep -i -e DMAR -e IOMMU

这条命令的输出很关键。如果能看到DMAR: IOMMU enabled之类的字样,说明IOMMU已经在内核层面启用了。如果什么都没输出,通常意味着BIOS里的VT-d/AMD-Vi没开,或者内核启动参数里没有开启IOMMU。

银河麒麟V11默认内核一般已经编译了IOMMU支持,但启动参数需要手动加。编辑GRUB配置:

sudo vi /etc/default/grub

找到GRUB_CMDLINE_LINUX这一行,Intel平台加上intel_iommu=on iommu=pt,AMD平台加上amd_iommu=on iommu=ptiommu=pt这个参数的意思是"passthrough模式",只对需要直通的设备启用IOMMU翻译,能减少不必要的性能开销。改完之后更新GRUB并重启:

sudo update-grub sudo reboot

注意:银河麒麟V11部分版本用的是grub2-mkconfig而不是update-grub,如果第一条命令报错,换成sudo grub2-mkconfig -o /boot/grub2/grub.cfg。重启后一定要再用dmesg | grep -i IOMMU确认参数生效了,别急着往下走。

2.2 检查IOMMU分组是否干净

IOMMU分组是GPU直通里最容易翻车的地方。简单说,直通的最小单位是"一个IOMMU组",组里的所有设备必须一起直通。如果GT 710和别的关键设备(比如网卡、USB控制器)分在同一个组里,你就没法单独把它摘出来给虚拟机。

查看分组情况:

for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*} printf 'IOMMU Group %s ' "$n" lspci -nns "${d##*/}" done

输出会按组列出设备。找到GT 710所在的那一行,看它所在的组里还有没有别的设备。理想情况是GT 710独占一个组,或者同组里只有它的音频功能(显卡通常带一个HDMI音频设备,这两个一起直通是正常的)。

如果GT 710和别的设备混在一个组里,有几个处理思路。最彻底的是把主板BIOS里的ACS(Access Control Services)打开,很多主板默认关闭,打开后分组会变干净。如果BIOS没有这个选项,可以尝试内核参数pcie_acs_override=downstream,multifunction,但这个参数有安全副作用,只建议在测试环境用。我这次用的主板ACS选项藏得比较深,在"高级"→"PCI子系统设置"里面,打开之后GT 710就单独成组了。

2.3 屏蔽宿主机对GT 710的占用

这一步经常被忽略,但非常关键。宿主机启动时会自动加载NVIDIA驱动去接管GT 710,等你启动虚拟机的时候,设备已经被占用了,直通必然失败。所以要在宿主机层面把这块卡"隔离"出来,不让任何驱动碰它。

先查一下GT 710的设备ID:

lspci -nn | grep -i nvidia

输出类似01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208B [GeForce GT 710] [10de:128b],方括号里的10de:128b就是厂商ID和设备ID。记下来,然后配置vfio-pci驱动绑定:

sudo vi /etc/modprobe.d/vfio.conf

写入:

options vfio-pci ids=10de:128b,10de:0e0f

这里的10de:0e0f是GT 710的HDMI音频设备ID,用lspci -nn能看到,通常和显卡在同一个IOMMU组,一起绑定。接着确保vfio-pci在启动时优先加载:

sudo vi /etc/modules-load.d/vfio.conf

写入:

vfio vfio_iommu_type1 vfio_pci vfio_virqfd

还要把NVIDIA驱动加入黑名单,防止它抢先绑定:

sudo vi /etc/modprobe.d/blacklist-nvidia.conf

写入:

blacklist nouveau blacklist nvidia blacklist nvidiafb

更新initramfs让配置生效:

sudo update-initramfs -u -k all sudo reboot

重启后验证绑定结果:

lspci -nnk -d 10de:128b

如果输出里Kernel driver in use:显示的是vfio-pci,说明隔离成功。如果还是nvidia或者nouveau,说明黑名单没生效,回去检查配置文件的路径和内容。

3. KVM/QEMU环境搭建与虚拟机创建

3.1 安装虚拟化组件

银河麒麟V11的软件源里已经包含了完整的KVM/QEMU套件,直接装就行:

sudo apt update sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager ovmf

这里解释一下每个包的作用。qemu-kvm是核心的虚拟化引擎;libvirt-daemon-system提供后台管理服务;libvirt-clients是命令行工具;bridge-utils用来配网络桥接;virt-manager是图形化管理界面,新手用起来方便;ovmf是UEFI固件,Win10虚拟机建议用UEFI启动,比传统BIOS更稳定。

装完之后把当前用户加入libvirt组,免得每次都要sudo:

sudo usermod -aG libvirt $USER sudo usermod -aG kvm $USER

重新登录一次让组权限生效。然后确认libvirtd服务在跑:

sudo systemctl enable --now libvirtd sudo systemctl status libvirtd

提示:如果银河麒麟V11的源里找不到某个包,先确认软件源配置是否正确。国产系统的源有时候和标准Debian/Ubuntu不完全一致,必要时可以手动添加官方源或者用离线包安装。

3.2 配置网络桥接

虚拟机要联网,最省心的方式是桥接模式,让虚拟机直接拿到局域网IP。先看宿主机用的是哪个网卡:

ip a

假设物理网卡是enp3s0,用netplan配置桥接(银河麒麟V11基于较新的网络管理,netplan是主流方式):

sudo vi /etc/netplan/01-netcfg.yaml

内容改成:

network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: no bridges: br0: interfaces: [enp3s0] dhcp4: yes

应用配置:

sudo netplan apply

如果银河麒麟V11用的是NetworkManager而不是networkd,那就用nmcli来建桥:

sudo nmcli connection add type bridge ifname br0 sudo nmcli connection add type ethernet slave-type bridge con-name br0-port ifname enp3s0 master br0 sudo nmcli connection up br0

两种方式选一种就行,看你的系统实际用哪个。配好之后ip a应该能看到br0拿到了IP,而且物理网卡被桥接接管了。

3.3 创建Win10虚拟机并挂载直通显卡

用virt-manager图形界面创建虚拟机最直观。打开virt-manager,点"新建虚拟机",选择本地ISO镜像(Win10的安装镜像),内存建议给4GB以上,CPU给2核以上,磁盘给40GB以上。网络选择刚才建的br0桥接。

创建完成后先别急着启动,需要在虚拟机配置里加上直通设备。在virt-manager里打开虚拟机详情,点"添加硬件"→"PCI主机设备",找到GT 710对应的那两项(VGA和音频),勾选添加。

但图形界面有时候加不干净,我习惯直接编辑XML。先关掉虚拟机,然后:

sudo virsh edit win10

<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>

这里的bus='0x01' slot='0x00'要根据你实际的lspci结果改。同时把虚拟显卡改成none或者保留一个基础的qxl用于安装阶段,等驱动装好后再切。

还有一个关键点:Win10虚拟机建议用UEFI固件。在XML里确认有:

<os firmware='efi'> <type arch='x86_64' machine='q35'>hvm</type> <loader readonly='yes' type='pci'/> <nvram>/var/lib/libvirt/qemu/nvram/win10_VARS.fd</nvram> </os>

machine='q35'比默认的i440fx更适合PCIe直通,能减少很多兼容性问题。

4. 启动虚拟机与驱动安装的实战细节

4.1 首次启动的显示输出问题

第一次启动虚拟机时,因为GT 710已经直通进去了,但Win10还没装NVIDIA驱动,所以显卡可能没有输出。这时候你需要通过virt-manager的虚拟控制台(VNC/SPICE)来完成系统安装。等Win10装好、进入桌面之后,再装NVIDIA驱动。

安装驱动前,先在Win10里确认设备管理器能看到GT 710。如果看到的是"Microsoft基本显示适配器"或者带黄色感叹号的设备,说明硬件已经直通成功,只是缺驱动。去NVIDIA官网下载GT 710对应的驱动,注意选Windows 10 64位版本。GT 710用的是Kepler架构,驱动版本不要太新,太新的驱动可能已经放弃对老架构的支持,建议选470系列或更早的长期支持版本。

装驱动的时候有个坑:如果虚拟机里同时存在虚拟显卡和直通显卡,驱动安装程序可能会认错设备。我的做法是先在XML里把虚拟显卡去掉,只留直通卡,装完驱动再决定要不要加回来。装完驱动重启,设备管理器里应该能看到"NVIDIA GeForce GT 710"正常工作了。

4.2 验证直通是否真正生效

怎么确认Win10真的在用GT 710而不是软渲染?几个验证方法。一是在设备管理器里看显卡状态,没有感叹号就是正常。二是装个GPU-Z,看显卡型号、显存、驱动版本是否识别正确。三是跑个简单的图形测试,比如Windows自带的dxdiag,看显示选项卡里是不是NVIDIA的设备。

如果dxdiag里显示的还是虚拟显卡,说明直通没生效或者驱动没装对。回去检查XML里的hostdev配置,确认bus/slot/function和实际一致。还有一个容易忽略的点:有些主板需要在BIOS里把主显示输出设成核显或者另一块卡,否则宿主机启动时GT 710被占用,vfio-pci绑不上。

4.3 音频直通的额外处理

GT 710的HDMI音频设备也一起直通了,但Win10里可能默认不选它作为输出。在"声音设置"里把输出设备改成"NVIDIA High Definition Audio",如果接的是HDMI显示器,声音就能从显示器出来了。如果不需要音频直通,可以在XML里只保留VGA那一项,把音频的hostdev删掉,减少干扰。

5. 踩坑排查:那些让我卡了半天的环节

5.1 直通后宿主机黑屏或死机

这是最吓人的一种情况。原因通常是宿主机还在用GT 710做显示输出,直通的一瞬间设备被抢走,显示就断了。解决办法是在BIOS里把主显示设成核显(如果CPU有核显)或者另一块独立显卡,让GT 710纯粹作为"待直通设备"存在。如果CPU没有核显,那就只能靠SSH远程操作,或者临时插一块亮机卡给宿主机用。

我这次用的平台有核显,所以把显示器接在主板视频输出上,GT 710完全不参与宿主机的显示,直通过程非常干净。如果你只有一块显卡又要直通,那基本是没法在本机操作的,必须远程。

5.2 虚拟机启动报"device is already in use"

这个报错说明GT 710被宿主机占用了。排查顺序:先lspci -nnk -d 10de:128b看驱动是不是vfio-pci,如果不是,回去检查vfio.conf和黑名单;如果驱动对了但还是报占用,检查是不是有别的虚拟机或者进程在用这块卡,sudo lsof /dev/vfio/*能看出来;还有一种情况是IOMMU分组不干净,同组设备被宿主机驱动占用导致整个组没法直通,那就回到第2.2节处理分组问题。

5.3 Win10里显卡驱动装不上或报错43

错误代码43是GPU直通里的经典问题,通常和显卡复位有关。GT 710相对老实,出现43的概率不高,但如果遇到了,可以尝试几个方向。一是确认虚拟机用的是q35机器类型和UEFI固件;二是在XML里给hostdev加上<rom bar='on'/>;三是检查是不是驱动版本和显卡架构不匹配。还有一个偏方是在Win10里禁用再启用显卡设备,有时候能骗过去。

5.4 性能不如预期

直通成功不代表性能就好。GT 710本身性能有限,别指望它能跑什么大型游戏。如果发现虚拟机里图形性能异常低,检查几点:确认Win10用的是独立显卡输出而不是虚拟显卡;确认虚拟机CPU模式是host-passthrough而不是默认的qemu64,后者会损失大量指令集;确认内存和CPU分配足够。在XML里把CPU模式改成:

<cpu mode='host-passthrough' check='none'/>

这个改动对整体性能提升很明显,建议一开始就配上。

6. 一些让流程更顺的个人经验

整套流程走下来,最耗时间的其实不是配置本身,而是排查各种"看起来应该对但就是不对"的问题。我总结几个能帮你省时间的点。

第一,每改完一处配置就重启验证一次,别攒一堆改动一起重启。IOMMU分组、vfio绑定、黑名单这些环节,任何一个没生效都会导致后面失败,混在一起改根本不知道是哪里的问题。

第二,善用dmesgjournalctl。直通失败时内核日志里通常有明确线索,比如vfio-pci: probe of 0000:01:00.0 failed之类的,比瞎猜高效得多。sudo journalctl -xe能看到libvirt的详细报错。

第三,XML配置改完之后用sudo virsh define重新加载,别直接改运行中的虚拟机。改完可以用sudo virsh dumpxml win10确认配置真的写进去了。

第四,GT 710这种老卡反而比新卡省心,因为它没有那些复杂的电源管理和复位逻辑。如果你手里有更新的NVIDIA卡,直通难度会上升不少,可能需要额外的ROM文件处理。

第五,银河麒麟V11的软件源和标准Debian有差异,遇到包找不到的情况,优先考虑用系统自带的源,实在没有再考虑离线包。国产系统的生态还在完善中,这点要有心理准备。

最后说一句,GPU直通这件事,硬件底子决定了上限,配置细节决定了能不能跑通。同样的步骤在不同主板上结果可能完全不同,所以遇到问题别慌,按IOMMU分组→vfio绑定→虚拟机配置这个顺序一层层排查,基本都能定位到根因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 15:43:55

测控电路实验报告写作指南:信号链分析、误差分配与Python数据处理

简介&#xff1a;《测控电路系列实验报告》是一份面向测控技术与仪器、自动化等相关专业学生的电压测量模块设计实验报告&#xff0c;完整记录了数字电压表从电路搭建、量程粗调、全亮测试、电压测零到精调量程与正反向测量验证的全过程。报告包含实验目的、设计要求、步骤、原…

作者头像 李华
网站建设 2026/9/19 15:40:50

8255驱动蜂鸣器生成方波:硬件级音阶实现原理

简介&#xff1a;本资源是一份面向微机原理与接口技术初学者的实践教学文档&#xff0c;聚焦8255可编程并行接口芯片在音频控制中的典型应用——基于实验仪平台实现简易电子琴。内容完整覆盖硬件连接&#xff08;F5区按键映射至PA口、蜂鸣器接PC7&#xff09;、软件设计&#x…

作者头像 李华
网站建设 2026/9/19 15:40:25

bocker完整命令参考:pull/run/exec/commit等10大命令与docker逐一对照

bocker完整命令参考&#xff1a;pull/run/exec/commit等10大命令与docker逐一对照 【免费下载链接】bocker Docker implemented in around 100 lines of bash 项目地址: https://gitcode.com/gh_mirrors/bo/bocker bocker 是一个用约 100 行 bash 脚本实现的极简版 Dock…

作者头像 李华
网站建设 2026/9/19 15:40:18

电气图转梯形图:核心转换方法、典型实例与常见陷阱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 15:29:21

CANoe离线报文回放:无硬件环境下的总线信号分析与故障定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华