必须启用嵌套虚拟化:先在宿主机开启硬件虚拟化与hyper-v,再用set-vmprocessor命令为关机状态的hyper-v虚拟机启用exposevirtualizationextensions,之后才可在其中运行wsl2、docker或kvm。

在Windows 11的Hyper-V虚拟机里再运行Docker或KVM,本质是启用嵌套虚拟化——必须让Hyper-V虚拟机本身能暴露CPU的虚拟化指令(如Intel VT-x/AMD-V)给其内部的操作系统。这一步不完成,WSL2启动失败、Docker Desktop报“Hypervisor is not running”、KVM模块加载失败都是必然结果。
确认宿主机已开启硬件虚拟化与Hyper-V
打开任务管理器 → “性能”选项卡 → 查看右下角是否显示“虚拟化:已启用”。若显示“已禁用”,需重启进BIOS/UEFI开启Intel VT-x或AMD-V;若显示“未启用”,说明Windows未启用Hyper-V平台。
以管理员身份运行PowerShell,执行:
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
执行完必须【重启电脑】,否则后续所有配置无效。
为Hyper-V虚拟机启用嵌套虚拟化
这是最关键的一步:默认情况下,Hyper-V创建的虚拟机是屏蔽CPU虚拟化标志位的,必须手动开启。
第一步:关闭目标虚拟机(不能处于“已保存”或“正在运行”状态,必须是完全关机)。
第二步:以管理员身份打开PowerShell,执行以下命令(将VMName替换为你实际的虚拟机名称,例如“MyWin11Dev”):
Set-VMProcessor -VMName VMName -ExposeVirtualizationExtensions $true
第三步:验证是否生效——运行:
Get-VMProcessor -VMName VMName | fl ExposeVirtualizationExtensions
输出必须为 True。若为False,说明上一步没执行成功或虚拟机未关机。
注意:该设置仅对当前虚拟机生效,不影响其他VM;也不需要修改.vmcx文件或注册表。
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
在虚拟机内部启用WSL2或Linux KVM
方法一:运行WSL2(推荐用于Docker Desktop)
进入已启用嵌套虚拟化的Windows 11虚拟机 → 以管理员身份运行PowerShell → 执行:
wsl --install
系统将自动启用WSL、安装最新内核、设为默认版本2。无需额外下载MSI包。
方法二:手动启用KVM(适用于Ubuntu/CentOS等Linux发行版)
启动Linux虚拟机后,在终端中运行:
egrep -c '(vmx|svm)' /proc/cpuinfo
若返回值 ≥ 1,说明嵌套虚拟化已透传成功;若返回0,则回到上一节检查Exposure设置或宿主机CPU支持。
确认成功后,安装KVM相关包:
Ubuntu/Debian:
sudo apt update && sudo apt install qemu-kvm libvirt-daemon-system virtinst
CentOS/RHEL:
sudo dnf install @virtualization
最后启动libvirtd服务:
sudo systemctl enable --now libvirtd
验证Docker能否在嵌套层正常运行
在已启用WSL2的Windows 11虚拟机中,直接下载并安装Docker Desktop(官网最新版)。安装时勾选“Use the WSL 2 based engine”。
安装完成后,打开PowerShell或CMD,运行:
docker run hello-world
若看到欢迎信息且无“Cannot connect to the Docker daemon”报错,说明嵌套链路完整打通:宿主机Hyper-V → Win11 VM → WSL2 → Docker daemon → 容器。
若失败,优先检查WSL2是否为默认版本:运行 wsl -l -v,确认STATE列为Running且VERSION为2;若不是,执行 wsl --set-version distro-name 2(如wsl --set-version Ubuntu-22.04 2)。










