ESXi 7.0 上给 N 卡做显卡直通这件事,我第一次干的时候整整耗掉两个周末,最后发现问题出在内存预留没勾。后来帮同事、帮朋友前前后后配了十几台机器,从 GTX 1060 一路做到 RTX 4090,踩过的坑基本能凑成一本小册子。这篇就把整个流程从硬件固件层面一路讲到客户机里装驱动,把 ESXi 7.0 配置 N 卡显卡直通这件事拆开揉碎说明白。
先说清楚这东西是干什么的。显卡直通(PCIe Passthrough),本质是把主机上的一张物理显卡从宿主机手里"摘"出来,整条设备完整地交给某一台虚拟机独占使用。虚拟机里跑出来的图形性能接近裸机,能打游戏、能跑 CUDA、能做视频硬编解码,而不是那种靠 VMware 虚拟显卡或者软件渲染凑合的方案。ESXi 7.0 对直通的支持已经相当成熟,操作入口也集中在主机客户端里,难度主要在细节。
适合看这篇的人有三类:一是在家里搞了一台服务器想同时跑 NAS、软路由、Windows 游戏机,想用一张 N 卡把游戏机喂饱的折腾党;二是要给虚拟机里的 AI 训练、视频转码留一块真显卡的技术从业者;三是已经开了直通但一直卡在黑屏、开机失败、设备代码 43 上的同学。全文不涉及任何授权绕过,免费版 ESXi 的直通功能本身就够用,下面所有内容都基于正常的主机模式操作。
1. 先想清楚为什么直通,以及它到底解决了什么问题
1.1 显卡虚拟化的三条路,别选错
在 ESXi 上让虚拟机用上显卡,一共有三条完全不同的路,很多人一上来就选错方向,后面全是无用功。
第一条是软件渲染,也就是默认的 VMware SVGA 设备,靠 CPU 模拟图形指令。好处是零成本、随便加、支持多虚拟机共享,坏处是性能惨不忍睹,跑个桌面还行,开个 3D 软件基本是幻灯片。这种方式适合办公虚拟机、测试机,不适合任何跟图形性能沾边的场景。
第二条是vGPU,把一张专业卡(比如 NVIDIA 的 A 系列、以前的 Tesla 系列)切成若干份,同时分给多台虚拟机,每台拿到一部分显存和计算单元。这是数据中心方案,需要专门的支持 vGPU 的卡、需要额外授权、需要往 ESXi 里装对应的驱动 VIB。消费级 GeForce 卡是走不通这条路的,别去研究。
第三条就是本文要讲的整卡直通,把一张卡整块给一台虚拟机,独占使用。这条路对显卡型号几乎没要求,GeForce、Quadro、Tesla 全都能上,一张卡只能给一台虚拟机。它的性价比最高,代价是失去了硬件共享和多虚拟机并发能力。家用场景、单人开发场景,这一条就是最优解。
提示:直通不需要在 ESXi 主机上安装任何 NVIDIA 驱动 VIB。你在主机上跑
nvidia-smi是跑不出来的,那是 vGPU 路线的产物。很多人被网上的教程带偏,在主机上折腾驱动半天,方向就错了。
1.2 什么场景值得折腾,什么场景纯属浪费
我自己的判断标准很简单:看你需不需要 GPU 的完整能力。
如果你只是想在一台 Windows 虚拟机里开个浏览器、跑个 Excel、远程桌面办公,那完全不需要直通,软件渲染绰绰有余,省下来的显卡还能给别的虚拟机用。如果你要在虚拟机里跑 Stable Diffusion、跑本地大模型推理、做达芬奇调色、做 4K 硬编转码、玩 3A 游戏,那直通就是唯一答案。
还有一类容易被忽略的场景是显卡的硬编解码单元。N 卡的 NVENC/NVDEC 在直通模式下是完全可用的,这意味着你可以把一台 ESXi 主机做成一个视频转码节点,虚拟机里跑 Jellyfin 或者 ffmpeg,靠 N 卡硬件加速,CPU 占用能压到个位数。这个用法我实测下来非常稳,值得单独拿出来说。
反过来,有几种情况我劝你别折腾:主机只有一张显卡而且这块卡还负责 ESXi 的控制台输出、主板 BIOS 不支持 IOMMU、机器内存不足以给虚拟机做全量预留——这三条任意一条中招,成功率都极低。
1.3 直通的代价要先接受
直通不是一个"开了就更好"的开关,它有实打实的代价,事先说清楚比事后骂街强。
第一,这张卡在宿主机上彻底不可用了。直通之后 ESXi 自己看不见它、用不了它,主机也不能再拿它做任何输出。你想让 ESXi 的控制台有画面,就得靠主板集显、IPMI/BMC 远程管理口,或者干脆盲操作加 SSH。第二,一台虚拟机的显卡出事会拖累整台虚拟机,比如驱动崩溃导致虚拟机无法正常关机,你得强制断电。第三,直通设备会阻止虚拟机的部分高级操作,比如快照、内存热添加,在挂着 PCI 直通设备时都要先摘掉设备才能做。
第四点最容易被忽略:内存必须全量预留。为了配合 DMA 重映射,虚拟机的全部内存都得锁定在物理内存里,不能参与内存超分。你给虚拟机 32GB,宿主机就实打实少 32GB 可用。这点在规划主机内存时必须提前算进去,别配完才发现内存不够。
2. 硬件与固件侧的准备,八成失败卡在这一步
2.1 CPU 与主板的 IOMMU 开关
显卡直通的地基是 IOMMU。Intel 平台叫 VT-d,AMD 平台叫 AMD-Vi / IOMMU。CPU 本身要支持(近十年的桌面和服务器 CPU 基本都支持,极少数低端型号阉割了),主板 BIOS 里还要手动打开。很多主板出厂默认是关闭的,这是第一个坑。
打开的方法因主板而异,通常在 BIOS 的 Advanced → CPU Configuration,或者 Advanced → System Agent Configuration 里面。华硕、微星、技嘉的叫法都不太一样,找关键词 VT-d、IOMMU、SVM 就对了。
打开之后怎么在 ESXi 里验证?SSH 登录主机,敲这条:
esxcli hardware pci list | grep -i "IOMMU"更直接的验证方式是看直通页面:如果能正常看到显卡并且"切换直通"按钮是可点的,说明 IOMMU 基本生效了。如果整页 PCI 设备都显示不支持直通,那八成是 BIOS 没开。
2.2 Above 4G Decoding 和 Resizable BAR 怎么取舍
这两个选项是新手最容易翻车的地方,我把它们放一起讲。
Above 4G Decoding必须开。现代 N 卡的 BAR 空间动辄好几个 GB,BIOS 如果只给 32 位地址空间(4GB 以下),根本没地方放这些地址窗口,直通时主机就没法给显存映射分配地址,结果就是虚拟机开机直接失败。服务器主板一般默认开启,消费级主板有时候是 Auto,建议手动设成 Enabled。
Resizable BAR(AMD 那边叫 Smart Access Memory)建议先关。它让 CPU 可以一次性访问显卡的全部显存而不是每次 256MB,游戏帧数能提升几个百分点。但开启之后,显卡会向系统申请一个等于显存容量的地址窗口,比如 24GB 的卡就申请 24GB 的地址空间,这会直接推高虚拟机侧 64 位 MMIO 窗口的需求。直通调试阶段建议先关掉,等直通稳定跑起来之后再回头开,看能不能接受。我自己的机器上是关的,那几个点的帧数换来的调试复杂度不划算。
| BIOS 选项(各厂叫法不同) | 建议值 | 作用 |
|---|---|---|
| Intel VT-d / AMD IOMMU | Enabled | 让设备能被安全地交给虚拟机独占 |
| Above 4G Decoding | Enabled | 给大 BAR 设备留出 4G 以上的地址空间 |
| Resizable BAR / SAM | Disabled(调试阶段) | 避免显存窗口过大导致 MMIO 不够 |
| Primary Display / Init Display | 集显或自带管理芯片 | 防止宿主机抢占独显做控制台 |
| SR-IOV | 按需 | 只有 vGPU / 网卡虚拟化才需要 |
2.3 主显示输出给谁,别让 ESXi 抢走显卡
这条是"看起来莫名其妙,其实原因很朴素"的典型。如果主板 BIOS 把独显设成主显示设备,ESXi 启动时会用这张卡初始化控制台,卡就被宿主机占住了,直通切换会失败或者直通后虚拟机黑屏。
正确做法是在 BIOS 里把Primary Display 设成 IGFX / 集显 / Onboard,或者设置为 IPMI/BMC(服务器主板有的话)。这样 ESXi 的控制台走集显或者走远程管理芯片,独显从开机那一刻起就是干净的,直通成功率大幅提升。
如果你的 CPU 没有核显(比如 AMD 大部分桌面 U、Intel 的 F 系列),那就得靠服务器的 BMC 远程管理,或者干脆不接显示器盲跑。这是个硬约束,买硬件之前想清楚。
2.4 显卡选型和 VBIOS 的几个坑
不是所有 N 卡都同样好直通。根据我自己的经验排个序。
最省心的:图灵架构及以后的中高端卡(GTX 1660 系列、RTX 20/30/40 系列)。UEFI GOP 完整,复位干净,基本一次成功。稍微麻烦的:麦克斯韦、帕斯卡架构的老卡(GTX 9 系、10 系),有些型号复位会出问题,需要在 passthru.map 里指定复位方式。最麻烦的:特别老的卡和 OEM 定制卡(比如某些品牌机拆机的卡),VBIOS 被阉割,可能缺少 UEFI 模块,只能走 Legacy 引导,而现代虚拟机基本都在用 EFI,这就很尴尬。
还有一类要特别注意:魔改卡、矿卡。这类卡的 VBIOS 经常被动过,直通时可能出现花屏、只认半显存、驱动装不上等奇怪现象。直通场景下我对这类卡的态度是能不用就不用。
注意:VBIOS 是焊在显卡上的,普通用户改不了。如果在虚拟机里检测到显卡型号对、但显存容量不对或者性能异常,先怀疑 VBIOS 被刷过。
3. ESXi 7.0 主机侧的直通配置实操
3.1 图形界面切换直通,以及那个"活动"状态
用浏览器打开 ESXi 主机的 IP,登录主机客户端(Host Client)。导航到主机 → 管理 → 硬件 → PCI 设备。在列表里找你的 N 卡,一般会看到两到三项:一项是 VGA compatible controller,一项是 Audio device(HDMI 音频),有些卡还有第三项 USB controller(VirtualLink 或者 USB-C 口)。
选中之后,点击列表上方的切换直通按钮。状态列会从"已禁用"变成"已启用"。
关键点在这里:"已启用"不等于生效。要变成"活动",必须重启 ESXi 主机。这一步没有捷径,PCIe 设备的直通标记是在主机引导阶段被 vmkernel 读取并建立重映射表的,热切换不了。
| 状态 | 含义 | 能否直接加到虚拟机 |
|---|---|---|
| 已禁用 | 未标记直通 | 否 |
| 已启用 | 已标记,但主机未重启 | 否,加了也开不起来 |
| 活动 | 直通已真正生效 | 是 |
重启命令我一般用这条,免得去 Web 界面点:
esxcli system shutdown reboot -d 60 -r "enable GPU passthru"-d 60是延迟 60 秒,留点时间给其他虚拟机优雅关机。
3.2 命令行方式,适合远程批量操作
如果你只能 SSH 进主机(比如控制台没画面),那命令行是唯一选择。先列出所有 PCI 设备找到显卡的地址:
esxcli hardware pci list | grep -i -B2 -A6 "10de"10de是 NVIDIA 的厂商 ID,所有 N 卡都是这个值。输出里你会看到类似0000:01:00.0这样的设备地址,还会看到 vendor name 是 NVIDIA Corporation。记下这几个地址。
然后逐个开启直通:
esxcli hardware pci pcipassthru set -d 0000:01:00.0 -e true esxcli hardware pci pcipassthru set -d 0000:01:00.1 -e true-e true是 enable,改成false就是关闭。改完用下面这条确认:
esxcli hardware pci pcipassthru list输出的Configured字段是 true 就说明标记成功了。然后重启主机让它生效,重启后同一张表会多出一个Active字段,是 true 才算真正可用。
提示:显卡的音频功能(.1)和主功能(.0)一定要一起直通。只直通 VGA 部分的话,虚拟机里 HDMI/DP 的声音出不来,很多人以为是驱动问题,其实压根没把音频设备交给虚拟机。
3.3 复位方式与 passthru.map 的最小改动
有一类故障叫"直通切换超时"或者"设备复位失败",表现是切换直通时进度条卡住,或者虚拟机开机时报复位相关的错误。根因是某些显卡不支持标准的 PCI 复位方式,需要告诉 ESXi 换一种复位手法。
配置在/etc/vmware/passthru.map这个文件里。先备份:
cp /etc/vmware/passthru.map /etc/vmware/passthru.map.bak看看里面的内容,默认情况下 NVIDIA 已经被处理过了,大概是这样一行:
10de ffff bridge false如果直通一切正常,这一行不用动。只有在确实遇到复位失败时才需要改。把bridge换成d3d0是常见的做法:
10de ffff d3d0 falsed3d0的含义是通过 D3 电源状态热复位设备,很多不支持 function-level reset 的 N 卡用这招能救回来。改完记得重启主机。
我遇到过/etc/vmware/passthru.map在重启后被还原的情况。稳妥的做法是写一个开机脚本来保证配置持久:
cat >> /etc/rc.local.d/local.sh << 'EOF' cp -f /etc/vmware/passthru.map /tmp/passthru.map.orig grep -q "^10de" /tmp/passthru.map.orig || echo "10de ffff d3d0 false" >> /etc/vmware/passthru.map EOFlocal.sh是 ESXi 在引导后期执行的自定义脚本,位置固定,重启后依然有效。这是我从别的老哥那里学来的一招,救过我好几次。
3.4 直通标记重启后丢失怎么办
偶发情况:配好了也重启了,第二次再重启之后直通标记全没了。这通常是两种情况之一。
一种是设备地址变了。PCIe 设备地址跟插槽绑定,一般不变化,但如果你换过插槽、加过扩展卡,地址会变,之前的标记对不上。解决办法是重新查地址再配一遍。
另一种是配置没落到持久存储。ESXi 的配置写在/etc/vmware/esx.conf里,正常情况下pcipassthru命令会自动写进去。如果你手改过文件或者存储出过异常,可能没保存。验证方法是:
grep -i passthru /etc/vmware/esx.conf能看到显卡地址就说明持久化没问题。看不到的话,重新用 esxcli 命令配一次。
4. 虚拟机侧的配置,坑最多的一段
4.1 内存预留和 CPU 分配的基本盘
新建虚拟机时,Guest OS 按你的实际用途选(Windows 11、Windows 10、Ubuntu 64 位都行),硬件版本用 17 以上(ESXi 7.0 默认就是 vmx-17,不用管)。
内存是重点。编辑设置 → 虚拟机选项 → 内存,把预留所有客户机内存(全部锁定)勾上。或者在内存设置里把"预留"手动设成等于分配的内存容量。这一步不做,添加 PCI 设备时界面会直接拒绝你,或者允许添加但开机报内存相关错误。
为什么必须全量预留?因为直通设备做 DMA 访问时用的是物理地址,vmkernel 必须保证虚拟机的每一页内存都真实驻留在物理内存里,不能被交换出去。这是安全前提,不是 ESXi 在刁难你。
CPU 分配上,直通游戏机建议至少 4 核 8 线程起步。有个细节:别把主机所有核心都给虚拟机,留 2 个核心给 vmkernel 自身,否则网络和存储的 IO 处理会受影响。另外 CPU 的"硬件虚拟化"和"IOMMU"选项在纯直通场景下不是必需的,那是给嵌套虚拟化和 SR-IOV 用的。
还有一点:预留内存是实打实吃掉的。一台 32GB 内存的主机,给一台游戏机预留 24GB,剩下 8GB 要跑 vmkernel、其他虚拟机、各种缓存,会很紧张。主机内存规划时至少留出 8GB 余量。
4.2 添加 PCI 设备,别漏掉音频
虚拟机设置 → 添加其他设备 → PCI 设备,弹出列表里会显示所有已开启直通的设备。找到你的 N 卡,两个功能都要加:一个标注为 VGA 或者 Display controller,一个标注为 Audio device。加完之后虚拟机里会出现两个 PCI 设备条目。
有些卡还有第三项 USB controller(20 系卡上的 VirtualLink 接口),这个看需求,一般不加。加了会让虚拟机多一个 USB 控制器,反而可能和虚拟机的 USB 设备冲突。
加了 PCI 直通设备的虚拟机有几个操作会受限,我在这一并说清楚:
- 不能拍快照,要拍就得先移除直通设备。
- 不能内存热添加,内存大小在开机后锁定。
- 不能热迁移(vMotion),除非源和目标主机硬件一致且都开着直通,那是很复杂的故事。
- 挂起(Suspend)不稳定,直通设备的电源状态不好保存,建议直接关机。
这些限制在接受范围内,家用场景基本用不到上面这些特性。
4.3 64 位 MMIO 窗口,黑屏和开机失败的头号元凶
这是整篇里最值钱的一段。如果你只能记住一个细节,那就是它。
N 卡的显存映射窗口很大,默认虚拟机给的 32 位 MMIO 空间(4GB)根本不够用。症状表现为:虚拟机开机报Module 'DevicePowerOn' power on failed,或者虚拟机启动了但显卡黑屏、驱动装完报错、设备管理器里显存容量显示异常。
解决办法是在 VMX 配置里开启 64 位 MMIO 并指定足够的窗口大小。操作路径:虚拟机 → 编辑设置 → 虚拟机选项 → 高级 → 编辑配置,添加两个参数:
pciPassthru.use64bitMMIO = "TRUE" pciPassthru.64bitMMIOSizeGB = "64"第二个值要给多少,取决于显卡。计算逻辑是:这个窗口要能容纳直通设备所有 BAR 的总和,显卡的显存映射是最大头。经验值参考下表。
| 显卡显存容量 | 建议 64bitMMIOSizeGB |
|---|---|
| 4G 到 8G | 16 |
| 10G 到 12G | 24 到 32 |
| 16G | 32 |
| 24G | 64 |
值不是越大越好。设置过大会从一个有限的物理地址池里划走空间,可能导致虚拟机开不起来。按需给,够用就行。如果你的机器上有多个虚拟机同时做直通,这些窗口是累加的,要留意主机整体地址空间是否吃得消。
还有一个坑:这个参数必须在虚拟机关机状态下修改,虚拟机跑着的时候改不了,界面会灰掉。
4.4 引导模式与 VMX 参数逐条说明
引导模式必须选 EFI。NVIDIA 从图灵架构开始,显卡的 VBIOS 里已经没有传统的 VGA BIOS 模块了,只保留 UEFI GOP。如果虚拟机还用 BIOS 引导,开机阶段会完全没画面。这个设置在虚拟机选项 → 引导选项 → 固件里选EFI。
硬件版本 17 的虚拟机默认就是 EFI,但如果你是拿一台老虚拟机的硬盘挂过来用,可能会残留 BIOS 引导设置,务必检查。
关于hypervisor.cpuid.v0这个参数的说明我要更新一下:网上大量教程还在讲"必须加hypervisor.cpuid.v0 = "FALSE"来绕过驱动的虚拟化检测(也就是那个著名的设备代码 43)"。这个说法在 R465 驱动之前的年代是对的,但 NVIDIA 后来在驱动里取消了这个限制,现在新驱动完全不需要伪装。
不过我还是建议加上,因为它对某些老游戏、某些反作弊系统、某些老版本的专业软件有奇效,成本就是一行配置:
hypervisor.cpuid.v0 = "FALSE"这条的作用是隐藏 CPU 的 hypervisor present 标志位,让虚拟机内程序以为自己跑在物理机上。
另外两条可选参数:
pciPassthru0.msiEnabled = "FALSE"用于某些卡的中断方式兼容问题,如果虚拟机内频繁蓝屏或者音频设备异常,可以试试。一般不用加。
svga.present = "FALSE"关掉 VMware 的虚拟显示适配器。这样虚拟机里只剩直通的物理显卡一个显示设备,主输出直接走显卡,适合接显示器当物理机用。但副作用是,如果你后面想用浏览器控制台看画面会黑屏,只能靠直通卡的物理输出口。想清楚再改。
4.5 虚拟机外的配套配置
虚拟机本身的硬盘、网卡按常规配就行。硬盘建议用厚置备延迟置零或者厚置备置零,别用精简置备跑游戏,写到盘尾的时候性能会掉得很难看。如果主机上的数据存储空间紧,另外说一句:ESXi 的虚拟机磁盘扩容在关机状态下改完大小,Windows 里还要用磁盘管理去扩展分区,两处都要做,只改 ESXi 那边是不会自动变大的。
网卡用 VMXNET3,比 E1000 性能好很多,Windows 11 自带驱动,Linux 也是。
虚拟机的 USB 控制器如果要用,把 USB 兼容性设成 USB 3.1,USB 3.0 和 2.0 在传文件的时候慢得让人着急。
5. 客户机里的驱动安装与效果验证
5.1 Windows 下的完整验证清单
虚拟机装好 Windows,进系统之后按这个顺序走一遍。
先在设备管理器里看有没有"Microsoft 基本显示适配器"或者带黄色感叹号的显示设备。有感叹号是正常现象,说明显卡被识别了但还没驱动。
然后装 NVIDIA 官方驱动。驱动版本的选择上,我的建议是用最新版的 Studio 驱动或者 Game Ready 驱动,别去翻历史版本。除非你遇到明确的新驱动兼容性问题,否则老驱动只会带来更少的特性支持和更差的安全性。网上那些推荐"某个特定老版本最稳"的说法,绝大多数是当年的权宜之计,现在没这个必要。
装完驱动重启,然后看这几项:
- 设备管理器里显示适配器是"NVIDIA GeForce RTX XXXX",没有感叹号。
- 打开任务管理器 → 性能标签,能看到 GPU 项,有显存容量、有实时占用率曲线。
- 右键桌面 → NVIDIA 控制面板能正常打开,系统信息里显示的总显存和物理卡一致。
- 跑一下
nvidia-smi(需要装 CUDA 或者驱动自带),能打印出卡的温度、功耗、显存使用。
有一个现象要提前说明:任务管理器里看到的 GPU 显存"专用"值可能比实际小。这是 Windows 的显示方式问题,不影响实际可用。以 nvidia-smi 或者 NVIDIA 控制面板显示的数字为准。
5.2 Linux 客户机下的验证
Ubuntu 22.04 上直通最省事,装好系统之后跑:
lspci | grep -i nvidia应该能列出你的卡和音频设备。然后装驱动:
ubuntu-drivers devices sudo ubuntu-drivers autoinstall sudo reboot重启后nvidia-smi能出来就行。
Linux 下有个坑要注意:Ubuntu 默认会尝试加载开源的 nouveau 驱动,它会和官方的 nvidia 驱动冲突。如果nvidia-smi报"couldn't communicate with the NVIDIA driver",先确认 nouveau 有没有被 blacklist:
lsmod | grep nouveau有输出的话,把它拉黑,具体是在/etc/modprobe.d/blacklist-nouveau.conf里写:
blacklist nouveau options nouveau modeset=0然后更新 initramfs 再重启。这是个很常见的新手卡点。
5.3 性能预期和实际表现
我在自己的机器上做过一些对比,供参考。
网络上查阅到的公开数据也基本印证这个量级:直通显卡在 3D 应用中相对裸机的性能损失通常在2% 到 5%之间,主要来自 vCPU 调度和中断处理开销。这个损失对于游戏和大部分生产力场景基本感知不到。硬编解码(NVENC/NVDEC)走的是独立的硬件单元,性能跟裸机几乎没有差别,非常值得用在转码服务器上。
CUDA 计算场景的损耗略大一些,因为数据传输路径上多了 vCPU 参与,大约 5% 到 10%,跟具体任务类型关系很大。显存带宽测试类任务几乎没损失,小批量计算任务损失明显。
6. 常见故障速查与独家避坑经验
6.1 故障速查表
这张表是我这些年被问最多的问题汇总,基本覆盖了九成情况。
| 现象 | 大概率原因 | 处理动作 |
|---|---|---|
| 添加 PCI 设备时提示内存未预留 | 没勾全量预留 | 勾选"预留所有客户机内存" |
| 虚拟机开机报 DevicePowerOn 失败 | 64 位 MMIO 不够 | 加pciPassthru.64bitMMIOSizeGB |
| 切换直通进度条卡住 / 超时 | 显卡不支持标准复位 | 改 passthru.map,bridge换d3d0 |
| 直通后状态一直是"已启用" | 主机未重启 | 重启 ESXi 主机 |
| 虚拟机开机全程黑屏 | 引导模式是 BIOS | 改成 EFI |
| 设备管理器报代码 43 | 老驱动做虚拟化检测 | 加hypervisor.cpuid.v0 = "FALSE"并升级驱动 |
| HDMI/DP 没有声音 | 只直通了 VGA 功能 | 把 .1 音频设备一起直通 |
| 宿主机想看控制台却花屏 | BIOS 主显示设为独显 | 改成集显或 BMC |
| 直通第二天失效 | 配置没持久化 | 用 local.sh 开机自动写入 |
| 虚拟机无法关机 / 卡死 | 直通设备拒绝断电 | 强制关机,检查复位方式 |
6.2 几个能救命的日志位置
出问题时别干瞪眼,去看日志。
主机侧:
tail -f /var/log/vmkernel.log然后在虚拟机里触发一次开机,就能看到 vmkernel 打印的直通相关错误。关键词搜passthru、DevicePowerOn、MMIO、reset。这几个词能把九成问题定位到具体环节。
客户机侧(Windows):事件查看器 → Windows 日志 → 系统,筛选来源为nvlddmkm的事件,驱动崩溃、TDR 超时都能看到。Linux 侧则是:
dmesg | grep -i -E "nvidia|nouveau"6.3 我自己踩过的几个坑
坑一:以为直通需要装 NVIDIA 的 VIB。我最早看的教程是讲 vGPU 的,里面要往 ESXi 里传 VIB 安装。我照着做了一遍,浪费了一个晚上才发现直通根本不需要。记住这条:直通不需要任何主机端驱动,装 VIB 的教程一律是 vGPU 路线。
坑二:主机内存算漏了。第一次配的时候主机 32GB 内存,虚拟机分了 16GB 预留,我觉得还剩 16GB 很宽裕。结果同时跑了两台虚拟机做测试,直接内存告警,其中一台被强制停掉。后来老老实实按"预留内存 = 虚拟机内存,且主机保留 8GB 以上余量"来规划。
坑三:用精简置备跑游戏机。硬盘一开始用精简置备建的,玩了两个月之后写入量大,虚拟机开始出现莫名的卡顿。查了半天是精简置备的块分配开销。改成厚置备延迟置零之后,卡顿消失了。跑持续写入负载的虚拟机,老老实实用厚置备。
坑四:改完参数忘了改回 Resizable BAR。调试时把 ReBAR 关了,直通稳定之后想开回来提升游戏性能,结果开回来之后虚拟机时不时开机失败,症状飘忽。最后发现是 MMIO 窗口需要同步调大。所以如果你要在 ReBAR 开和关之间切换,记得同时调整64bitMMIOSizeGB。
坑五:把直通当成了可以随插随用的功能。有次临时想给另一台虚拟机用显卡,直接在界面上把 PCI 设备从那台删了加到这台。结果两边都不正常,删掉的那台虚拟机状态残留。正确做法是:关掉原虚拟机 → 移除设备 → 关机 → 在新虚拟机上添加 → 再开机。顺序不能乱,热搬直通设备不靠谱。
6.4 一条容易被忽略的长期建议
直通的虚拟机上,显卡驱动的自动更新建议关掉。Windows 自己的更新有时会给你装一个版本不对的驱动,把好好的直通环境搞坏。我的做法是:手动选一个稳定版本装好,然后在 NVIDIA 控制面板和 Windows 更新里都关掉显卡驱动自动更新,只在需要的时候手动升级,升级前先给虚拟机拍个快照(记得先把 PCI 设备摘掉才能拍)。
还有个小技巧:直通虚拟机装好之后,我一般会额外接一个 USB 键盘鼠标直通进去,然后在物理显卡的输出口接个显示器。这样这台虚拟机就是一个完全独立的"物理机",不依赖 ESXi 的 Web 控制台,主机维护重启时也不影响它之外的任何东西。这套玩法我用了几年,稳定性比我预想的好得多。
最后再提一个延伸方向:如果你的主机上有两张卡,一张中端卡做直通游戏机,一张低端卡(比如 GTX 1650)专门负责转码,两台虚拟机各拿一张,互不干扰。这种配置比把所有事压在一张卡上要健康得多,也更能发挥 ESXi 多虚拟机并行的价值。