☰
WSL2 从安装到 GPU 加速:Windows 下 Linux 开发环境完整配置指南
2026/10/2 3:01:58 网站建设 项目流程

说实话,最早我对 WSL2 是有些不屑的,觉得“Windows 里跑 Linux 内核”这事儿听着就不太靠谱。直到有一次必须在 Windows 笔记本上同时维护两三个 Linux 项目,虚拟机内存完全不够分,我才认真把 WSL2 从头到尾配了一遍。配完之后不得不说,真香。这篇文章不是通篇说教,而是我实际配置 WSL2 环境过程中完整的操作记录,从底层原理到安装命令,从日常开发到 GPU 加速,再到各种“启动不起来”“闪退”的排查链路,整理成一份可以照着抄的笔记。如果你平时用 Windows 做 Python、C/C++、嵌入式、Docker 或者 AI 训练,这篇应该能帮你少走不少弯路。

1. WSL2 的底层逻辑:它和虚拟机、Docker 的关系决定了配置方向

1.1 从 WSL1 到 WSL2:从“翻译层”到“轻量虚拟机”

很多人第一次接触 WSL,分不清 WSL1 和 WSL2 到底差在哪。简单说,WSL1 不是虚拟机,它是一个系统调用翻译层:把 Linux 程序发出的系统调用翻译成 Windows 的系统调用,像一个“同声传译员”。好处是启动极快、内存占用低,坏处是遇到某些不常见的系统调用会直接卡住,跑 Docker、装内核模块这类事情基本没戏。

WSL2 彻底改了思路,它把整个 Linux 内核跑在一个轻量虚拟机上。这就好比不再靠翻译,而是直接把对方请到家里来住,语言完全通。底层的 Hyper-V 虚拟化平台负责管理,WSL2 启动时只加载内核和一个极小的用户态环境,所以仍然能做到几秒内启动,而不是像 VMware 那样需要完整引导一个操作系统。

这个区别决定了后面很多配置方向。你现在用的 WSL2 其实是个“真 Linux”,systemd 可以开,Docker 可以跑,NVIDIA GPU 可以通过驱动直通,这些在 WSL1 时代都是不可能的。

1.2 文件系统与 IO 差异:代码和依赖要放对位置

配置 WSL2 环境最容易被忽略的一点是文件系统性能差异。WSL2 内部是一个 ext4 虚拟磁盘,文件实际存放在ext4.vhdx里;而你从 WSL 里看到的/mnt/c、/mnt/d这些 Windows 盘符,走的是 9P 协议,每次读写都要经过内核态转换,性能差距非常大。

我实测过同样一个 Node 项目执行npm install,放在/home/下比放在/mnt/c/下快了接近一个数量级。编译 C++ 项目时差距还会更明显。所以我的原则是:代码、依赖、虚拟环境全部放到 Linux 文件系统里,Windows 盘只用来交换最终产物或者读取 Windows 侧已有的资料。

另外还有两个隐藏坑。第一,/mnt/c下面的chmod、chown很多时候只是“看起来生效”,实际权限模型还是 Windows 的。第二,Windows 目录默认大小写不敏感,如果在 Linux 侧创建了Test和test两个文件再放到 Windows 盘,很可能会互相覆盖。所以 Git 项目里如果对大小写敏感,尽量在 WSL 内部目录操作。

1.3 用 .wslconfig 控制 vmmem 的内存占用

WSL2 用的虽然是虚拟化,但它不像是 VMware 那样固定分一块内存。它表现为vmmem进程,内存会动态增长,默认情况下最多可以吃到 Windows 物理内存的 50%。这在实际使用中很容易让人误以为电脑中毒了,其实只是 WSL2 在“借”内存。

解决办法是在用户目录C:\Users\<你的用户名>下创建.wslconfig文件,固定资源上限:

[wsl2] memory=8GB processors=4 swap=8GB localhostForwarding=true

这个文件改完后,在 PowerShell 里执行wsl --shutdown再重新进入 WSL,配置才会生效。这是我每次重装 WSL 后第一件要做的事。如果你是新手,建议内存至少留 6GB 给 WSL,4GB 跑现代前端工具链会比较紧张。

2. 启用与发行版安装的完整实操:命令、前置条件和易错点

2.1 前置检查:系统版本和虚拟化开关

在敲任何命令之前,先检查两件事。

先看系统版本。Windows 10 21H2 以上或者 Windows 11 都能用新版 WSL;如果你还在用老版本 Windows 10,最好先升级。打开“设置 → 系统 → 系统信息”,确认系统版本号。

