☰
Windows11上用WSL2+Ubuntu22.04搭建Linux开发环境全攻略
2026/10/7 3:15:50 网站建设 项目流程

提到 Windows 下的 Linux 开发环境,我前几年折腾过好几种方案:装双系统来回重启,连开发文档都要复制两份;用虚拟机跑 Ubuntu,内存和 CPU 被吃掉一大半,共享文件还要折腾什么共享文件夹;后来试过 Cygwin,开发可以,一但涉及部署就又变成另一套行为。直到 WSL2 配合 Ubuntu 22.04 在 Windows 11 上跑起来,我才真正愿意把大半开发工作搬到这台机器上。WSL2 不是一台传统意义上笨重的虚拟机,它和 Windows 共享网络、剪贴板、文件系统,启动一个 Linux 环境只要几秒钟。这篇内容就把从零搭建的完整过程、背后的选型逻辑、踩过的坑和配置技巧一五一十摊开讲,适合刚接触 WSL 的新手,也适合已经装上但被各种报错折腾过的人。

1. 为什么选 WSL2 + Ubuntu 22.04:先想清楚再动手

1.1 传统方案到底痛在哪

先说双系统。以前我在一台笔记本上装了 Windows 11 和 Ubuntu 22.04 双系统,切系统要关机,开机时进引导菜单选系统,等着系统慢慢起来。每次切换花掉的时间,足够我去接一杯水再回来。更麻烦的是两个系统之间的文件往来基本靠 U 盘或网络共享,时间一长就开始烦躁。

虚拟机好一些,VMware 和 VirtualBox 都能在 Windows 窗口里跑 Ubuntu。但开一台虚拟机就要固定占用几个 CPU 核心和几个 G 的内存,笔记本风扇经常起飞,磁盘占用动辄四五十个 G。做轻量开发还行,一旦要跑 Docker 集群或者同时开两台测试机,窗口切换和资源调度都让人头大。

Cygwin 和 MSYS2 这类方案一开始很吸引人,因为在 Windows 里直接跑 bash、vim、git,没有虚拟化开销。可它们毕竟是“翻译层”,很多 Linux 的系统调用和 /proc、cgroup 行为不完整,数据库、容器、性能分析工具常常跑不起来。真正想学 Linux 运维或者做服务器端开发,这套方案很难撑住。

1.2 WSL2 和 WSL1、虚拟机的本质区别

WSL2 和上面所有这些方案都不太一样。它本质上是一个轻量级虚拟机,但这个虚拟机经过微软专门优化,和 Windows 的进程调度、内存回收、网络共享做了深度集成。你运行 wsl 命令,几秒钟就能进 Ubuntu 的 shell,和本机进程几乎体验一致。

WSL1 是把 Linux 系统调用翻译成 Windows 调用,兼容性有限;WSL2 则是真实跑一个 Linux 内核,所以 Docker、systemd、内核模块这类对系统调用完整性要求高的东西都能正常工作。代价是它需要 Windows 开启“虚拟机平台”功能。简单理解:WSL1 是“假扮”,WSL2 是“真装”,只是装得特别轻巧。

从版本上看,Windows 11 21H2 之后 WSL2 已经默认可用,微软还在不停更新内核。Win11 22H2 及以上配合商店版 WSL,功能更全:支持 systemd、支持 WSLg 图形界面、支持 mirrored 网络模式。所以如果你手里是 Win11,基本没有理由不用它。

1.3 为什么发行版偏偏选 22.04 LTS

WSL 里可以装很多发行版,Ubuntu、Debian、Kali、openSUSE 都有。我选 Ubuntu 22.04 LTS,图的是稳定和生态。22.04 属于长期支持版本,官方支持到 2027 年 4 月,意味着软件源里的依赖版本在一定时期内不会大动,项目环境维护起来不用担心更新把依赖搞坏。

