一台笔记本上的三国杀:eNSP、VirtualBox 与 Docker,我让它们共存了
一台 16G 内存的笔记本,既要跑华为网络模拟器做实验,又要用 Docker 开发。 官方给出的答案是:二选一。 我用一整天,把这个死结解开了。
01 一个让人头疼的死结
如果你在学网络、备考 HCIP/HCIE,大概率用过 eNSP------华为免费的网络模拟器,拖拖拽拽就能搭出路由器、交换机、防火墙,跑的是真实 VRP 系统。
但只要这台机器上还装着 Docker,就会撞上一堵墙:
- eNSP 底层依赖 VirtualBox 5.2.44(2018 年就停更了)
- Docker Desktop 依赖 Hyper-V
- VBox 5.2 与 Hyper-V 水火不容:Hyper-V 开启后会独占 CPU 硬件虚拟化(VT-x),老版 VirtualBox 直接瘫痪,设备永远启动失败
社区的标准答案是:关掉 Hyper-V,重启电脑。
这意味着:做实验就别用 Docker,用 Docker 就别做实验,每天在两者之间反复横跳。
需求也很明确:Hyper-V 不能关,Docker 要能用,eNSP 也得跑起来------重启切换的方案不接受。
02 换个思路:让 eNSP 跑在新版 VirtualBox 上
既然 VBox 5.2 太老,那就换条路:
让 eNSP 直接跑在 VirtualBox 7.x 上。
VirtualBox 从 6.0 起支持 Hyper-V 兼容模式(NEM),能在 Hyper-V 开启的前提下运行------代价是慢一些,但能跑。
理论能走通,实际动手又是另一回事。
坑一:幽灵注册
第一次安装退出码 1,失败。怪就怪在:磁盘上一个文件没生成,注册表里却已经有了这个产品。之后每次安装都报 1603,装不进去也卸不掉。
根因:上一次静默安装中途回滚,留下了"注册表有产品、磁盘没文件"的状态。
解法:先把幽灵强卸,再全新安装。
bash
# 1. 从注册表 Uninstall 项找到产品码
# 2. 强制卸载幽灵
msiexec /x {产品码} /qn /norestart
# 3. 提取 MSI 后全新安装,日志留档
VirtualBox-7.2.8-Win.exe --extract --path D:\vbox\msi --silent
msiexec /i D:\vbox\msi\VirtualBox-7.2.8-*.msi /qn /norestart /l*v install.log
方法论:静默安装失败后别只看文件在不在,必须查注册表的 Uninstall 项------反复失败的真正原因,往往在注册表里而不在磁盘上。
坑二:eNSP 认死理
eNSP 不从 PATH 找 VirtualBox,它认的是硬编码目录 D:\ensp\VirtualBox。所以升级完还要把新版文件同步过去------旧目录改名保留,新版 183 个文件复制进去。设备 VM 的注册信息在用户目录 .VirtualBox 下,不受影响,6 台基座设备全部还在。

03 真正的拦路虎:eNSP 的版本门禁
文件都就位了,打开 eNSP 却弹出一行红字:
VirtualBox version is not supported.
原来 eNSP 客户端里写死了版本检查:它按 VBox 版本去加载对应的 COM 包装 DLL(VBox42.dll、VBox50.dll、VBox52.dll 等),最高只认到 5.2,7.x 直接拒之门外。
两条路:改二进制(风险高),或者骗过它的版本检查。
powershell
# 注册表版本伪装(64 位与 32 位视图都要改)
reg add HKLM\SOFTWARE\Oracle\VirtualBox /v Version /t REG_SZ /d 5.2.44 /f
reg add HKLM\SOFTWARE\Oracle\VirtualBox /v VersionExt /t REG_SZ /d 5.2.44r139111 /f
reg add HKLM\SOFTWARE\WOW6432Node\Oracle\VirtualBox /v Version /t REG_SZ /d 5.2.44 /f
伪装完,弹窗消失了。但这只是第一层。
版本检查能过,是因为它只读注册表里的版本号;真跑起来,eNSP 会拿着为 5.2 编译的 COM 接口去调 7.x 的虚表,槽位偏移对不上,设备照样起不来(这就是下一篇要讲的错误码 45)。
真正的解法是开源社区的 ensp-vbox-shim:一个二进制 COM 垫片,对外伪装成 5.2 的虚表形状,内部把每个槽位转发并重映射到 7.2 的真实方法。
它做了三件事:
- 垫片 VBox52.dll 覆盖 eNSP 的全部加载位置
- 注册表版本伪装 + CLSID 劫持
- 预编译的补丁版 AR 插件
bash
powershell -ExecutionPolicy Bypass -File install.ps1 -EnspDir D:\ensp\eNSP -VBoxDir D:\ensp\VirtualBox
安装六步全绿,所有原文件都有 .orig.bak 备份,可以一键还原。
提醒:垫片是按 VBox 7.2.x 的虚表做的,必须配 7.2.x;用 7.0 会白忙一场。这是很多人装完仍然失败的原因。
04 结果:三个都要
| 需求 | 结果 |
|---|---|
| Hyper-V | 常开,Docker 与 WSL2 随时可用 |
| VirtualBox | 7.2.8,eNSP 与它正常协作 |
| eNSP 设备 | 路由器、交换机、防火墙、AC 与 AP 全部可启动 |
| Docker | 引擎正常,拉取、构建、运行全通 |
没有重启切换,没有二选一------三个同时跑在了一台机器上。
05 写在最后
这套方案里没有一行高深的技术,成立的道理也很朴素:
两个软件在底层抢同一份资源,不一定非得让其中一个让路;也可以加一层,把它们翻译到同一层上。
垫片就是这个思路的产物:不改 eNSP,不降级 Docker,只在中间加一层转发,两边都不用动。
下一篇,讲这场战役里最磨人的一段:错误码 45、40、端口冲突三连击,怎么一层层剥到根。
本文所有命令与数据均来自真机实测,非理论推演。