WSL2与VMware冲突解决方案

本文总结了 WSL2 与 VMware 虚拟化冲突的解决方案。


结论

Windows 11 25H2 + VMware Workstation(17.x / 25H2) 下:

VMware 与 WSL2 可以共存但 VMware 不再是“直通 VT-x”的传统模式 👉 而是 运行在 Hyper-V 之上(兼容模式)

换句话说:

  • Hyper-V ON
    • WSL2 ✅
    • Docker Desktop(WSL2 后端)✅
    • VMware ✅(但走 Hyper-V 后端)
  • Hyper-V OFF
    • WSL2 ❌
    • VMware ✅(性能最好)

两种模式

模式 Hyper-V WSL2 VMware 性能
Hyper-V ON ON ⭐⭐⭐
Hyper-V OFF OFF ⭐⭐⭐⭐⭐

Hyper-V ON模式下虚拟化路径如下①和③所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
路径 ①(Linux / Windows VM)
硬件
└── Hyper-V (L0)
└── Windows
└── VMware / VirtualBox (L1)
└── Linux / Windows VM (L2)

路径 ②(macOS VM)
硬件
└── VMware (L0)
└── macOS (L1)

路径 ③(WSL2)
硬件
└── Hyper-V (L0)
└── Windows
└── WSL2 (L1)

由于苹果内核不支持Hyper-V这种虚拟化模型,macOS 虚拟机只能走路径 ②,即 Hyper-V OFF。

Hyper-V ON模式下性能损失是客观存在的:

项目 直通 VT-x Hyper-V 后端
CPU 100% ~85–90%
I/O 原生 稍慢
Nested VT

由于Hyper-V ON模式会导致VMware性能损失,此外我的虚拟机环境还有MacOS,MacOS 虚拟机不支持在 Hyper-V 之上的“二级虚拟化路径”,所以我优先Hyper-V OFF,如果需要用到WSL2,再切换到Hyper-V ON。(如果觉得每次切换需要重启麻烦,可以配置开机双启动的选项来选择)


Hyper-V OFF

如何切换

切换 VMware / VirtualBox:

1
bcdedit /set hypervisorlaunchtype off

该命令控制Windows 启动时不会再加载 Hyper-V 的 Hypervisor,也就是说:

  • Hyper-V 不工作
  • WSL2 不工作
  • Virtual Machine Platform 不工作
  • Windows Sandbox 不工作
  • CPU 的 VT-x / SVM 虚拟化能力释放给第三方虚拟机

切换到 WSL2:

1
bcdedit /set hypervisorlaunchtype auto

👉 相互切换必须重启才生效

1
shutdown /r /t 0 # 或手动重启

换来的是:

  • ✔ VMware 满血
  • ✔ WSL2 满血
  • ✔ 不互相妥协

快捷切换脚本

可将下面代码保存为切换脚本文件toggle_hypervisor.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
@echo off
chcp 437 >nul
setlocal EnableDelayedExpansion

:: ================================
:: Admin check
:: ================================
net session >nul 2>&1
if %errorlevel% neq 0 (
echo Please run this script as Administrator.
pause
exit /b 1
)

:: ================================
:: Get current hypervisorlaunchtype
:: ================================
set CURRENT=

for /f "tokens=2" %%i in ('
bcdedit /enum {current} ^| findstr /i hypervisorlaunchtype
') do (
set CURRENT=%%i
)

if not defined CURRENT (
set CURRENT=Auto
)

:MENU
cls
echo ================================
echo Hypervisor Launch Type Manager
echo ================================
echo.
echo Current state: %CURRENT%
echo.
echo 1. Toggle (Auto ^<^> Off)
echo 2. Set Auto (Enable Hyper-V)
echo 3. Set Off (Disable Hyper-V)
echo 4. Exit
echo.

set /p CHOICE=Select (1-4):

if "%CHOICE%"=="1" goto TOGGLE
if "%CHOICE%"=="2" goto SET_AUTO
if "%CHOICE%"=="3" goto SET_OFF
if "%CHOICE%"=="4" goto END

echo Invalid selection.
timeout /t 1 >nul
goto MENU

:TOGGLE
if /i "%CURRENT%"=="Auto" (
set NEW=off
) else (
set NEW=auto
)
goto APPLY

:SET_AUTO
set NEW=auto
goto APPLY

:SET_OFF
set NEW=off
goto APPLY

:APPLY
echo.
echo Setting hypervisorlaunchtype to %NEW% ...
bcdedit /set hypervisorlaunchtype %NEW%
if errorlevel 1 (
echo Failed to update hypervisorlaunchtype.
pause
exit /b 1
)

set CURRENT=%NEW%

echo.
set /p REBOOT=Reboot now? (Y/N):
if /i "%REBOOT%"=="Y" (
shutdown /r /t 0
)

goto MENU

:END
exit /b 0

以管理员身份运行,效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
================================
Hypervisor Launch Type Manager
================================

Current state: Auto

1. Toggle (Auto <> Off)
2. Set Auto (Enable Hyper-V)
3. Set Off (Disable Hyper-V)
4. Exit

Select (1-4):

Hyper-V ON

核心思想

让 VMware 接受 Hyper-V 的存在,使用微软的虚拟化平台:

  • WHP(Windows Hypervisor Platform)
  • VBS(Virtualization-Based Security)

开启 Windows 必要组件

打开:

1
2
3
控制面板
→ 程序
→ 启用或关闭 Windows 功能

✅ 勾选:☑ Virtual Machine Platform

确认 Hyper-V 启动

Windows PowerShell 执行:

1
bcdedit /enum | findstr hypervisor

应看到:

1
hypervisorlaunchtype    Auto

不要设为 off

验证是否真的共存

WSL2 验证:

1
wsl -l -v

输出类似:Ubuntu-22.04 Running 2

VMware 验证:

正常启动虚拟机,不会再提示:VMware Workstation and Hyper-V are not compatible

[!CAUTION]

MacOS 虚拟机在此方式下无法打开。