
干虚拟化运维的谁没被网卡驱动坑过设备到现场ESXi 安装界面都出来了结果网卡一个都认不出来装到一半卡住。别问我是怎么知道的这种场景我见过太多次。今天要聊的 ESXi-Customizer-PS就是专门解决这个问题的把第三方驱动直接塞进 ESXi 安装镜像让你在装机阶段就把网卡、存储卡这些硬件老老实实认出来。它本质上是一个 PowerShell 脚本底层调用 VMware PowerCLI 的 ImageBuilder 组件把厂商提供的驱动离线包打进 ISO 镜像里。适合谁看搞虚拟化/服务器运维、经常装机、或者准备在非官方硬件列表HCL之外的机器上装 ESXi 的人。这篇文章会把原理、工具选型、完整操作步骤和踩坑经验一次讲透。1. 为什么非要自定义 ESXi 镜像装到一半认不出网卡的痛1.1 现实中你会遇到的各种尴尬场景我先说几个高频场景你看看自己中过哪条。最常见的是新装 ESXi 时网卡不在官方兼容列表里安装程序扫不到任何可用网卡网络配置那一步直接没法往下走。这里要提一个关键背景VMware 对 ESXi 的硬件支持一直很严格尤其是 8.0 之后官方镜像里内置的驱动数量比老版本还精简了一些很多旧型号网卡被移出了默认支持范围。第二个场景是批量部署。一台一台装系统装完之后再通过 esxcli 或 vSphere Lifecycle Manager 补驱动、打补丁机器少还好机器一多效率就很低。与其在部署后再折腾离线 bundle 和驱动升级不如在 ISO 阶段就把驱动放进去一次到位。第三个场景是硬件更新换代。比如服务器还在用但网卡换成了 2.5G/10G 的型号而原有 ESXi 版本太老镜像里没有新网卡的驱动。这种时候你去官方硬件兼容列表里翻很可能查无此卡。你就需要自己动手把新硬件的第三方驱动和老版本 ESXi 镜像融合起来继续发挥剩余价值。如果你遇到上述任一场景那你需要的就不是什么复杂方案而是“镜像自定义”思路。ESXi-Customizer-PS 就是这套思路里最成熟、最轻量的一条路不需要搭建完整的 vSphere 环境只用一台 Windows 机器加一个脚本就能生成带第三方驱动的全新 ISO。1.2 工具选型对比为什么选 PowerShell 脚本版很多老运维知道过去有个图形化工具叫 ESXi-Customizer界面点几下就能集成驱动。这个工具确实好用但它停留在 ESXi 6.x 时代对 vSphere 7.0 及之后的镜像、驱动包格式已经力不从心官方也基本处于停更状态。现在社区里还在活跃维护、还能处理新版 ESXi 的就是它的“精神续作”——ESXi-Customizer-PS。从名字就能看出来这是一个基于 PowerShell 的脚本版。它不像老工具那样提供图形界面但它对现代 ESXi 版本的支持更好而且可以通过参数灵活定制适合脚本化和自动化。我整理了它的几个核心优势基于 VMware PowerCLI 官方模块底层调用 ImageBuilder 组件能正确处理新版 ESXi 的 depot 和 profile 结构。支持批量集成整个目录下的驱动包-pkgDir 参数指向一个文件夹脚本自动扫描 zip/vib。可指定输出目录、保留日志、跳过证书检查适合无人值守处理。脚本本身是公开的纯文本你能看到每一步做了什么出了问题也好排查。一句话总结如果你是 ESXi 6.5 以下的老环境旧 GUI 工具还能勉强凑合如果你要用 7.0 或 8.0老老实实学 PowerShell 版这是当下最靠谱的路子。2. 动手前要备齐的东西镜像、驱动包和 PowerShell 环境2.1 准备 ESXi ISO 镜像与第三方驱动离线包动手之前先把手头材料理清楚。第一件是 ESXi ISO 镜像你需要通过 VMware 官网或正规渠道获取对应版本的安装镜像比如 ESXi-8.0.0-20513097-standard.iso 这种格式。镜像版本和你要集成的驱动必须匹配驱动是给 ESXi 8.0 用的你就不能塞进 7.0 的镜像里否则安装阶段大概率报错。第二件是第三方驱动离线包。现在厂商一般提供两种格式一种是 .vib 单文件另一种是 .zip 打包的 offline bundlezip 里面通常包含 metadata.zip 和若干 VIB 文件。ESXi-Customizer-PS 两种都能处理建议优先用离线 bundle zip因为里面还带着厂商的签名信息和依赖关系描述集成后成功率高。从哪儿下载驱动优先去硬件厂商官方支持页面找“ESXi offline bundle”或“VMware ESXi driver”字样。比如 Intel 网卡驱动、Realtek 网卡驱动、部分 RAID 卡驱动官网上都有对应压缩包。如果厂商给的是社区维护的驱动像某些 2.5G 网卡驱动在社区 flings 里很活跃那就要额外注意版本兼容性多看发布说明。2.2 安装 PowerShell 与 VMware PowerCLI 模块ESXi-Customizer-PS 只是脚本它本身不干活真正干活的是 PowerCLI。你可以这么理解脚本相当于一个熟练的师傅在指挥PowerCLI 是它手里那套工具没有工具再熟练也没用。所以第一步是装 PowerCLI。我用的环境是 Windows 10/11 或者 Windows Server 2019 及以上PowerShell 5.1 或 PowerShell 7 都行。在 PowerShell 里执行Set-ExecutionPolicy Bypass -Scope Process -Force Install-Module -Name VMware.PowerCLI -Scope CurrentUser -Force安装过程会联网获取模块首次加载的时候还会遇到证书提示这时执行一条命令把证书检查关掉不然每次连接 vCenter 或处理本地 depot 都会弹提示。Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false安装完成后先确认一下版本避免后面脚本报“PowerCLI 版本过低”之类的错Get-Module -Name VMware.PowerCLI -ListAvailable这条命令能看到已安装的 PowerCLI 版本号。ESXi-Customizer-PS 对 PowerCLI 版本有下限要求比如 v3.x 版本脚本建议 PowerCLI 12 以上你最好确保环境是较新版本。模块装好之后默认识别就有了不用手动 Import-Module。2.3 整理目录结构与文件命名这一步很容易被忽略但实际执行时能省下大量时间。我习惯建立一个干净的目录比如 D:\esxi-custom里面放三样东西脚本文件 ESXi-Customizer-PS-v3.8.1.ps1原始镜像 ESXi-8.0.0-20513097-standard.iso驱动目录 drivers里面放准备好的 zip 或 vib 文件路径和文件名尽量不要带空格和中文字符否则脚本解析参数时可能出问题。驱动目录里一次只放你要集成的那些驱动别把下载的历史版本全堆进去否则脚本会一股脑全塞进镜像容易引发 VIB 冲突。3. 实操过程把驱动塞进镜像的全流程3.1 基本命令与参数说明工具准备好了接下来就是核心操作。打开 PowerShell进入你准备的目录执行cd D:\esxi-custom .\ESXi-Customizer-PS-v3.8.1.ps1 -izmo .\ESXi-8.0.0-20513097-standard.iso -pkgDir .\drivers -nsc -outDir .\output -v这条命令做了什么我给你逐项拆解。-izmo指定原始 ESXi 镜像文件-pkgDir指定存放第三方驱动包的目录脚本会自动扫描这个目录下所有 zip 和 vib 文件-nsc表示跳过证书检查可以理解为“允许未签名或者签名异常的驱动集成进来”-outDir指定输出目录-v是显示详细日志。参数名看起来复杂其实记法有规律izmo 就是 Input ISOpkgDir 就是 Package Directory。碰到记不清的直接在脚本后面加-help就能看到全部参数说明。我第一次用的时候就没加 -outDir默认输出到当前目录后来规范之后才养成“所有输出都进单独目录”的习惯。3.2 后台原理拆解它到底怎么工作的很多人脚本执行完就结束了不知道中间发生了什么这不利于排查问题。ESXi-Customizer-PS 的工作流程其实可以拆成四步。第一步用它底层的 PowerCLI ImageBuilder 组件把原始 ISO 注册为一个软件仓库术语叫 depot。第二步把-pkgDir目录下扫描到的第三方驱动包也加载进同一个 depot这样原始镜像里的组件和驱动包里的组件就处于同一个“零件池”中。第三步基于原始 ISO 自带的安装配置Installable Profile克隆出一个新的镜像配置然后把需要注入的驱动 VIB 添加到这个新配置里。第四步把配置导出成新的 ISO 文件输出到指定目录。整个过程中加驱动本质上只是修改“镜像配置”不是物理地把文件复制进去。这样做的好处是能自动处理驱动之间的依赖关系避免你手动改来改去搞坏镜像。用生活类比就是你买了个标准配置的车现在要把行车记录仪、脚垫这类配件加进“配置单”里而不是自己拿电钻在车上打孔。配置单准确了最终出厂的车才稳定。# 如果要查看详细处理日志加 -v 参数即可 .\ESXi-Customizer-PS-v3.8.1.ps1 -izmo .\ESXi-8.0.0-20513097-standard.iso -pkgDir .\drivers -nsc -outDir .\output -v3.3 实际操作中的细节证书、签名与驱动匹配执行过程中你会看到很多日志输出其中最关键的是有没有出现Skipping、Error这类字眼。如果脚本提示某个驱动因为签名问题被跳过而你加了-nsc还是不行那多半就是驱动包本身不受信任或者驱动版本和镜像版本不兼容。还有一个很重要的点镜像集成了驱动不代表部署后一定能加载。ESXi 8.0 默认支持 UEFI Secure Boot如果机器开启了 Secure Boot而你的驱动是未签名或者社区签名的启动时会被拒之门外。很多人在测试环境一切正常到了现场却发现起不来就是栽在这上面。解决办法一是在 BIOS 里关闭 Secure Boot二是尽量找经过 VMware 官方合作伙伴签名或者厂商正式签名的驱动包。驱动匹配这块我的经验是先确认 ESXi 版本是哪个大版本再去驱动发布页面看支持矩阵。比如有的社区驱动明确写了“Supports ESXi 8.0 GA”那你就别拿它去配 7.0。有的驱动包支持多个版本但内部包含的 VIB 文件名里会有版本号要认真区分。判断 VIB 是否匹配可以在解压出的 metadata 文件里查看但更简单的办法是如果版本不匹配脚本执行时通常会主动跳过或报错你只要盯着日志输出就行。4. 验证与部署别急着插U盘先检查整出来的镜子4.1 生成后的 ISO 检查方法脚本执行完去输出目录看结果。正常情况下你会看到一个体积比原始镜像略大的新 ISO比如原始镜像 380 MB生成后可能变成 400 MB 多因为多了驱动组件。如果体积一点没变基本可以断定驱动没有被塞进去需要回头确认驱动包格式、保存路径。你还可以在脚本执行完成后不退出 PowerShell直接用 PowerCLI 命令加载生成的文件检查配置。不过这需要额外几步不展开讲。更直观的办法是把这个 ISO 挂到虚拟机或者物理机的虚拟光驱里试启动看 ESXi 安装界面能不能扫到目标网卡。有条件的话我建议至少在一台目标机器上做一次引导测试不用走完安装流程能看到网卡识别出来就算成功了一大半。# 如果你已安装 PowerCLI可加载 ISO 为 depot 并检查 profile Add-EsxSoftwareDepot .\output\ESXi-8.0.0-custom.iso Get-EsxImageProfile这个命令能把生成的 ISO 作为软件仓库加载然后列出里面的镜像配置名。如果你看到 profile 名称和原始一致且后面没有任何报错说明结构是完好的。有些复杂场景下你想验证具体的 VIB 是否在 custom ISO 里可以再加一条Get-EsxSoftwarePackage | Where-Object { $_.Name -like *i40en* }我强烈建议凡是要上生产环境的镜像都先用这条命令确认一下关键驱动确实存在于镜像配置中不要等到现场才发现白做了一版。4.2 安装完成后如何确认驱动真正生效镜像没问题装机过程就顺理成章。按照正常的 ESXi 安装流程操作装完之后登录 DCUI 或者通过 SSH 连接。先看网卡能不能正常拿到 IPesxcli network nic list这条命令会列出所有被 ESXi 识别的物理网卡。如果你之前认不出的那块网卡出现在列表里说明驱动加载成功。再配合esxcli software vib list查看当前系统中已经安装的 VIB 列表顺便用 grep 过滤出你注入的驱动名比如esxcli software vib list | grep i40en输出结果里能看到驱动版本号和厂商信息这就等于最终确认了驱动不仅进了镜像还在操作系统层面成功加载。如果你装的是多台机器这个验证过程建议逐台进行。因为即便镜像相同机器硬件个体差异也可能导致驱动加载异常不要因为第一台正常就默认后面全正常。4.3 从“装系统才用”到“日常维护也能用”的扩展自定义 ISO 不仅能解决安装阶段认不到硬件的问题还能用在后续维护上。比如 ESXi 系统已经跑着你想升级某个驱动或打补丁但机器没有外网连接就可以先下载离线 bundle然后传到数据存储里再用命令行更新esxcli software vib update -d /vmfs/volumes/datastore1/i40en-offline-bundle.zip这就是把前面“集成驱动”的思路从预安装阶段扩展到了运行阶段。不过运行环境做更新之前一定记得先备份配置和快照驱动更新失败回滚的代价往往比安装时更大。我自己现在的工作流程是新版本镜像做出来之后先在测试机跑一遍确认网卡、存储卡、PCIe 设备都识别正常再推到批量装机。这一步看似多花时间实际上能帮你躲开现场无法收拾的局面。5. 常见问题与排查技巧实录5.1 高频报错速查表实际操作中会碰到各种问题我整理了下面这张速查表覆盖大部分常见情况报错场景可能原因解决方法提示找不到 VIB 或格式不正确驱动包版本与 ESXi 版本不匹配核对驱动支持矩阵换对应版本的离线包提示 VIB 未签名或签名错误驱动包未签名或受信任级别不够加 -nsc 参数部署时关闭 Secure BootPowerCLI 安装后仍提示命令不存在PowerShell 会话未刷新或模块未加载重启 PowerShell或用 Import-Module VMware.PowerCLI脚本执行报错“PowerCLI 版本过低”当前 PowerCLI 版本太旧用 Install-Module VMware.PowerCLI -Force 升级输出的 ISO 体积没变化驱动目录没放对或驱动被跳过检查 -pkgDir 路径、看日志中 Skipping 信息安装后网卡仍是未知设备镜像集成了驱动但 Secure Boot 阻止加载进 BIOS 关闭 Secure Boot 后重试光看表还不够我建议你在执行脚本时输出日志保留一份。大部分运行问题都能从日志倒数几行定位到根因不要一上来就怀疑脚本本身有问题。5.2 我从实际项目里踩过的三个坑第一个坑发生在第一次用脚本的时候。我把驱动包和原始 ISO 都放在中文目录下结果脚本死活找不到文件。当时还以为是权限问题排查了半天最后发现是路径里带中文导致解析失败。从那之后我给自己立了个规矩所有跟 ESXi-Customizer-PS 相关的文件一律放英文路径目录里别有空格。第二个坑比较隐蔽。有一次我给一批机器做镜像明明驱动已经集成成功安装界面也能识别网卡但装完系统重启后网卡就消失了DCUI 里也看不到。后来排查发现这批机器 BIOS 里开了 Secure Boot而驱动是非官方签名启动时驱动被安全机制拒载。这个问题在测试机上遇不到因为测试机默认没开 Secure Boot。从那以后我每次交付镜像都会附带一句提醒非官方签名驱动需要配合关闭 Secure Boot 使用或者在装机前就把该项设置确认好。第三个坑跟多版本驱动积压有关。我曾经把新旧两个版本的网卡驱动都放在同一个目录里脚本都塞了进去。结果系统确实起来了网络却时不时断流。查了很久才发现两个 VIB 在系统里同时存在互相干扰。ESXi 有时候不会明确报错但运行就是不正常。后来我坚持只用“一个驱动一个文件”目录里只保留确定要用的版本这种问题再也没出现过。5.3 几个值得长期坚持的避坑习惯最后分享几个我长期用下来的好习惯。第一每次执行脚本前先校验原始 ISO 的校验和比如 SHA256防止源文件在下载或拷贝过程中损坏。第二生成的 custom ISO 同样记录校验和并标注好集成了哪些驱动、版本号是多少。把信息写在文件名里比如ESXi-8.0.0-custom-with-i40en.iso这样三个月后你翻文件列表一眼就知道这个镜像是干什么用的。第三脚本版本和 PowerCLI 版本都记录下来。工具升级会改变行为如果旧版本脚本能成功升级后却失败你可以先尝试把工具版本回退。别觉得这是小题大做生产环境里“昨天还能用今天就不行”很多时候就是工具更新导致的。第四驱动包的来源要可信。尽量从厂商官网下载不要用不明网站提供的整合包。装系统这件事上镜像和驱动都属于信任链的一部分源头有问题后面的一切都可能被污染。写在最后ESXi-Customizer-PS 这个工具本身不难难的是在什么场景下要用它、怎么规避它带来的安全边界问题。我前前后后用它处理过几十个版本的镜像最大的体会就是工具只是把 ImageBuilder 的命令封装得友好一些真正的专业度体现在对驱动匹配、签名验证、Secure Boot 这些细节的把握上。每次做新版镜像我依然会从头走一遍验证流程不会因为熟了就跳过。如果你正被第三方驱动集成问题卡住按这篇文章的流程走一遍大部分坑都能提前绕过去。