2026/8/16 1:46:23

PVE双显卡直通实战:核显与独显同时直通配置指南

PVE双显卡直通实战:核显与独显同时直通配置指南 1. 项目缘起为什么要在PVE里折腾双显卡直通最近手头攒了一台“垃圾佬”风格的All-in-One服务器主板是B460CPU是10代酷睿i5-10400自带UHD630核显。为了让它能同时胜任软路由、NAS、Windows轻量级桌面和影音转码等多个角色我额外插了一块非常古老的AMD Radeon R7 240亮机卡。我的目标很明确在Proxmox VE 8.1以下简称PVE这个强大的虚拟化平台上把这两块显卡分别直通给不同的虚拟机让它们各自发挥最大效能。这个想法听起来简单但实际操作起来尤其是在PVE环境下同时处理核显和独立显卡的直通会遇到不少“坑”。网上关于NVIDIA显卡直通或者单张AMD卡直通的教程很多但像这种“核显独显”双直通特别是涉及10代酷睿核显的案例资料就比较零散很多细节需要自己摸索。今天这篇文章我就把自己从规划、踩坑到最终成功配置的全过程以及背后的原理和注意事项毫无保留地分享出来。无论你是想搭建家庭影音服务器、多系统游戏机还是单纯想榨干老旧硬件的剩余价值这篇实战记录都能给你提供一条清晰的路径。2. 硬件与平台准备理清思路避免走弯路在动手之前我们必须对硬件和平台有一个清晰的认识。盲目操作很容易导致直通失败甚至让宿主系统不稳定。2.1 硬件清单与角色规划我的硬件配置是这次实践的基础你的配置可能不同但思路是相通的宿主机/服务器CPU: Intel Core i5-10400 (6核12线程集成UHD630核显)主板: 微星B460M MORTAR (关键需要支持VT-d/AMD-Vi虚拟化技术并在BIOS中开启)独立显卡: AMD Radeon R7 240 (2GB GDDR5 非常老旧的GCN 1.0架构显卡)内存: 32GB DDR4存储: NVMe SSD (安装PVE系统) 多块SATA HDD/SSD网络: 板载Intel i219-V千兆网卡 PCIe Intel i350-T4四口千兆网卡虚拟机角色与显卡分配规划 这是核心思路。我的目标不是让一个虚拟机同时用两块显卡通常没必要而是让不同的虚拟机独占不同的显卡资源。AMD R7 240 直通给 Windows 10/11 虚拟机用于远程桌面RDP、轻度办公、挂机下载或者安装驱动后用于一些老的、对DirectX有要求的应用。R7 240性能虽弱但直通后可以提供完整的Windows桌面体验比虚拟显卡流畅得多。Intel UHD630 核显直通给 Linux 虚拟机 (如Jellyfin/Emby/Plex)这是本次操作的最大价值点。核显的媒体编解码能力非常强大且功耗极低直通给媒体服务器虚拟机后可以硬件解码/编码多种视频格式极大减轻CPU负担实现多路高清视频实时转码。注意一个常见的误区是认为直通后宿主机的显示输出会失效。实际上PVE宿主机本身是纯命令行环境不需要图形界面。在系统启动初期BIOS/主板会使用某个显卡通常是第一个PCIe插槽的独显或主板输出口的核显来显示启动信息。进入PVE系统后这个显示输出就闲置了。直通操作就是把这个“闲置”的显卡控制器完全交给虚拟机与宿主机彻底分离。2.2 Proxmox VE 8.1 基础安装与配置如果你还没有安装PVE请先完成这一步。安装过程比较简单从官网下载ISO镜像制作启动盘像安装普通Linux系统一样操作即可。这里强调几个对后续直通至关重要的初始配置BIOS/UEFI设置这是成功的基石。必须进入主板BIOS确保以下选项已开启Intel Virtualization Technology (VT-x)CPU硬件虚拟化支持。Intel VT-d 或 AMD-Vi (IOMMU)输入输出内存管理单元支持。这是设备直通的硬件基础。不同主板位置不同通常在“高级”-“CPU配置”或“芯片组配置”里。Above 4G Decoding如果使用大量PCIe设备或某些显卡开启此选项有助于系统识别高位址内存。CSM (Compatibility Support Module)对于较老的显卡如R7 240如果UEFI启动不识别可能需要开启CSM并设置启动方式为“Legacy”或“UEFI and Legacy”。不过优先尝试UEFI模式。配置PVE软件源与更新安装完成后通过网页访问PVE管理界面https://你的服务器IP:8006。首先建议更换为国内软件源以加速更新。通过Shell或SSH连接到PVE宿主机编辑APT源列表文件。# 备份原文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak # 编辑文件注释掉企业源添加Debian和PVE社区源以清华源为例 nano /etc/apt/sources.list将内容替换为适用于PVE 8.xdeb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-backports main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm pve-no-subscription然后更新系统apt update apt dist-upgrade -y更新后重启宿主机。3. 核心原理与前置操作开启IOMMU与识别设备直通的本质是让虚拟机绕过宿主机的操作系统直接与硬件设备对话。这需要CPU和主板芯片组的IOMMU功能作为“保安”和“翻译官”为每个设备划分独立的内存访问空间防止设备间相互干扰。3.1 启用IOMMU并验证分组PVE默认不启用IOMMU我们需要手动修改内核引导参数。编辑GRUB配置nano /etc/default/grub找到GRUB_CMDLINE_LINUX_DEFAULT这一行。对于Intel平台添加intel_iommuon iommupt。pt(Passthrough) 模式对不需要IOMMU隔离的设备性能更友好。 修改后可能类似GRUB_CMDLINE_LINUX_DEFAULTquiet intel_iommuon iommupt对于AMD平台则是amd_iommuon iommupt。更新GRUB并重启update-grub reboot验证IOMMU是否启用重启后运行以下命令检查dmesg | grep -e DMAR -e IOMMU如果看到DMAR: IOMMU enabled或类似信息说明成功。查看IOMMU分组这是最关键的一步决定了哪些设备可以单独直通。# 使用这个脚本可以清晰列出所有PCI设备及其IOMMU组 for d in /sys/kernel/iommu_groups/*/devices/*; do n${d#*/iommu_groups/*}; n${n%%/*}; printf IOMMU Group %s $n; lspci -nns ${d##*/}; done仔细查看输出。一个理想的直通设备应该独占一个IOMMU组。如果它和别的设备比如主板上的USB控制器、SATA控制器在同一个组里直通时就必须把整个组一起直通这通常不可行或会导致问题。以我的环境为例输出中会找到AMD R7 240它通常位于一个独立的IOMMU组里比如[10de:13c2](这是示例实际是AMD的ID)这是最好的情况。Intel UHD630 核显情况复杂一些。核显不是一个标准的PCIe设备它集成在CPU里但会通过主板显示输出。在IOMMU分组中它可能显示为[8086:9bc8](UHD630的设备ID)并且很可能与一些“主机桥”Host Bridge或“PCI Express根端口”设备在同一个组。这是Intel平台的常见情况需要特殊处理。3.2 处理核显直通的关键隐藏与驱动绑定核显直通比独立显卡更棘手因为宿主机PVE的Linux内核在启动时可能会自动加载i915驱动来管理它这会导致直通时出现“设备忙”的错误。我们的目标是在宿主机启动时就“忽略”这个核显把它预留出来给虚拟机。将核显驱动加入黑名单阻止宿主机加载驱动。echo blacklist i915 /etc/modprobe.d/pve-blacklist.conf但这还不够因为内核本身可能在内核级就初始化了设备。通过内核参数提前预留设备这是更可靠的方法。编辑GRUB配置在之前的内核参数后追加videovesafb:off,efifb:off以及核显的ID。nano /etc/default/grub将GRUB_CMDLINE_LINUX_DEFAULT行修改为类似GRUB_CMDLINE_LINUX_DEFAULTquiet intel_iommuon iommupt videovesafb:off,efifb:off initcall_blacklistsysfb_initvideovesafb:off,efifb:off禁用内核帧缓冲驱动占用显示设备。initcall_blacklistsysfb_init阻止系统帧缓冲初始化对于某些顽固的核显占用问题非常有效。使用vfio-pci驱动提前绑定vfio-pci是Linux上用于设备直通的通用驱动。我们可以在系统启动早期就强制让核显使用这个驱动从而被“隔离”。 首先需要获取核显的PCI设备ID。使用lspci -nn命令。lspci -nn | grep -i vga输出可能类似00:02.0 VGA compatible controller [0300]: Intel Corporation CometLake-S GT2 [UHD Graphics 630] [8086:9bc8] (rev 03)记下ID8086:9bc8。 创建VFIO配置文件nano /etc/modprobe.d/vfio.conf添加内容将核显和可能关联的音频设备如果有的ID加进去options vfio-pci ids8086:9bc8,8086:9bc9 disable_vga1disable_vga1参数有助于进一步禁用VGA兼容模式。 然后确保vfio-pci驱动在启动时尽早加载。编辑模块文件nano /etc/modules-load.d/modules.conf添加一行vfio-pci更新initramfs并重启让所有更改生效。update-initramfs -u -k all update-grub reboot重启后再次运行lspci -nnk查看核显的“Kernel driver in use”是否变成了vfio-pci。如果是恭喜核显已经被成功隔离。4. 实战步骤一创建虚拟机与配置直通现在硬件和系统层面的准备已经就绪我们开始在PVE的Web管理界面中进行操作。4.1 创建Windows虚拟机用于AMD R7 240创建虚拟机点击右上角“创建VM”。操作系统选择Windows 10/11的ISO镜像。客户机类型选择Microsoft Windows版本对应。系统固件选择UEFI (OVMF)。这非常重要对于较新的硬件和显卡直通UEFI比SeaBIOS兼容性更好。TPM可以根据需要添加Win11需要。磁盘总线选择VirtIO SCSI性能最好。但注意Windows安装时默认没有VirtIO驱动需要提前下载并加载驱动。或者先使用SATA总线安装之后再加VirtIO驱动。CPU类型选择host这样虚拟机可以看到CPU的所有特性如指令集性能最佳。核心数根据需求分配。内存分配足够内存例如8GB或16GB。网络模型选择VirtIO (paravirtualized)性能最佳。添加PCI设备直通AMD显卡在虚拟机硬件配置页面点击“添加” - “PCI设备”。在“设备”下拉列表中你应该能看到你的AMD R7 240显卡。它可能显示为[10de:13c2]之类的ID以及设备名称。关键选项所有功能勾选。这允许虚拟机完全控制设备。ROM-Bar勾选。对于显卡尤其是老显卡加载其自身的VBIOS/ROM有助于初始化。PCI-Express如果显卡是PCIe的勾选。添加后该设备会出现在硬件列表中。暂时不要启动虚拟机。配置虚拟机启动参数为了让直通显卡能正常工作尤其是作为主显示输出需要编辑虚拟机的配置文件。通过SSH连接到PVE宿主机。虚拟机配置文件位于/etc/pve/qemu-server/VM-ID.conf其中VM-ID是你的虚拟机ID如100。编辑这个文件nano /etc/pve/qemu-server/100.conf在文件末尾或在args:行后添加以下参数args: -cpu host,kvmoff,hypervisoroffkvmoff和hypervisoroff这两个参数会向虚拟机隐藏虚拟化特征。某些显卡驱动特别是NVIDIA的消费级驱动会检测到运行在虚拟机中并拒绝工作。AMD驱动通常不这么严格但加上也无妨。同时确保有machine: q35这一行使用OVMF时默认是q35。q35芯片组比旧的pc-i440fx对PCIe直通支持更好。4.2 创建Linux虚拟机用于Intel UHD630核显创建虚拟机再次点击“创建VM”。操作系统选择你喜欢的Linux发行版ISO例如Ubuntu Server 22.04 LTS。系统固件同样选择UEFI (OVMF)。磁盘、CPU、内存、网络配置同上根据需求分配。添加PCI设备直通核显在硬件页面添加PCI设备。这次选择你的Intel UHD Graphics 630设备。同样勾选“所有功能”、“ROM-Bar”和“PCI-Express”。特别注意核显通常关联一个HD Audio控制器用于音频输出。在lspci输出中它通常在核显设备的下方ID类似[8086:9bc9]。强烈建议将这个音频控制器也一并直通给同一个Linux虚拟机否则直通的显卡可能没有音频输出能力。在PVE界面中将它作为另一个PCI设备添加进去。配置虚拟机启动参数同样需要编辑这个Linux虚拟机的配置文件。nano /etc/pve/qemu-server/101.conf添加相同的args参数args: -cpu host,kvmoff,hypervisoroff对于核显可能还需要添加一个特定的设备映射参数来传递EDID显示器信息避免虚拟机分辨率异常。这可以在虚拟机启动后通过virsh edit或在配置文件中添加args来实现但更简单的方法是先启动看看如果有问题再处理。5. 启动、驱动安装与问题排查配置完成后就可以启动虚拟机了。但启动顺序有讲究。5.1 启动顺序与显示输出先启动Linux核显虚拟机因为核显被我们从宿主机隔离了如果先启动Windows虚拟机并占用了独显你可能无法通过任何显示输出来操作PVE的Web界面除非你有IPMI或另一张显卡。先启动Linux虚拟机它使用核显不影响宿主机管理。启动后你需要通过VNC或SPICE连接来安装系统。此时直通的核显可能还没被Linux系统驱动起来所以虚拟机内的显示仍然靠虚拟显卡VNC/SPICE。安装好系统后进入系统安装必要的驱动。对于Intel核显在Linux下的驱动通常是intel-media-va-driver-non-free和intel-gpu-tools。在Ubuntu/Debian上sudo apt update sudo apt install intel-media-va-driver-non-free intel-gpu-tools vainfo安装后运行vainfo检查VA-API硬件加速是否正常。运行intel_gpu_top可以查看核显负载。再启动Windows独显虚拟机通过VNC连接安装Windows系统。安装完成后不要指望在VNC窗口里看到画面因为显卡已经直通输出信号会直接传到显卡的物理接口HDMI/DP/VGA。你需要将一台物理显示器连接到AMD R7 240显卡的输出口上。在显示器上你应该能看到Windows的启动画面。进入系统后安装AMD官方为R7 240提供的显卡驱动。驱动安装成功后设备管理器里应该能正确识别显卡没有感叹号。5.2 常见问题与排查问题1启动虚拟机时报错 “device is currently in use” 或 “failed to reset device”。原因设备没有被成功隔离宿主机或其他进程仍占用着。排查运行lspci -nnk检查目标设备的“Kernel driver in use”是否已经是vfio-pci。如果不是回到第3.2节检查VFIO绑定步骤。运行dmesg | grep -i vfio查看是否有绑定错误信息。检查IOMMU分组确认没有其他关键设备如主板芯片组和显卡绑在同一组导致无法单独直通。问题2Windows虚拟机启动后直通显卡的显示器黑屏或无信号。原因A显卡ROM加载问题。尝试在PVE的PCI设备配置中不勾选“ROM-Bar”或者反之。对于老显卡有时需要手动提取显卡BIOS ROM文件并指定。原因BUEFI/GOP支持问题。较老的显卡如R7 240可能对UEFI的GOPGraphics Output Protocol支持不好。可以尝试将虚拟机固件从OVMF (UEFI)改为SeaBIOS。或者在OVMF下编辑虚拟机配置文件在args:中添加-global drivercfi.pflash01,propertysecure,valueoff等参数尝试关闭安全启动效果有限。原因C宿主机没有成功隐藏虚拟化特征。确保args:中包含了kvmoff,hypervisoroff。问题3核显直通给Linux后vainfo显示不支持硬件加速或报错。原因可能是i915驱动冲突或权限问题。排查在Linux虚拟机内运行ls -l /dev/dri/查看渲染设备。确保renderD128等设备存在且用户有访问权限。可以将用户加入video和render组sudo usermod -aG video,render $USER。检查内核是否加载了正确的i915驱动lsmod | grep i915。应该能看到i915模块。对于容器如LXC直通核显情况更复杂需要将/dev/dri设备映射到容器内并处理权限本文不展开。问题4直通后宿主机会不定期死机或重启。原因这可能是最棘手的问题通常与ACSAccess Control Services覆盖、PCIe电源管理或硬件本身兼容性有关。尝试解决ACS覆盖在GRUB内核参数中添加pcie_acs_overridedownstream,multifunction。这可以强制拆分IOMMU组但有一定风险。编辑/etc/default/grub在参数行加入然后update-grub并重启。禁用PCIe电源管理在GRUB参数中添加pcinoaer pcie_aspmoff。更新主板BIOS到主板官网下载最新BIOS并刷新有时能解决兼容性问题。6. 性能调优与应用场景验证当两台虚拟机都能正常启动并识别直通显卡后我们可以进行一些调优和功能验证。6.1 Windows虚拟机优化远程桌面体验虽然显卡已直通但Windows自带的远程桌面RDP会话默认使用虚拟显示驱动。要利用直通显卡的硬件加速进行远程桌面需要保持一个物理显示器或虚拟显示器欺骗器如ddummy驱动或物理的HDMI欺骗头连接到显卡上并且本地用户要登录。或者可以使用第三方远程工具如Parsec、Moonlight需要NVIDIA GPU或Steam Link它们能更好地利用GPU进行编码传输。显卡驱动务必从AMD官网下载并安装最新的、支持你操作系统版本的驱动。老旧的R7 240可能已经停止支持最新版驱动需要寻找旧版的WHQL驱动。6.2 Linux虚拟机媒体服务器优化这是核显直通价值最大的地方。以Jellyfin为例安装Jellyfin按照官方指南安装Jellyfin服务。配置硬件转码进入Jellyfin管理后台通常为http://虚拟机IP:8096。进入控制台 - 播放。在硬件加速选项中选择Video Acceleration API (VA-API)。在VA-API 设备中通常填写/dev/dri/renderD128。开启所有你需要的编码和解码选项如H.264, HEVC, VP9等。验证转码找一部高码率的视频如4K H.265在客户端如手机、电视上播放并设置为需要转码例如强制烧录字幕或降低码率。回到Linux虚拟机运行intel_gpu_top命令。你应该能看到Video/0引擎的利用率显著上升而CPU利用率保持低位。这证明核显正在成功进行硬件转码。在Jellyfin的控制台 - 播放 - 转码中也可以看到正在进行的硬件转码会话。6.3 资源隔离与性能考量CPU钉选Pinning为了避免虚拟机之间争抢CPU资源尤其是对延迟敏感的应用可以考虑使用CPU钉选。在PVE虚拟机的“CPU”设置里你可以指定虚拟机只使用特定的物理CPU核心。例如将Windows虚拟机钉在0-5核Linux虚拟机钉在6-11核对于i5-10400的6核12线程。NUMA架构如果你的服务器是双路或多路CPU需要注意NUMA节点。将PCIe设备如显卡和其所在的CPU核心分配给同一个虚拟机可以获得最佳性能。对于单路i5-10400通常不用考虑。内存大页对于追求极致性能的场景如游戏虚拟机可以启用内存大页Hugepages减少内存管理开销。但这需要更多的配置且对大多数应用提升不明显。7. 总结与个人心得经过这一番折腾我的PVE服务器终于实现了AMD R7 240独显和Intel UHD630核显的双直通。Windows虚拟机获得了独立的图形处理能力可以流畅运行一些老游戏或作为远程桌面工作站而Linux媒体服务器则独享了核显强大的编解码引擎轻松应对多路4K视频转码CPU占用率大幅下降。回顾整个过程有几个点我觉得特别值得分享首先信息搜集和规划比盲目动手更重要。在开始之前我花了大量时间查阅PVE官方Wiki、Reddit上的相关讨论以及中文技术博客。了解IOMMU分组的概念、核显直通的特殊性需要提前绑定vfio驱动、屏蔽宿主机驱动让我避开了很多初级错误。尤其是对于10代酷睿的核显很多教程是基于更老的平台直接套用可能会失败。其次耐心和细致的排查是关键。直通失败时错误信息往往很模糊。我养成了查看dmesg、journalctl日志的习惯并且学会了使用lspci -nnk和ls -l /sys/bus/pci/devices/0000:xx:xx.x/driver这样的命令来精确查看设备状态和驱动绑定情况。例如有一次核显直通失败就是因为关联的音频设备没有一起绑定到vfio-pci导致整个IOMMU组无法分离。再者硬件兼容性是玄学但有其规律。AMD R7 240这种老卡在UEFI模式下有时就是无法正常初始化。我的解决方法是先尝试SeaBIOS安装好系统驱动后再尝试切换回OVMF并手动添加一些内核启动参数。对于核显initcall_blacklistsysfb_init这个参数在我的B460主板上起到了决定性作用解决了启动时核显被fbcon占用的顽疾。最后备份和记录每一步操作。在修改GRUB配置、黑名单驱动、编辑虚拟机配置文件之前我都会先进行备份。每做一次修改我都会在笔记里记录下命令和目的。这样当系统无法启动时我可以快速回滚到上一个可用的状态而不是重头再来。这个项目不仅让我获得了一台功能强大的All-in-One服务器更让我对Linux内核的设备管理、PCIe总线、虚拟化底层原理有了更深入的理解。虚拟化技术给了我们极大的灵活性但要想玩得转就必须愿意深入这些细节。希望我的这份踩坑实录能为你点亮前行的路让你在构建自己的虚拟化环境时少走些弯路。记住每个硬件组合都是独特的遇到问题时结合原理进行逻辑分析和排查远比照搬教程更有效。