20.04 当然也很稳,但 GCC、Python、Node.js 这些默认包版本偏老,不少新的编译需求要手动加 PPA。24.04 的新特性确实多,不过它发布时间不算太长,对于谨慎跑在开发机器上的人,我会更推荐等软件生态再跟一跟。

还有一个很实际的因素:目前很多第三方软件的安装文档默认命令都是按 Ubuntu 22.04 写的,比如 ROS、ROS2 和各种嵌入式环境,一搜教程基本都是 jammy 的源。跟着官方文档跑最省心,不用自己翻译版本号。

2. 动手前的检查清单:系统版本、虚拟化与 Windows 功能

2.1 系统版本与硬性门槛

先确认你的 Windows 11 版本。最简单的方法是按 Win+R 输入 winver。WSL2 在 Windows 11 21H2 以上都能用,但为了省心,建议升到 22H2 或更高,系统更新保持开启。

如果电脑是 Windows 10,也不是不能用,但体验会打折扣:WSLg 图形界面默认不支持早期版本,商店版 WSL 的很多新特性也要手动折腾。既然标题写明 Windows 11,我默认你跑的是 Win11。

内存建议 8G 起步,16G 会更舒服。我自己这台是 32G,不过日常分配 6G 给 WSL 已经够用。CPU 方面,只要近年出的主流处理器都行,关键不是性能,而是必须支持并开启虚拟化。

2.2 虚拟化必须打开:BIOS 与 Windows 功能

WSL2 依赖轻量级虚拟机,而这个虚拟机必须先确认 CPU 虚拟化已经开启。打开任务管理器,切到“性能”页签,看左下角“虚拟化”是不是“已启用”。如果显示“已禁用”,就要重启进 BIOS,找到 Intel Virtualization Technology(Intel VT-x)或 SVM Mode(AMD),把它设为 Enabled。不同主板选项位置不一样,但关键词基本就是 VT-x、SVM、Virtualization 这几个,改完保存退出。

然后启用 Windows 可选功能。用管理员身份打开 PowerShell,执行两条命令:

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

第一条把 WSL 基础功能打开,第二条是虚拟机平台,WSL2 必须靠它。执行完重启一次,再继续下一步。Win11 用户也可以直接在“启用或关闭 Windows 功能”窗口里手动勾选这两个项,效果一样。

2.3 常见的“WSL 尚未准备就绪”到底卡在哪

这个提示在刚接触 WSL 的用户里出现频率极高。执行 wsl 命令后,PowerShell 要么提示尚未准备就绪,要么报一串错误。我遇到过几次,总结下来原因就三类:一是 Windows 功能没开全,尤其是 VirtualMachinePlatform 没启用;二是根本没重启系统,功能虽然开了但内核和虚拟化栈还没加载;三是 BIOS 里的虚拟化被关掉。碰到这种报错,先把 2.1 和 2.2 两步重新走一遍,90% 都能解决。

另外要注意,新版本 WSL 有一个独立的内核组件和商店应用,如果系统提示需要更新 WSL,就执行 wsl --update。很多网上教程只讲到功能开关,漏了内核更新,导致后面装到一半又报错。

3. 安装全流程:一行命令在 Win11 装好 Ubuntu 22.04

3.1 用 wsl --install 快速完成基础安装

检查做好之后,安装其实很爽。管理员 PowerShell 里执行:

wsl --install

这条命令会做三件事:装上 WSL 核心组件、启用虚拟化平台、下载并安装默认的 Ubuntu 发行版。执行完系统会提示重启,重启后它会自动完成剩余配置。

如果它默认安装的发行版不是 22.04,或者你想显式指定 Ubuntu 22.04,可以单独执行:

wsl --install -d Ubuntu-22.04

想看看商店里到底有哪些发行版,可以用:

wsl --list --online

注意发行版名字要写对,Ubuntu-22.04 和 Ubuntu 是两个独立条目。安装过程中如果提示正在下载,耐心等。装完会弹出 Ubuntu 的终端窗口;如果没有任何反应,也可以按 Win 键搜 Ubuntu 打开。