再看虚拟化是否开启。打开任务管理器,切换到“性能”选项卡,点击“CPU”,看右下角“虚拟化”是否显示“已启用”。如果显示“已禁用”,WSL2 基本装完也起不来,需要进 BIOS 开启。

不同品牌主板对虚拟化的命名不一样,Intel 平台通常叫Intel Virtualization Technology,AMD 平台叫SVM Mode,联想笔记本可能叫Intel VT-x,戴尔可能叫Virtualization。进 BIOS 后别光盯着“VT-x”找,认准“Virtualization”这个关键词。我帮同事配过一台机器,找了半天没找到,后来发现是分类在“Advanced → CPU Configuration”里。

2.2 三种启用方式:线上安装、手动启用、离线安装

目前最省事的安装方式是在管理员 PowerShell 里直接执行:

wsl --install

这条命令会自动启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个 Windows 功能,然后默认安装 Ubuntu。执行完重启电脑,再打开一个终端,就会自动进入 Ubuntu 初始化界面。

如果你的 Windows 版本较老,或者上面这条命令提示找不到该命令,就需要手动启用功能。管理员 PowerShell 执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重启后,打开 PowerShell 执行:

wsl --set-default-version 2

对于内网环境或 Windows 版本特别老的用户,还可以走离线安装路径。先把发行版的 appx 安装包下载到本地,双击安装,再用wsl --set-default-version 2确保运行在 WSL2 模式。这种方式在“纯离线”场景下很实用,但需要你自己准备 Linux 发行版安装包。

装完之后可以运行wsl --version查看 WSL 版本信息。如果提示有可用更新,执行wsl --update。这里建议把 WSL 升级到 Store 版,功能更全,修复 Bug 也更及时。

2.3 发行版安装与初始用户设置

查看可用的发行版:

wsl --list --online

指定版本安装 Ubuntu,例如:

wsl --install -d Ubuntu-22.04

想要最新的 24.04 也一样,把后面版本号换成Ubuntu-24.04即可。首次启动时,它会提示你创建一个 Linux 用户名和密码,这个用户名会和 Windows 用户名不一样,注意区分。

我习惯再多做两个配置。第一,开启 systemd,这样像systemctl这类服务管理命令才能用。编辑/etc/wsl.conf:

[boot] systemd=true

保存后重启 WSL。第二,日常开发不用 root,但也要保证 sudo 能免密或者少输密码。如果你只有一个人用这台电脑,可以在/etc/wsl.conf里把默认用户固定下来:

[user] default=你的用户名

如果你跑的是国产发行版,比如银河麒麟,也可以在官网下载 WSL 专用镜像导入,原理一样,只是配置源的时候要按发行版自己的文档来。

2.4 换源、时区和基础软件包

Linux 环境装好后的第一件事永远是换源。Ubuntu 24.04 的源配置和 22.04 不一样,22.04 集中在/etc/apt/sources.list,24.04 则分散在/etc/apt/sources.list.d/ubuntu.sources。不管哪种格式,思路就是把它换成国内公共镜像源。

建议先备份原文件,再替换。我以阿里云镜像源为例,执行:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's@//archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list sudo sed -i 's@//security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list

Deb822 格式的系统执行类似操作,但要注意把URIs:那一行整个替换。换完源后执行sudo apt update,看到软件源列表正常刷新就没问题。

然后是时区。我每次都要手动设置,不然 Ubuntu 默认是 UTC,Windows 显示的是本地时间,日志对不上:

sudo timedatectl set-timezone Asia/Shanghai

接着装基础编译工具链:

sudo apt install -y build-essential curl wget git

Python 的 pip 源我也建议顺手配好:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

提示:换源后如果遇到apt update报错,先检查是不是替换时把行结构破坏了。我遇到过一次 24.04 的源替换后格式错乱,最终手动重写ubuntu.sources解决。

3. 把 WSL2 变成生产力:VSCode、Docker 与 D 盘迁移

3.1 VSCode + Remote-WSL 的打开方式

在 WSL2 里面写代码,最推荐的方式不是在 Linux 里装 VSCode,而是在 Windows 侧装 VSCode,然后通过 Remote-WSL 扩展远程连接到 WSL。这样 Windows 这边的编辑器、终端、Git 图形界面都还能用,编译、调试、Python 解释器则直接走 Linux 环境。

安装步骤很简单:

  1. Windows 侧安装 VSCode 。
  2. 扩展市场搜索Remote - WSL(即 WSL 扩展),安装。
  3. 进入 WSL,在项目目录执行code .。

