ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

银河麒麟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-dAMD平台需要支持AMD-Vi主板BIOS里必须能开启IOMMU。如果这两点不满足后面的操作一步都走不下去。GT 710本身是支持直通的它没有那些消费级新卡常见的复位问题这一点反而比很多高端卡省心。2. 动手前的硬件与系统底子确认2.1 确认CPU虚拟化与IOMMU能力第一步永远是确认硬件底子。打开终端先看CPU是否支持必要的虚拟化指令grep -E vmx|svm /proc/cpuinfo | head -1Intel平台出现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_iommuon iommuptAMD平台加上amd_iommuon iommupt。iommupt这个参数的意思是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里的ACSAccess Control Services打开很多主板默认关闭打开后分组会变干净。如果BIOS没有这个选项可以尝试内核参数pcie_acs_overridedownstream,multifunction但这个参数有安全副作用只建议在测试环境用。我这次用的主板ACS选项藏得比较深在高级→PCI子系统设置里面打开之后GT 710就单独成组了。2.3 屏蔽宿主机对GT 710的占用这一步经常被忽略但非常关键。宿主机启动时会自动加载NVIDIA驱动去接管GT 710等你启动虚拟机的时候设备已经被占用了直通必然失败。所以要在宿主机层面把这块卡隔离出来不让任何驱动碰它。先查一下GT 710的设备IDlspci -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 ids10de: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组免得每次都要sudosudo 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 modesubsystem typepci managedyes source address domain0x0000 bus0x01 slot0x00 function0x0/ /source /hostdev hostdev modesubsystem typepci managedyes source address domain0x0000 bus0x01 slot0x00 function0x1/ /source /hostdev这里的bus0x01 slot0x00要根据你实际的lspci结果改。同时把虚拟显卡改成none或者保留一个基础的qxl用于安装阶段等驱动装好后再切。还有一个关键点Win10虚拟机建议用UEFI固件。在XML里确认有os firmwareefi type archx86_64 machineq35hvm/type loader readonlyyes typepci/ nvram/var/lib/libvirt/qemu/nvram/win10_VARS.fd/nvram /osmachineq35比默认的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 baron/三是检查是不是驱动版本和显卡架构不匹配。还有一个偏方是在Win10里禁用再启用显卡设备有时候能骗过去。5.4 性能不如预期直通成功不代表性能就好。GT 710本身性能有限别指望它能跑什么大型游戏。如果发现虚拟机里图形性能异常低检查几点确认Win10用的是独立显卡输出而不是虚拟显卡确认虚拟机CPU模式是host-passthrough而不是默认的qemu64后者会损失大量指令集确认内存和CPU分配足够。在XML里把CPU模式改成cpu modehost-passthrough checknone/这个改动对整体性能提升很明显建议一开始就配上。6. 一些让流程更顺的个人经验整套流程走下来最耗时间的其实不是配置本身而是排查各种看起来应该对但就是不对的问题。我总结几个能帮你省时间的点。第一每改完一处配置就重启验证一次别攒一堆改动一起重启。IOMMU分组、vfio绑定、黑名单这些环节任何一个没生效都会导致后面失败混在一起改根本不知道是哪里的问题。第二善用dmesg和journalctl。直通失败时内核日志里通常有明确线索比如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绑定→虚拟机配置这个顺序一层层排查基本都能定位到根因。
返回列表