3.2 首次初始化:用户、密码与版本验证

第一次启动 Ubuntu,它会让你设置一个 Unix 用户名和密码。注意这个用户和 Windows 账户没有关系,它是 Ubuntu 里的独立账户,密码输入时不会回显,不用害怕。用户名建议不带空格且小写,我用的 dev。这个账户默认有 sudo 权限,文件都在 /home/dev 下面。

初始化完成,先看看装的是什么版本:

cat /etc/os-release uname -r

uname -r 会显示 WSL 内核版本,如果出现类似 5.15.90.x 的版本,说明确实跑在 WSL2。再看一眼 WSL 状态,回到 PowerShell 执行 wsl -l -v,输出里 VERSION 列应该是 2。如果是 1,执行 wsl --set-version Ubuntu-22.04 2 切换到 WSL2。

3.3 换源与系统更新:这步别偷懒

Ubuntu 官方源在国内的速度不一定稳定,我一般第一时间换到清华源或阿里源。先备份原文件:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后替换源地址。Ubuntu 22.04 的代号是 jammy,使用清华源可以这样改:

sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g; s@//security.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list

如果你打开文件看到的是 http://archive.ubuntu.com/ubuntu 或者 http://security.ubuntu.com/ubuntu,这两条 sed 就够。也可以用 nano 或 vim 直接改。改完执行:

sudo apt update && sudo apt upgrade -y

顺手把常用的基础工具装上:

sudo apt install -y build-essential git curl wget net-tools htop ca-certificates

build-essential 包含 gcc、g++、make 等编译工具,做开发基本绕不开。其他包按需加,不用一次装太多。

3.4 下载太慢的替代方案:不用商店也能装

wsl --install 走的是微软的下载通道,默认发行版下载偶尔会非常慢。遇到这种情形不要一直干等,可以手动导入发行版。先去 Ubuntu 官方 CDN 或国内镜像站下载 WSL 专用的 Ubuntu-22.04 rootfs 压缩包,通常是 tar.gz。拿到文件后,在 PowerShell 里建一个目录,然后导入:

mkdir C:\wsl\ubuntu2204 wsl --import Ubuntu-22.04 C:\wsl\ubuntu2204 D:\downloads\jammy-wsl-amd64.tar.gz --version 2

文件名按你实际下载到的来,一般类似 jammy-wsl-amd64.tar.gz。导入完成后用 wsl -d Ubuntu-22.04 启动。手动导入的发行版默认用户是 root,想换成普通用户,可以在 /etc/wsl.conf 中加一段:

[user] default=你的用户名

保存后执行 wsl --shutdown 再重开即可。这个方法不只解决下载慢,还方便你把一个定制好的 Ubuntu 环境打包到别的机器,不用重新配一遍。

4. 装完必做的优化:内存限制、文件互访与 systemd 配置

4.1 用 .wslconfig 管住内存与 CPU

WSL2 默认会占用不小的内存。刚装完,如果你电脑空闲内存本来不多,打开任务管理器会看到一个叫 vmmem 的进程,内存可能占到可用内存的 50% 甚至 80%。这不是 bug,WSL2 的设计就是尽量利用空闲内存做缓存,但你要是觉得卡,可以在 Windows 用户主目录下建一个 .wslconfig 文件,对资源进行限制:

[wsl2] memory=6GB processors=4 swap=2GB localhostForwarding=true

文件路径是 C:\Users\你的用户名.wslconfig,直接记事本新建即可。memory 是分配给 WSL 的最大内存,processors 限制线程数,swap 是 Linux 里的交换空间大小。改完必须执行 wsl --shutdown 再重新进 WSL 才生效。我建议设置为物理内存的一半左右,比如 16G 机器给 6G,32G 机器给 8G 到 12G,都够日常开发了。