第一次执行code .时,VSCode 会自动在 WSL 内部安装一个 server 组件。这个 server 是给 Linux 用的,所以会多占一点磁盘空间,属正常现象。连接成功后,VSCode 左下角会显示类似WSL: Ubuntu的状态,这时候你打开的终端、运行的任务、装的语言插件,实际都在 WSL 内部工作。

要注意插件是分开管理的。C++ 插件、Python 插件需要切换连接到 WSL 之后再安装一遍。很多人第一次用 Remote-WSL 会疑惑“为什么我 Windows 里装的插件没生效”,原因就在这。

3.2 语言环境的配置:C/C++、Python、Node 和 Java

WSL2 之所以适合做开发环境,核心在于多语言工具链都通过apt直接安装,环境干净、好清理。

C/C++ 基础环境:

sudo apt install -y gcc g++ gdb cmake clang

在 VSCode 里配合 C++ 插件,配置好tasks.json和launch.json就能直接 F5 调试。重点在于launch.json里调试器路径一般写/usr/bin/gdb,编译任务可以用 CMake 插件自动生成,比手动写 gcc 命令靠谱。

Python 开发我推荐用 Miniconda 管理环境。在 WSL 里装好 Miniconda 之后,一条命令创建一个干净环境:

conda create -n py311 python=3.11 -y conda activate py311

WSL2 里跑 conda 比 Windows 里跑平滑很多,路径问题少,底层库编译也顺畅。AI 方向的项目(比如 YOLOv8、BEVFormer)如果需要 CUDA,后面第 4 节我会细说。

Node 环境建议用 nvm 安装:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

装完nvm install 20,再node -v验证。Java 环境更简单:

sudo apt install -y openjdk-17-jdk maven

检查java -version没问题后,把JAVA_HOME写进~/.bashrc。注意 OpenJDK 的路径在/usr/lib/jvm/下,不同版本目录名不同,建议先update-alternatives --config java查清楚实际路径再写。

如果你做嵌入式开发,比如 STM32,WSL2 里同样能装 ARM 工具链:

sudo apt install -y gcc-arm-none-eabi openocd

但这里有个大坑:WSL2 不能直接访问 Windows 的 USB 串口设备。要烧写 STM32 或者接调试器,需要用微软官方的 USB/IP 方案usbipd-win。在 Windows 侧装好之后,管理员 PowerShell 里执行:

usbipd list usbipd bind --busid <busid> usbipd attach --wsl --busid <busid>

然后在 WSL 里就能看到/dev/ttyUSB0。不过说实话,嵌入式调试我最终还是会回到 Windows 侧做,因为 ST-Link 的生态工具链在 Windows 下更成熟,WSL2 更适合做代码编译和版本管理。

3.3 Docker Desktop 与 WSL2 的配合

Docker Desktop 现在默认走 WSL2 后端,原理上可以理解为:WSL2 提供了一个真正的 Linux 内核,Docker 容器则跑在这个内核之上。这比 Docker Desktop 早期用 Hyper-V 虚拟机的方式更轻量,资源占用更可控。

具体配置步骤:

  1. 安装 Docker Desktop,保持默认设置,确保它启用了 WSL2 backend。
  2. 打开 Docker Desktop 设置,进入 Resources → WSL Integration,勾选你使用的发行版,比如 Ubuntu-22.04。
  3. 在 WSL 里执行docker version,看到 Server 版本正常返回,说明打通了。

还需要顺手配置镜像加速。Docker Desktop 的 Docker Engine 配置里,可以加registry-mirrors:

{ "registry-mirrors": ["https://你的加速器地址"] }

加速器地址建议去自己云厂商控制台获取专属链接,这样既稳定又不依赖公共仓库。改完配置重启 Docker Desktop 生效。

如果你不想用 Docker Desktop,也可以在 WSL2 里直接装 Docker Engine。通过官方脚本:

curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER

这个方案适合只需要命令行操作、不需要图形管理界面的场景。

3.4 迁移到 D 盘:export/import 完整流程

WSL2 安装后默认把虚拟磁盘放在 C 盘,长期使用下来很容易占掉二三十 GB 空间。C 盘吃紧是早晚的事,所以迁移到 D 盘几乎是必做的操作。

整个流程分四步:

wsl --shutdown wsl --export Ubuntu-22.04 D:\backup\ubuntu.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\backup\ubuntu.tar

