这两年我陆陆续续在 Windows11 上把 WSL2 从安装到日常开发完整用了起来中间踩过的坑比教程本身还多。先说结论如果你需要在 Windows 下跑 Linux 环境又要兼顾 GPU、Docker、图形界面这些需求WSL2 是目前最顺手的方案。它本质是一个由微软提供底层支持的轻量级虚拟机但和传统虚拟机完全不是一个使用体验——文件互访、端口转发、剪贴板共享、GPU 调用都是直接打通的。这篇文章我把自己反复重装、迁移、修故障的完整经验整理出来从零开始带你把 WSL2 在 Windows11 上装好、配好、用好新手可以直接照着操作已经装过的也可以翻翻后面几节大概率能找到你还没解决的那个坑。1. 环境准备与前置检查先别急着敲命令1.1 确认 Windows 版本与虚拟化能力装 WSL2 之前先花两分钟确认环境这一步能避免后面一堆莫名其妙的问题。首先是系统版本。WSL2 要求 Windows 10 版本 2004 及以上或者 Windows 11。Windows11 这边我实测从 21H2 一路用到最新的 25H2/27H2 预览版都没问题wsl --install这条命令在新版本里已经非常成熟了。如果你用的是比较老的 Windows10建议先把系统更新到最新再继续否则可能遇到内核组件缺失的问题。然后是虚拟化。WSL2 本质上是跑在 Hyper-V 虚拟机平台上的所以 CPU 必须支持并开启虚拟化。检查方式很简单打开任务管理器切到“性能”选项卡看 CPU 那一栏右下角有没有“虚拟化已启用”。如果显示“已禁用”需要进 BIOS/UEFI 开启。Intel 平台在 BIOS 里找 “Intel Virtualization Technology” 或 “VT-x”AMD 平台找 “SVM Mode”不同主板叫法略有差异但基本都在 Advanced 或 CPU Configuration 菜单里。小经验很多电脑买回来默认关了虚拟化尤其是一些品牌机。如果任务管理器里看不到“虚拟化”这一项说明 CPU 太老或者 BIOS 里被隐藏了这时候先升级 BIOS 再找。1.2 虚拟化报错最常见的启动失败根源WSL2 启动时如果提示“此计算机上未启用虚拟化。请确保计算机固件设置中‘虚拟机平台’已启用”别慌这基本就是两个原因第一BIOS 里的虚拟化开关没开上面已经说了进 BIOS 开启后重启即可。第二Windows 的“虚拟机平台”功能没启用。这个需要在“启用或关闭 Windows 功能”里勾选两项“适用于 Linux 的 Windows 子系统”和“虚拟机平台”。勾选后系统会要求重启重启完再执行 WSL 相关命令。还有一类情况比较隐蔽你之前装过 VirtualBox、VMware 这类第三方虚拟机软件它们和 WSL2 使用的 Hyper-V 虚拟化层可能存在冲突。新版 VMware Workstation 和 VirtualBox 已经兼容 Hyper-V但如果你用的是旧版本建议升级到最新版或者临时卸载掉先装好 WSL2 再说。我自己的经验是先装 WSL2再装 VMware冲突概率会低很多。1.3 确认 Windows 功能组件完整性即使你之前已经勾选了相关功能有时候系统更新或者某些“优化工具”会把组件状态搞乱。建议在管理员权限的 PowerShell 里跑一遍dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart跑完重启一次。这一步能纠正大多数功能组件缺失的问题。如果系统提示找不到某个功能说明你的系统版本太老先更新 Windows 再回来。2. 从零安装 WSL2三条完整路径2.1 一条命令的极速安装法现在装 WSL2 最快的路径就一条命令。右键开始菜单打开“终端(管理员)”或“PowerShell(管理员)”输入wsl --install这条命令会帮你完成三件事安装 WSL2 核心组件、启用虚拟机平台、默认安装 Ubuntu 发行版。装完系统会提示重启重启后自动进入 Ubuntu 初始化界面让你设置用户名和密码。如果你不想用默认的 Ubuntu想装指定版本比如 Ubuntu 22.04可以这样wsl --install -d Ubuntu-22.04查看有哪些发行版可选wsl --list --online。默认的 Ubuntu 是最新版但很多做深度学习或科学计算的朋友习惯固定用 22.04因为不少软件源和教程都基于这个版本求稳的话 22.04 是个好选择。2.2 手动安装与离线安装有些机器因为网络原因或者系统镜像被精简过wsl --install可能报错或者进度卡住不动。这时候就需要手动安装。手工拆解下来其实就四步第一步启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个 Windows 功能并重启这在上文已经说过。第二步安装 WSL2 内核更新包。微软官方有一个wsl_update_x64.msi的安装包下载后直接运行。这一步在当前新版本中通常会被wsl --install自动完成但手动补一次也不会有副作用。第三步设置 WSL2 为默认版本wsl --set-default-version 2第四步安装一个 Linux 发行版。可以从 Microsoft Store 里搜索 Ubuntu 22.04 安装也可以直接命令行wsl --install -d Ubuntu-22.04验证当前的 WSL 版本wsl --list --verbose如果输出里 Ubuntu 那行显示的是 2说明 WSL2 已启用。如果显示 1可以单独切换wsl --set-version Ubuntu-22.04 2注意事项从 WSL1 切换到 WSL2 需要几分钟时间期间系统会提示正在转换别中断。2.3 离线环境下的安装思路有些内网机器或者下载受限的环境下没法从 Microsoft Store 拉发行版。我的做法是找一台能联网的机器用wsl --export导出一个发行版的 tar 包拷贝到目标机器上再wsl --import导入。具体的导入命令在下一节讲迁移的时候会详细写这里先提个思路离线环境完全可行。另外WSL2 的内核更新包也可以提前下载好离线安装。内核包是个 msi 文件双击安装即可不需要联网。3. 存储迁移与系统配置别让 C 盘被撑爆3.1 为什么 C 盘会越用越小很多人都遇到过这个诡异的现象Windows 关机前 C 盘剩 12G开机后只剩 3GWSL2 就是典型的“罪魁祸首”之一。原因在于 WSL2 的虚拟磁盘默认存放在 C 盘用户目录下安装的 Linux 发行版所有文件都塞进一个虚拟磁盘文件vhdx里。这个文件有个特性只会增长不会自动收缩。你装了几十 GB 的依赖、模型、数据集虚拟磁盘文件就膨胀到几十 GB哪怕你删了这些数据文件大小也不会自动降下来C 盘空间就这么被吞掉了。解决思路有两个一是把发行版整体迁移到其他盘符二是在当前磁盘上做瘦身。3.2 把发行版迁移到 D 盘迁移 WSL2 发行版到 D 盘我现在用的就是这套流程很成熟。首先在管理员 PowerShell 里关闭 WSLwsl --shutdown然后导出当前发行版到一个 tar 包wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu-22.04.tar接着注销原来的发行版wsl --unregister Ubuntu-22.04最后导入到 D 盘新目录wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-backup\ubuntu-22.04.tar --version 2导入完成后启动wsl -d Ubuntu-22.04注意导出再导入这种方式会丢失默认用户设置进入系统后你可能是 root 身份。解决办法是编辑发行版内的/etc/wsl.conf[user] default你的用户名保存后执行wsl --shutdown再重启就能恢复普通用户登录。踩坑提醒wsl --unregister会把该发行版的所有数据删掉导出 tar 包之前务必确认导出文件完整、大小正常。我习惯导出后先检查 tar 包大小确认没问题再执行 unregister。3.3 虚拟磁盘瘦身如果不想迁移或者迁移完发现虚拟磁盘文件依然巨大可以试试收缩 vhdx 文件。新版 WSL 提供了一条命令wsl --manage Ubuntu-22.04 --set-sparse true这条命令能把虚拟磁盘改成稀疏文件模式让系统自动回收未使用的空间。改完之后磁盘文件会慢慢瘦下来不影响里面的数据。如果你的版本不支持这条命令传统方案是用 diskpart。管理员 PowerShell 执行diskpart然后select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_*\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit心得日常开发我建议直接把发行版放非系统盘一劳永逸。留在 C 盘的话隔三差五就得检查 vhdx 大小太折腾。3.4 全局配置.wslconfig 文件WSL2 的全局配置写在 Windows 用户目录下的.wslconfig文件里里面可以限制内存、CPU、swap 等参数。这个文件默认不存在需要手动创建。我的配置供参考[wsl2] memory8GB processors4 swap4GB localhostForwardingtrue [experimental] autoMemoryReclaimgradual sparseVhdtrue networkingModemirroredmemory和processors限制 WSL2 能使用的资源。如果不设置WSL2 默认会占用宿主机 50% 或 80% 的内存很多人说装了 WSL2 后 Windows 变卡八成是这里没限制。autoMemoryReclaim是自动回收内存sparseVhd对应稀疏虚拟磁盘。networkingModemirrored是 WSL2 新版支持的镜像网络模式它让 WSL2 和 Windows 共享网络接口解决了不少端口转发和局域网访问的奇怪问题。如果你的 WSL2 版本较新推荐开启。配置完成后执行wsl --shutdown再重启 WSL 使配置生效。4. 网络、镜像加速与系统初始化4.1 网络模式与 DNS 异常WSL2 默认的 NAT 网络模式下DNS 解析偶尔会抽风症状是apt update报错或者ping不通外网。原因通常是/etc/resolv.conf里的 DNS 服务器指向了不存在的地址或者 Windows 侧的网络环境变化导致虚拟交换机 DNS 失效。我常用的修复手段sudo rm /etc/resolv.conf sudo bash -c echo nameserver 223.5.5.5 /etc/resolv.conf sudo chattr i /etc/resolv.confchattr i是锁定该文件防止 WSL2 重启时自动重写。如果开了镜像网络模式DNS 一般不会出问题所以我把networkingModemirrored放在推荐配置里。如果网络还是不通可以在 Windows 管理员 PowerShell 里重置网络栈wsl --shutdown netsh winsock reset netsh int ip reset all然后再重启 WSL。4.2 更换 Ubuntu 软件源国内环境下 Ubuntu 默认的软件源下载速度比较难受装个包等半天。我的习惯是装完系统第一件事就换镜像源。Ubuntu 22.04 的软件源配置文件是/etc/apt/sources.list部分新版系统是/etc/apt/sources.list.d/ubuntu.sources建议直接看看实际文件路径。把文件里的archive.ubuntu.com和security.ubuntu.com替换成国内镜像站的地址比如清华、阿里云、中科大然后sudo apt update sudo apt upgrade -y换源是性价比最高的一步后面装任何软件都能感受到速度差异。4.3 安装基础工具链系统初始化时我会一次性装好这些常用工具sudo apt install -y build-essential git curl wget unzip zip \ net-tools iputils-ping vim nano htop \ ca-certificates gnupg lsb-releasebuild-essential包含 gcc/g/make编译源码必备。net-tools提供 ifconfig虽然老但用起来顺手。这些工具后面装 CUDA、Docker 都会用得上。5. 图形界面WSLg 与桌面应用5.1 WSLg 让 Linux 图形程序直接弹窗早期 WSL 跑不了图形程序需要装 X Server比如 VcXsrv再手动配置 DISPLAY 环境变量相当麻烦。现在的 WSL2 内置了 WSLg装好就能直接跑 Linux GUI 程序窗口会像 Windows 原生程序一样弹出来。比如在 WSL2 里装个文本编辑器sudo apt install -y gedit gedit正常情况下一个图形窗口就会出现在 Windows 桌面上。WSLg 会自动设置DISPLAY、WAYLAND_DISPLAY等环境变量你不需要额外配置。如果发现图形程序启动报错先确认 WSLg 是否正常echo $DISPLAY如果输出为空说明 WSLg 没起来。常见原因是 WSL 内核版本过旧执行wsl --update wsl --shutdown重启后再试。5.2 gedit 无法显示的排查思路热词里有人搜“wsl2 ubuntu gedit 无法显示”我确实也遇到过几次。经验是分三步排查第一步确认 DISPLAY 环境变量是否正常。不正常就先更新 WSL 内核重启 WSL。第二步看是不是缺图形库。sudo apt install -y libgtk-3-0 libcanberra-gtk3-module第三步如果还是不行用dconf重置一下 gedit 配置或者换一个轻量编辑器比如mousepad。注意WSLg 对 OpenGL 硬件加速支持不错但个别程序需要较新的图形驱动。Windows 端显卡驱动建议保持最新尤其是 NVIDIA 用户。5.3 中文显示乱码与输入法问题WSL2 里跑图形程序经常遇到中文显示成方块的尴尬原因是系统没装中文字体。装一个字体包就行sudo apt install -y fonts-noto-cjk输入法方面我用的方案是 fcitx5sudo apt install -y fcitx5 fcitx5-chinese-addons然后配置环境变量编辑~/.bashrcexport GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx启动 fcitx5 后在输入法里添加中文拼音。WSLg 环境下输入法能用但个别应用切换时有焦点问题日常主力还是在 Windows 侧输入Linux 图形界面里偶尔用用。心得WSL2 里跑图形界面适合轻量工具比如 gedit、xming 类的小软件。要跑完整桌面环境比如 xfce4也能跑但体验和原生虚拟机还是差点意思重度桌面用户建议直接虚拟机或实体 Linux。6. GPU 加速与 CUDA 实战深度学习场景6.1 WSL2 里跑 CUDA 的原理WSL2 对 GPU 的支持是很多开发者选择它的核心原因。你不需要在 WSL2 里安装显卡驱动Windows 侧驱动会直接透传给 WSL2 使用。也就是说你在 Windows 上装好 NVIDIA 驱动WSL2 里直接运行nvidia-smi就能看到显卡信息。这对深度学习开发来说太方便了Windows 和 Linux 下的 CUDA 环境可以共存互不干扰。AMD 用户也无需担心AMD 近几版驱动包括 Adrenalin 版本已经加入了对 WSL2 的支持新驱动装完 WSL2 里同样能识别 GPU。6.2 CUDA Toolkit 安装步骤WSL2 里安装 CUDA Toolkit 的路径和原生 Linux 略有差异。我用的方法是按官方 WSL-Ubuntu 的 deb 源来装。先把 NVIDIA 的 apt 源加进来wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update然后安装 CUDA Toolkitsudo apt install -y cuda-toolkit-12-4装完配置环境变量编辑~/.bashrcexport PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc nvcc -V能输出版本信息就说明 CUDA 装好了。这里有个容易踩的坑在 WSL2 里最好不要用sudo apt install cuda直接装最新版除非你完全清楚自己在做什么。因为最新版可能和你的 PyTorch/TensorFlow 版本不匹配。我一般会固定一个大版本比如 12.4对应 PyTorch 的cu124版本比较稳妥。6.3 实战验证跑通 PyTorch 与 MuJoCo装完 CUDA 后我用 Python 验证一下环境是否真的能用 GPU。pip install torch torchvision python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出True和你的显卡型号说明 GPU 加速没问题。热词里提到的 MuJoCo 我也在 WSL2 里装过。MuJoCo 是机器人领域常用的物理引擎官方 Python 绑定安装很直接pip install mujoco跑渲染的时候需要 OpenGL 环境如果报错sudo apt install -y libgl1 libgl1-mesa-glx libosmesa6MuJoCo 默认用 EGL 做离屏渲染WSL2 里可以直接渲染到文件也可以在 Windows 侧弹出可视化窗口。这个场景下 WSLg 是发挥作用的窗口能正常显示。6.4 独显直通与双显卡机器有人问过 Tesla P4 这类专业卡在 Windows11 上能否配合 WSL2 使用。我的经验是只要 Windows 侧能装驱动、nvidia-smi能识别WSL2 里大概率也能用。但双显卡笔记本核显独显需要注意WSL2 默认用的是 Windows 侧的默认 GPU如果设置不对可能调用的是核显。可以在 Windows 的“图形设置”里指定某个应用使用高性能 GPU或者在 WSL2 里用CUDA_VISIBLE_DEVICES环境变量控制。实操心得GPU 环境配好后建议跑一个稍微吃显存的模型测试确认不是“能识别但跑不了”。我常用的测试脚本是 PyTorch 里跑一个稍大的矩阵乘法观察nvidia-smi里显存占用是否真的涨上去。7. Docker 与容器环境WSL2 的正确打开方式7.1 Docker Desktop 还是 Docker EngineWSL2 装 Docker 有两个路线路线一是装 Docker Desktop for Windows。它使用 WSL2 作为后端Linux 容器跑在 WSL2 里Windows 侧提供 Docker 命令行和图形界面。优点是安装简单、开箱即用缺点是比较吃内存而且免费版对个人使用友好但部分商业场景有授权要求。路线二是直接在 WSL2 发行版里安装 Docker Engine也就是常说的“docker engine”。这种方式最干净不依赖 Windows 侧的任何软件Docker 完全运行在 Linux 环境里。我日常推荐这个方案尤其适合已经在 WSL2 里做开发的场景。7.2 Docker Engine 安装与验证首先开 systemd。新版 WSL2 默认支持 systemd检查一下ps -p 1 -o comm如果输出systemd就没问题如果不是在/etc/wsl.conf里加[boot] systemdtrue然后wsl --shutdown重启。安装 Docker Enginesudo apt update sudo apt install -y docker.io docker-compose-v2 sudo systemctl enable docker --now验证一下sudo docker run hello-world如果不想每条命令都加 sudo把当前用户加入 docker 组sudo usermod -aG docker $USER重新登录后生效。Docker Engine 在 WSL2 里的网络默认继承发行版的网络栈。如果你开了镜像网络模式端口映射会比较自然否则注意容器端口访问要用 localhost 而非局域网 IP。避坑提醒WSL2 里跑 Docker 时虚拟磁盘文件vhdx会涨得飞快尤其是频繁构建镜像的时候。建议把 Docker 的数据根目录也移到 D 盘配置/etc/docker/daemon.json{ data-root: /mnt/d/docker-data }重启 Docker 服务生效。这样 C 盘压力会小很多。7.3 镜像加速配置受限于网络条件直接拉取 Docker Hub 镜像偶尔会卡住。我习惯在daemon.json里配置镜像加速地址。不同服务的可用性会变化建议大家以当前可用的为准。配置方式就是上面那个daemon.json里加registry-mirrors字段然后sudo systemctl restart docker。经验配置完加速后拉镜像速度能明显改善。如果某些镜像拉取还是不稳定可以试试在 Dockerfile 里换用镜像站提供的基础镜像路径。8. 高频故障排查速查表以下是我在实际使用中遇到的最高频问题连同定位思路和解决办法整理成一张表方便快速对照。错误信息/现象根因解决办法WSL2 无法启动提示未启用虚拟化BIOS 关闭虚拟化或 Windows 虚拟机平台功能缺失BIOS 开启 VT-x/SVM管理员 PowerShell 执行 dism 启用虚拟机平台启动报 0x80370102虚拟化层未正确加载检查 BIOS、执行bcdedit /set hypervisorlaunchtype auto重启启动报 0x800701bcWSL 内核过旧wsl --update然后wsl --shutdown启动报 0x80070003发行版路径异常或安装损坏wsl --unregister后重新导入/安装发行版报 0x80370114WSL 服务异常任务管理器重启 LxssManager 服务或重启系统apt update 超时/无法解析DNS 或软件源问题手动设置 resolv.conf、更换国内镜像源、开镜像网络模式C 盘空间莫名被吃光vhdx 文件只增不减迁移发行版到 D 盘或执行 sparse 设置/diskpart compact图形程序如 gedit无法显示WSLg 未启动或环境变量缺失wsl --update、确认 DISPLAY 非空、补图形库GPU 无法识别Windows 显卡驱动过旧更新 NVIDIA/AMD 驱动WSL2 内无需重装驱动Docker 拉取镜像失败网络限制配置 registry-mirrors或手动指定镜像站内存占用过高导致系统卡顿WSL2 默认内存占用过大在.wslconfig中限制 memory开启 autoMemoryReclaim迁移后登录变成 root导出导入丢失默认用户编辑/etc/wsl.conf设置[user] default用户名这段排查过程里我最想强调的是遇到 WSL2 相关的问题先wsl --shutdown再重试能解决一半问题然后看错误码搜比自己瞎猜效率高最后再考虑是否配置问题。顺序搞对问题都好解决。9. 后续还能折腾的方向WSL2 这个环境的可玩性比很多人想象中高。我目前已经稳定在用的场景包括日常 Python/Node 开发、CUDA 深度学习环境、Docker 容器编排、GrADS 这类气象专业软件以及各种 Linux 命令行工具。你完全可以把 WSL2 当作一台跑在 Windows 里的 Linux 服务器来维护给它固定配置、独立存储、自动启动服务。后面我还打算尝试的方向是把 WSL2 内的开发容器和 Windows 侧的文件互访机制再优化一下看看能不能把前端构建、后端服务、数据库全部迁到 WSL2 里Windows 只留 IDE 和浏览器。这条路线目前看是完全可行的等我把临时文件存储和 vhdx 瘦身这两个细节彻底调顺了再写一篇完整的方案出来。最后再分享一个小技巧WSL2 里的 Linux 环境被折腾坏了别急着修用wsl --export定期备份一份 tar 包出问题直接--import恢复比什么修复手段都快。备份一次几分钟的事能省下大把折腾时间。