4.2 文件互访:项目千万别放 /mnt/c 下跑

WSL2 里的 Linux 和 Windows 文件系统可以互相访问。在 PowerShell 或文件管理器地址栏输入:

\\wsl.localhost\Ubuntu-22.04\home\你的用户名

就能以目录形式看到 Linux 里的文件,图形化操作很方便。反过来,在 WSL 终端里访问 Windows 的 C 盘,路径是 /mnt/c/,D 盘是 /mnt/d/。

但这里有个我踩过的大坑:千万别把大项目、Git 仓库、node_modules 放在 /mnt/c 或 /mnt/d 下,然后在 WSL 里编译、安装依赖。因为 /mnt/c 是跨文件系统映射,每次读写都要经过 9P 协议,大量小文件的性能损耗特别明显。同样一个 npm install,放在 /home/dev 下可能只要十几秒,放在 /mnt/c 下可能要好几分钟甚至直接报错。规范做法是:项目代码放到 WSL 内部的 /home/你的用户名 下,真正需要和 Windows 共享的少量文件,再通过 /mnt/c 或网络位置拷贝。

4.3 开启 systemd,顺手用上 WSLg 图形界面

Windows 11 上的 WSL 已经支持 systemd。默认情况下 systemd 没有启用,导致你执行 systemctl status 会报错,docker 这类服务也没法用 systemctl 管理。开启方法是编辑 /etc/wsl.conf:

[boot] systemd=true

保存后执行 wsl --shutdown,重新启动 Ubuntu,再用 systemctl status 验证,就能看到 systemd 已经跑起来了。这之后安装的软件,基本和真实 Ubuntu 服务器一致,学到的东西也能直接用在生产的 Linux 上。

WSLg 是另一个福利。Win11 自带对 Linux GUI 程序的支持,不需要 VcXsrv 或者 Xming 之类的第三方 X 服务器。在 Ubuntu 里装一个 gedit 或者 xeyes,直接在 Windows 桌面上弹出一个 Linux 窗口,画风有点“穿越”,但做小工具验证挺方便。不过我不建议把整个开发界面都挪到 WSLg 里跑,正经开发还是用 VS Code 的 Remote-WSL 插件,在 Windows 窗口里写代码,编译和运行都在 WSL 里,中间一切自动完成,这个体验我觉得才是 WSL 最值钱的特性。

4.4 Docker 与 GPU 场景的延伸配置

Docker 在 WSL2 里有两条路。一是在 Windows 侧安装 Docker Desktop,安装时勾选 Use WSL 2 based engine,然后在 Settings -> Resources -> WSL Integration 里把 Ubuntu-22.04 打开;这样 Docker CLI 在 WSL 里可用,容器后台实际跑在 WSL2 的专属虚拟化环境里,两者互通。二是直接在 Ubuntu 里安装 docker.io,用 systemd 管理:

sudo apt install -y docker.io sudo systemctl enable --now docker sudo usermod -aG docker $USER

第一种适合习惯图形界面的,第二种更接近真实服务器操作,我推荐按第二种方式做一遍,顺手把 systemd 和权限管理都熟悉了。

如果电脑有 NVIDIA 显卡,并且 Windows 侧已经安装了最新显卡驱动,WSL2 里的 nvidia-smi 基本可以直接用,不需要在 Linux 里再装驱动。CUDA 工具链可以在 WSL 里单独安装,NVIDIA 官方在 WSL 下提供了专门的安装包。这里不展开细节,但你至少要知道 WSL2 在 GPU 计算场景是有明确通道的,不是在装一个“玩具”。

5. WSL2 常见问题排查与避坑实录

5.1 “WSL 尚未准备就绪”/0x800701bc/0x80370102

这几类错误基本都指向同一个问题:Windows 可选功能未启用,或虚拟化被关闭。在管理员 PowerShell 里执行:

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