wsl --export会把整个虚拟磁盘导出成一个 tar 文件,这个文件可能非常大,耐心等。wsl --unregister会删除注册表里的发行版信息和 C 盘里的 vhdx 文件,这一步不可逆,一定要确认 tar 已经导出成功再执行,别手滑。

wsl --import后面两个路径分别表示新系统安装位置和 tar 文件路径。导入完成后有一个非常容易踩的坑:默认用户变成 root。因为 export/import 过程中用户信息没有同步到注册表,需要在导入后编辑/etc/wsl.conf:

[user] default=你的用户名

如果你用的是新版 WSL,也可以直接迁移 vhdx 文件:

wsl --shutdown # 找到 ext4.vhdx 所在路径,拷到 D 盘 wsl --import <发行版名> D:\WSL\Ubuntu-22.04 D:\WSL\ext4.vhdx --vhd

这种方式不用导出 tar,速度快不少。迁移完记得再次执行wsl --list --verbose,确认状态是 Running,再进入系统里检查一下项目环境是否还完整。

4. NVIDIA 驱动与 CUDA:让 WSL2 跑 AI 训练的关键

4.1 Windows 驱动和 WSL2 里的驱动逻辑

很多人在 WSL2 里验证英伟达驱动的时候会困惑:Windows 里明明装了驱动,为什么 WSL2 里nvidia-smi却报错了?还有人说“WSL2 里不能装驱动”,这句话其实只说对了一半。

WSL2 的图形与计算平台架构是:Windows 侧安装 NVIDIA 官方驱动后,显卡通过 GPU 虚拟化透传到 WSL2 内部,WSL2 不需要也不能重新安装显卡驱动。你在 WSL 里看到的/usr/lib/wsl/lib/libcuda.so这类的库,是 WSL 内核与 Windows 驱动之间的桥梁,它由 WSL 组件自动生成。

所以正确的姿势是:Windows 上装最新的 NVIDIA 驱动,WSL 里不能去 apt 装nvidia-driver-*或者.run驱动文件,否则会破坏这个桥接。WSL 里只需要安装 CUDA Toolkit 这类计算库,驱动由 Windows 提供。

验证方式是在 WSL 里执行:

nvidia-smi

如果输出显示 GPU 型号、驱动版本和 Windows 侧一致,那就说明透传正常。注意第一次跑nvidia-smi前可能需要先wsl --shutdown再重启一次 WSL。

4.2 CUDA Toolkit 安装路线

WSL2 的 CUDA 安装推荐使用 NVIDIA 官方 apt 仓库。它有一个专门的 WSL-Ubuntu 源,不是常规的 Ubuntu 源,别下错。

执行下面这几步:

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 sudo apt install -y cuda-toolkit-12-4

版本号可以根据当前官方发布调整。安装完成后,把环境变量写进~/.bashrc:

export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

验证:

nvcc --version

注意:只需要装cuda-toolkit-*,不要手贱去装cuda-drivers那个包。我在一台机器上装错过,结果把 WSL 和 Windows 驱动联动搞坏了,最后只能重置 WSL。

4.3 PyTorch 实测与验证命令

PyTorch 在 WSL2 里的安装逻辑和原生 Linux 一致,不需要特殊处理。假设你已经用 conda 创建了环境,执行:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

这里cu124表示 CUDA 12.4 的 wheel。务必根据驱动支持的 CUDA 版本选择对应的 wheel。装完之后,运行下面这段代码:

import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))

如果torch.cuda.is_available()返回 False,最常见的两个原因:一个是装成了 CPU 版 torch,另一个是 PyTorch 的 CUDA 版本太新,而 Windows 侧驱动太老导致不兼容。排查方法很简单,先看torch.version.cuda是什么版本,再看nvidia-smi里驱动支持的最高 CUDA 版本,两者要匹配。

我在 WSL2 里实测跑 YOLOv8 训练,一块普通消费级显卡,显存吞吐和原生 Linux 差距很小,日常开发完全够用。这也是我最终放心把 AI 环境从双系统切到 WSL2 的原因。

5. “启动不起来”“闪退”这类问题的排查链路与日常维护

5.1 启动失败的完整排查顺序

WSL2 最烦人的问题就是启动报错或闪退。这里有一套我总结的排查顺序,按顺序走,大部分问题都能定位。

第一步,收集报错信息。在 PowerShell 里执行:

wsl --status wsl --version

再直接输入wsl看有没有具体错误代码。常见错误代码有0x80370102、0x80040306等,记下代码再去搜。

第二步,检查 Windows 功能和虚拟化是否正常。确认“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能都在“可选功能”里处于启用状态,同时确认任务管理器里“虚拟化”是“已启用”。如果被禁用,进 BIOS 开启后重启。

第三步,更新 WSL 组件。很多闪退问题其实是 WSL 内核和 Windows 版本不匹配导致的,执行:

wsl --update wsl --shutdown

再重新进 WSL。

第四步,如果依然失败,别急着unregister。先找到这个发行版的ext4.vhdx文件,路径一般在:

C:\Users\<用户名>\AppData\Local\Packages\<发行版包名>\LocalState\ext4.vhdx

把这个 vhdx 复制备份好,再决定要不要重置系统。因为一旦 unregister,里面的所有环境都没了,后续恢复成本很高。

有一个排查思路要记住:WSL2 启动和运行是两套逻辑。启动失败多半是 Windows 层面问题,比如虚拟化、Hyper-V 组件损坏;运行中闪退则多半是内核崩溃、OOM 或者显卡驱动冲突。处理方式完全不一样。

5.2 GUI 图形界面与 WSLg 的问题定位

Windows 11 的 WSL2 默认带 WSLg,可以直接运行 Linux GUI 程序,比如:

sudo apt install -y gedit gedit

如果能弹出图形窗口,说明 WSLg 正常。如果窗口起不来,先检查DISPLAY环境变量:

echo $DISPLAY

正常情况下 WSLg 会输出:0。如果为空,多半是 WSLg 组件没有正常工作,执行wsl --shutdown再重启试试。

如果是 Windows 10,没有 WSLg,就需要自己配置 X server。可以用 VcXsrv 这类工具,在 Windows 侧启动 X server 后,把 WSL 里的DISPLAY指向 Windows 局域网 IP。这种方案能用,但体验不如 WSLg 丝滑,所以我一般建议 Windows 10 用户如果想折腾 GUI,要么升级 Win11,要么把重心放在命令行开发上。

5.3 网络与端口转发的几个注意点

WSL2 默认的网络模式是 NAT,WSL 内部和 Windows 之间是隔离的,但微软在 Windows 侧做了 localhost 转发。也就是说,WSL 里启动的服务,Windows 这边访问localhost:端口通常可以直接通。

但这里有个反直觉的坑:如果你在 WSL 里监听了0.0.0.0的端口,而 Windows 防火墙规则比较严,Windows 访问 localhost 转发可能不通。解决办法不是去关防火墙,而是先确认服务只监听127.0.0.1还是0.0.0.0,并优先使用 localhost 转发。

如果想让局域网其他设备直接访问 WSL 里的服务,可以用 portproxy 转发:

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=<WSL内部IP>

新版 WSL 还支持 mirrored 网络模式,在.wslconfig里加上:

[wsl2] networkingMode=mirrored

开启后 WSL 和 Windows 共享网络接口,端口转发、局域网访问都更自然。不过这个模式依赖 WSL 2.0 版本和较新的 Windows 版本,如果遇到网络不稳定,切回默认 NAT 就好。

5.4 磁盘膨胀与日常维护

WSL2 的 vhdx 虚拟磁盘有个特性:只增不减。删除 Linux 里的大文件后,Windows 侧对应的 vhdx 文件大小并不会自动缩小。时间长了,C 盘空间会莫名其妙地 “蒸发”。

定期做两件事。第一,在 WSL 里清理无用的包:

sudo apt autoremove sudo apt clean conda clean --all

第二,压缩 vhdx。在 PowerShell 管理员模式下执行:

wsl --shutdown

然后找到 vhdx 文件路径,用 diskpart 压缩:

diskpart select vdisk file="C:\Users\<用户名>\AppData\Local\Packages\<发行版包名>\LocalState\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit

压缩完再看文件大小,往往能瘦身几个 GB。这个操作对系统没什么风险,但如果你在 WSL 里跑着重要服务,记得先停掉。


最后分享几个我个人习惯上的小细节。我平时会在.wslconfig里固定限制 WSL 的内存和 CPU 核数,防止它跟 Windows 抢资源;所有项目一律放在/home/<用户名>/code下面,而不是/mnt/c;每隔一两个月导出一份 WSL 备份 tar,放在移动硬盘上。这套组合下来,WSL2 环境在我这边已经稳定跑了大半年,CUDA 训练、Docker 部署、STM32 工具链编译都在里面完成,基本没再折腾过系统环境。如果你也正在 Windows 上配 WSL2,希望这篇记录能帮你省下几个晚上的排查时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询