然后重启,通常就好了。如果是 0x80370102,还有一个可能:BIOS 里 Intel VT-x 或 SVM 未打开。确认方法还是看任务管理器的虚拟化状态。

还有一种少见情况是“适用于 Linux 的 Windows 子系统”功能显示已启用,但 WSL 内核不是最新。执行 wsl --update 更新内核,再 wsl --shutdown 重启 WSL。这个步骤太容易被忽略,我每次排查都建议走一遍,成本低,收益大。

5.2 WSL 里的服务,局域网设备访问不到怎么办

在 WSL 里跑了个 Web 服务,Windows 浏览器用 localhost:3000 访问,默认是能通的,WSL2 自带 localhost 转发。但局域网其他设备要访问 WSL 里的服务,默认 NAT 网络模式就不行了。

新版 WSL 支持 mirrored 网络模式,在 .wslconfig 里加一行 networkingMode=mirrored,然后 wsl --shutdown 重开。加了这个,WSL 和 Windows 共享同一块网卡、同一套防火墙,局域网设备可以直接访问到 WSL 里的服务,基本不用再折腾端口转发。注意这个功能需要 WSL 2.0 以上以及较新的 Windows 11 版本,如果你的 wsl --version 输出较旧,先 wsl --update。

如果一定要用老办法,可以手动加一条端口转发规则,原理是把 Windows 某个端口转发给 WSL 的 IP:

netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=<WSL的IP>

WSL 的 IP 用 ifconfig 或 ip addr 查,但 NAT 模式下每次重启 IP 都可能变,比较麻烦,所以我还是更推荐 mirrored 模式。

5.3 彻底卸载 Ubuntu 22.04 并重装

WSL 里的发行版和普通 Windows 应用不一样,卸载方式有讲究。如果你只想清除这个发行版的所有数据,在 PowerShell 里执行:

wsl --unregister Ubuntu-22.04

这会删除整个虚拟磁盘,把 Ubuntu 从发行版列表里移除。注意一定要先备份需要的文件。如果只是想“重置”而不动 Windows 的其他东西,unregister 之后再 wsl --install -d Ubuntu-22.04 重新装一遍即可。

手动导入的发行版也可以同样操作。如果你发现 wsl -l -v 列表里残留了已删除的项,多半是没执行 unregister,而是直接删了文件夹,导致注册信息还在。正确顺序是先 unregister 再删除目录。这个细节我吃过亏,特意提醒一下。

5.4 其他高频小毛病与我的备份习惯

还有一些高频小问题。比如 locale 警告,提示语言环境不支持,可以运行 sudo apt install -y locales && sudo locale-gen zh_CN.UTF-8,不过很多场景下英文 locale 反而更省心。比如 Git 仓库提示文件权限过宽,则需要在 Windows 侧把整个发行版目录的权限修一次,或者干脆在 wsl.conf 里设置 [automount] 的选项。这些都属于用得着才看的内容,不用一开始全记住。

最后说一个我自己的习惯:WSL 环境一旦配置顺手,我会用 wsl --export 做一次整体备份。等哪天把系统搞乱了,导入回去立刻恢复,省掉重新配环境的时间。操作大概是这样:

wsl --export Ubuntu-22.04 D:\backup\ubuntu2204.tar wsl --import Ubuntu-22.04 C:\wsl\ubuntu2204 D:\backup\ubuntu2204.tar --version 2

导出的整个文件系统可能体积很大,但对稳定环境的开发者来说,这份保险非常值。备份完再顺手把 Windows Terminal 设成默认终端,把 Ubuntu 做成默认配置文件,以后一键就能进 WSL,这才是拿来开发的顺手状态。我的体会是:WSL2 加 Ubuntu 22.04 这套组合,最值得投入时间的地方其实不在“装”这一步,而是装完之后的资源约束、文件规划、systemd 和备份习惯。把这些理顺了,日常开发里你基本感觉不到 Windows 和 Linux 是两个系统。

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

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

立即咨询