☰
WSL2安装配置实战:打造Windows上的高效Linux开发环境
2026/10/17 10:21:22 网站建设 项目流程

WSL2 系统安装和使用,这个话题我陆陆续续折腾了好几年,从最早 WSL1 出来时就当主力开发环境用,到现在 WSL2 也成了我日常绕不开的基础设施。如果你也处在“想在 Windows 上跑 Linux 环境,但又不想开虚拟机 / 不想折腾双系统”的状态,那这篇文章就是给你准备的。我会从安装前的前置检查、完整安装流程、常用配置,到高频使用技巧和踩坑实录,一步一步把 WSL2 讲明白,保证你照着做就能跑起来,并且能真正把它当成生产级的开发环境来用。

1. 为什么推荐把 WSL2 作为首选开发环境

1.1 WSL2 到底是什么

WSL2 是 Windows Subsystem for Linux 的第二代实现,它的本质变化是引入了一个真正轻量级的虚拟机。WSL1 走的是系统调用翻译层路线,把 Linux 的系统调用转成 Windows 的系统调用,兼容性有限;而 WSL2 直接在 Windows 上跑了一个经过深度优化的虚拟机内核,这个虚拟机由 Windows 统一管理,不需要你手动装 VMware 或者 VirtualBox,也不会有传统虚拟机那种笨重的图形界面和资源开销。

对你来说,使用体验上最大的改变就是:ls、grep、git、curl、npm、yarn、python这些命令都是原生的 Linux 二进制文件,而不是早期那种翻译层模拟出来的行为。比如跑docker,WSL1 时代要借助 Docker Desktop 做很多兼容处理,到了 WSL2 里,内核原生支持容器所需的各种特性,配合 Docker Desktop 的 WSL2 backend,几乎就是无缝体验。

我的直观感受是,WSL2 特别适合两类人:一类是日常以 Windows 为桌面主力、但开发工作依赖 Linux 生态的人;另一类是刚接触 Linux、不想立刻切换整个操作系统的学生或刚入行的开发者。它既保留了 Windows 的图形界面和办公软件生态,又能让你在终端里拥有一个“熟悉又正宗”的 Linux 环境。

1.2 相比双系统和传统虚拟机,WSL2 解决了什么问题

很多人听到“Windows 上用 Linux”第一反应是装双系统或者上虚拟机,这两个方案我都认真用过,说下实际差距:

双系统最大的问题是切换成本。每次想跑 Linux 都得重启,而且 Windows 和 Linux 各自占一块磁盘空间,文件互相访问还得靠额外分区或网络共享,日常开发中“一个项目在 Windows 上编辑、在 Linux 上跑”的场景,双系统根本没法优雅解决。

传统虚拟机则有两个绕不开的痛点:一是资源固定分配,你给它 4G 内存它就始终占 4G,哪怕虚拟机里啥也没干;二是文件共享和端口映射很别扭,虚拟机里的服务想从 Windows 浏览器里访问,还得配网络模式、端口转发。WSL2 则不同,它按需启动,内存和 CPU 都是动态申请,不使用时资源自动释放;网络层面通过 localhost 直接互通,你在 WSL2 里启动一个nginx或Vite服务,Windows 浏览器里打开localhost:8080就能访问,不需要任何额外配置。

我自己的主力工作流就是:Windows 负责 Office、浏览器、IM 和各类 GUI 工具,WSL2 负责代码编辑、编译、测试、部署脚本和容器运行。两者通过\\wsl$\路径共享文件,或者直接在各项目目录里协作。这个组合用顺手之后,基本不会再想碰双系统了。

2. 安装前必须确认的几件事

2.1 系统版本和固件要求

WSL2 的安装条件并不苛刻,但仍有几条硬性门槛,建议先自查一遍,避免装到一半报错。

首先是 Windows 版本。WSL2 最早在 Windows 10 版本 2004 或更高版本中完整支持,Windows 11 则全部内置。如果你还在用老旧的 Windows 10 版本,建议先把系统更新到近几个大版本,因为 WSL2 的一些内核更新、网络改进都依赖于系统组件同步升级。可以通过winver命令快速查看当前 Windows 版本号和内部版本号。

其次是 BIOS / UEFI 固件里的虚拟化开关。WSL2 的底层是虚拟机,所以必须开启 CPU 虚拟化,在 Intel 平台叫 VT-x / Intel Virtualization Technology,在 AMD 平台叫 SVM。大部分近几年的电脑出厂默认开启,但如果你是在公司统一配发的机器上操作,有概率被安全策略关掉。检查方法很简单:打开任务管理器,切到“性能”页,看 CPU 条目下方有没有“虚拟化:已启用”这行字。如果显示“已禁用”,就要重启进 BIOS 设置里打开,这一步不做,后面 WSL2 无论如何也起不来。

另外,如果你的机器内存只有 4G 甚至更小,我建议你认真考虑一下有没有必要上 WSL2。因为一个空闲状态的 WSL2 发行版也会占掉几百 MB 内存,跑起编译任务后内存会迅速爬到 2G 以上,内存太小的机器体验会很差。我自己在 8G 内存的旧笔记本上跑过,日常轻量开发没问题,但开 IDE 加 WSL2 加浏览器就会紧张。如果条件允许,尽量保证 16G 内存再作为主力环境使用。

2.2 虚拟化之外,还有两个容易忽略的前置项

一个是“适用于 Linux 的 Windows 子系统”这个可选功能是否开启。在控制面板 -> 程序 -> 启用或关闭 Windows 功能里,你能看到适用于 Linux 的 Windows 子系统和虚拟机平台两个选项,二者都需要勾选。网上很多教程只会提到前者,实际上 WSL2 必须要“虚拟机平台”配合,否则即便装了发行版,也会在启动时提示内核或虚拟化相关错误。

另一个是检查是否安装了 WSL2 内核更新包。Windows 10 较早期版本不会自动附带新内核,需要从官方下载内核更新包并安装。如果你已经升级到较新的 Windows 10 / Windows 11,一般可以通过wsl --update直接联网更新内核,这个命令也会把 WSL 整体组件更新到最新。

值得提醒的是,在 Windows 功能面板里勾选这两个选项之后,系统通常会要求重启。不要跳过重启,否则 WSL 相关服务不会正确初始化。这个坑我踩过好几次,重启之后再看,一切才正常。

3. 一步步完成 WSL2 系统安装

3.1 一条命令完成基础安装

从较新的 Windows 10 版本和 Windows 11 开始,安装 WSL2 已经是一条命令的事。以管理员身份打开 PowerShell 或终端,执行:

wsl --install

这条命令会自动完成以下几件事:启用 WSL2 所需的所有 Windows 可选功能、下载并安装 WSL2 内核、把你的默认发行版设置为 Ubuntu(默认版本,不带图形界面)、并注册基础的 Linux 发行版环境。

执行过程中可能会提示“正在下载 Ubuntu”,这一步需要网络顺畅,国内网络环境下偶尔会卡住或下载缓慢。如果长时间停在下载阶段,可以考虑检查网络代理设置,或者换用稍后介绍的 Store 安装方式。

首次安装完成后,系统会要求重启。重启后第一次启动 Ubuntu 终端,会提示你创建一个新的 UNIX 用户名和密码。这个用户是发行版里的普通管理员用户,默认拥有 sudo 权限,用户名可以和 Windows 用户名不同。密码输入时终端不显示任何字符,这是正常现象,不是键盘出了问题。

如果你不想用默认的 Ubuntu,想装 Debian、Kali、openSUSE 或者 Alpine,可以用带参数的安装命令,先看看有哪些可用的发行版:

wsl --list --online

然后指定发行版名称安装,比如:

wsl --install -d Debian

这个方式的好处是省去了图形界面 Store 的点击操作,适合对命令行熟悉的用户。从可维护性上讲,我也更推荐用命令方式安装,因为后续通过wsl --list能看到每个发行版的运行状态和版本,管理起来一目了然。

3.2 手动安装的备用路径(启用 Windows 功能)

有些电脑环境政策受限,或者wsl --install命令不生效,可以走传统手动路径。先以管理员身份打开 PowerShell,执行:

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

这两条命令对应的就是让我确认过的两个可选功能。执行完后重启系统。接着去 Microsoft Store 搜索“Windows Subsystem for Linux”或“Ubuntu”,点击安装。如果你在用 Windows 10 旧版本,还需要手动下载 WSL2 内核更新包并安装。

走完这套流程后打开 Ubuntu 应用,同样会进入初始化用户和密码的环节。相比之下,新命令方式更省事,但手动路径能让你清楚每一步改动在系统里做了什么,排查问题时更有底气。

3.3 安装指定的 Linux 发行版

除了默认的 Ubuntu,我实际使用中发现 Debian 和 Alpine 也各有优势。Debian 比 Ubuntu 更精简,没有 Snap 这类额外组件,适合喜欢干净系统的人;Alpine 资源占用极小,适合做极简脚本环境或容器基础镜像测试。不过对大多数普通开发者和学习者来说,Ubuntu 依然是首选,因为教程最多、软件源最全、遇到问题时搜索解决方案也最容易命中。

安装多个发行版是完全可行的,WSL 会帮你管理它们各自独立的文件系统和配置。你可以用 Ubuntu 做主力开发,用 Debian 测试脚本兼容性,再用 Alpine 做轻量验证。它们可以同时运行,也可以随时通过命令关闭某个发行版以释放内存。

日常管理发行版用这几个命令就够了:

  • wsl --list --verbose查看所有发行版的名称、运行状态和 WSL 版本
  • wsl --terminate <发行版名>关闭指定发行版
  • wsl --set-default <发行版名>设置默认发行版
  • wsl --unregister <发行版名>彻底删除发行版及其文件系统

其中--unregister要特别谨慎,它会删除该发行版里所有数据,这个操作不可逆。我通常会先确认里面积累的文件都已备份,才执行这条命令。

4. 切到 WSL2 版本并完成初始化配置

4.1 把默认版本设为 WSL2

安装好的 WSL 默认使用 WSL2 还是 WSL1,取决于你的系统版本和初始配置。建议安装完成后的第一件事就是显式设置默认版本为 WSL2:

wsl --set-default-version 2

如果想确认当前每个发行版到底跑在 WSL1 还是 WSL2 上,执行:

wsl --list --verbose

输出结果里会有一个VERSION列,显示 1 或 2。如果某个发行版还是 WSL1,可以用以下命令单独转换:

wsl --set-version <发行版名> 2

转换过程中 WSL 会为该发行版重新构建虚拟磁盘,也就是把文件系统从 WSL1 的映射方式迁移为 WSL2 的虚拟磁盘格式。如果你的发行版里数据很多,这个过程可能耗时,但一般不会损坏数据。完成后建议重启一下终端再使用。

需要注意,WSL2 和 WSL1 在极个别的场景下行为不同。比如 WSL2 的 IP 地址是内网虚拟机分配的,和宿主机不是同一个网络栈;而 WSL1 是共享 Windows 网络栈。如果你遇到个别脚本对网络环境敏感,可以临时把它切回 WSL1 对比测试,不用重新安装整个系统。

4.2 初始化账户、换源和升级组件

第一次进入发行版后,先执行一次全量更新,把软件源索引和已装软件升级到最新:

sudo apt update && sudo apt upgrade -y

这个步骤很重要。出厂镜像里的软件包往往不是最新版,尤其涉及编译工具链时,旧版本库经常会出现依赖冲突。之后建议安装常用基础工具包:

sudo apt install -y build-essential git curl wget unzip zip \ python3 python3-pip htop net-tools

如果你是国内网络环境,建议把 apt 源切换到国内镜像站。镜像站的选择和操作步骤各家都有差异,但基本套路是编辑/etc/apt/sources.list,把archive.ubuntu.com和security.ubuntu.com替换成镜像站域名,然后再次执行sudo apt update。切换源后下载速度提升非常明显,这也是我在国内实际使用时最重要的优化之一。

对于开发环境,我还会顺手配置好 git 的用户名和邮箱,然后把 SSH 密钥生成好:

git config --global user.name "Your Name" git config --global user.email "you@example.com" ssh-keygen -t ed25519 -C "you@example.com"

这些初始化动作并不复杂,但如果跳过,后面开发时常会卡在提交代码、拉取私有仓库等环节。养成“装完系统先初始化环境”的习惯,能省掉很多不必要的麻烦。

4.3 通过 .wslconfig 对资源占用做精细化控制

WSL2 默认会使用宿主机一定比例的内存和 CPU,如果你不是把它当作唯一开发环境,在 Windows 上还有其他大内存应用在跑,建议创建%UserProfile%\.wslconfig文件来控制资源上限。文件位置在 Windows 用户主目录下,内容是 INI 格式:

[wsl2] memory=8GB processors=4 swap=2GB localhostForwarding=true
  • memory限制 WSL2 虚拟机最多使用的内存;
  • processors限制最多使用的 CPU 核数;
  • swap设置交换文件大小;
  • localhostForwarding控制是否允许在 Windows 侧访问 WSL2 里启动的 localhost 服务。

保存配置后,需要执行wsl --shutdown使所有发行版完全停止,然后重新打开发行版,配置才生效。这个文件是我调整 WSL2 使用体验最常用的手段,比如临时跑大模型编译任务时调到 16G,平时日常开发降到 6G,改动后重启即可,非常灵活。

顺带提一句,WSL2 的虚拟磁盘文件默认存放在你 Windows 用户目录的AppData\Local\Packages下。如果 C 盘空间紧张,可以通过导出、注销、导入的方式把整个发行版迁移到 D 盘或 E 盘,命令是:

wsl --export <发行版名> D:\backup.tar wsl --unregister <发行版名> wsl --import <发行版名> D:\wsl\ <D:\backup.tar> --version 2

迁移之后需要注意,重新导入的发行版默认用户会变成 root,需要额外通过配置文件或命令把默认用户改回原来的普通用户。这一步如果不到位,后续文件权限会让你比较头疼。

5. 实际使用中高频操作与集成技巧

5.1 用 Windows Terminal 管理多个发行版

WSL2 安装后通常会直接在 Windows 终端里注册一个配置文件。我个人强烈建议安装 Windows Terminal,它比传统的 cmd 和 PowerShell 界面强太多:多标签、多面板、自定义配色、字体渲染优化,还能同时打开 Ubuntu 和 Debian 两个不同发行版窗口。

在 Windows Terminal 里,你可以通过下拉菜单快速进入某个发行版,也可以通过命令直接指定启动:

wt -d "\\wsl$\Ubuntu\home\username\project"

这条命令会直接在 Windows Terminal 里打开 Ubuntu 并进入指定项目目录,配合终端别名可以做到“一键进入工作目录”。把 WSL2 作为开发环境后,我几乎很少再去点开单独的 Ubuntu 窗口,所有操作都收敛在 Windows Terminal 里,作业感很强。

如果你需要在一个终端窗口里同时看 Windows 命令和 Linux 命令的输出,可以用 Windows Terminal 的分屏功能,左边跑wsl,右边跑 PowerShell,对比日志或并行操作时非常方便。这个组合在调试前后端联调场景里特别好用。

5.2 跨系统文件访问与路径转换

WSL2 的文件系统和 Windows 文件系统是分开的,但可以通过特殊路径互相访问:

  • 在 Windows 的文件资源管理器地址栏里输入\\wsl$\Ubuntu,可以直接浏览 Linux 发行版内的文件;
  • 在 WSL2 终端里访问 Windows 文件,通过/mnt/c/Users/你的用户名/...路径。

实际开发中,我强烈建议代码和项目文件放在 Linux 文件系统里,也就是 WSL2 内部目录,比如~/projects、/home/username/projects这类路径。因为 WSL2 访问/mnt/c下的 Windows 文件时,会经过 9P 协议转换,性能损耗明显。如果你把一个大项目的node_modules放在 Windows 目录下,编译和启动速度会感人地慢。

同理,跨系统使用要注意路径转换。Linux 路径和 Windows 路径不能直接混用,比如在 Windows 的cmd里写C:\Users\name,到 WSL2 里要写成/mnt/c/Users/name。在脚本里需要互相转换时,可以用wslpath命令:

wslpath 'C:\Users\name\Desktop' wslpath -w '/home/name/project'

这一条是我见过大家刚上手时最常犯错的地方,也是“为什么我代码在 Windows 里能跑,在 WSL 里跑不了”问题的最大来源之一。

5.3 在 WSL2 里跑 Docker 和做 Web 开发

WSL2 和 Docker 的组合是我最满意的部分。如果你用的 Docker Desktop,可以在设置里把引擎切换到 WSL2 backend,然后让 Docker 运行在 Ubuntu 发行版内。这样你既可以在 WSL2 终端里直接敲docker ps、docker-compose up,又能让 Docker 的镜像和容器和 Windows 侧共享一套运行时。相比之前在 Windows 上跑 Docker Toolbox 的年代,这种体验已经是天壤之别。

不装 Docker Desktop,你也能在 WSL2 里手动安装 Docker Engine,配合 systemd 特性,体验几乎和原生 Linux 一致。很多人在 Windows 上开发微服务或容器化应用的方案就是:WSL2 里起数据库容器、中间件容器,Windows 上跑 IDE 和浏览器,前后端联调时全都互通。

Web 开发场景里,我常用的姿势是:在 WSL2 里启动后端服务(Node、Python、Go 等),前端也在 WSL2 里通过 Vite / Next.js 起开发服务器,然后 Windows 的浏览器直接访问localhost端口。因为 WSL2 默认开启了 localhost 转发,你不需要知道虚拟机的内网 IP,直接使用localhost即可。

偶尔会遇到一种情况:在 WSL2 里启动的服务,Windows 侧访问不到。这时先检查服务是否监听了0.0.0.0,再确认.wslconfig里的localhostForwarding没被设成false,最后用wsl --shutdown彻底重启一次 WSL,绝大多数问题都能解决。

5.4 用 WSL2 承载脚本定时任务和系统管理

除了开发,WSL2 在自动化脚本和系统管理方面也很有用。比如你可以在里面跑 cron 定时任务来做数据库备份、日志清理、爬虫定时抓取。WSL2 基于真正内核,crontab是完整可用的,不需要像 WSL1 那样依赖 Windows 计划任务来触发。

我实际用过的场景是:让 WSL2 里的 Python 脚本每天定时拉取外部数据,处理后生成报告,再通过 Windows 任务计划程序调用 WSL 命令完成跨系统协作。还可以在 WSL2 里安装ansible之类的工具,管理 Windows 之外的 Linux 服务器。相比在 Windows 上用 Git Bash 模拟出来的脚本环境,WSL2 的 shell 行为更贴近生产服务器,脚本在这边能跑,部署到云主机上基本不会有意外差异。

6. 常见故障与排查思路实录

6.1 报“WSL2 需要更新内核”或安装失败

这是最常见的启动报错之一,表现形式是打开发行版时提示 WSL2 kernel 版本过旧,需要更新。解决办法比较简单,执行:

wsl --update

如果更新还是失败,多半是网络问题。可以手动下载 WSL2 内核更新包并安装,或者在网络代理环境下让 Windows 的代理设置对 WSL 生效。因为 WSL 的网络流量走虚拟网卡,个别代理工具需要开启“允许局域网”或 TUN 模式,才能正常通信。

安装失败的另一个常见原因,是 Windows 功能未正确启用。用我前面提到的dism命令重新启用两个功能,重启后再次尝试安装。绝大多数安装报错都能在这两步内解决。

6.2 网络异常 / DNS 解析失败

WSL2 里能ping 114.114.114.114但apt update报域名解析失败,这基本就是 DNS 问题。可以临时修改/etc/resolv.conf里的 nameserver:

sudo nano /etc/resolv.conf

内容改成:

nameserver 8.8.8.8

但要注意,WSL2 重启后可能会重新生成这个文件。更稳妥的办法是编辑/etc/wsl.conf,添加以下内容:

[network] generateResolvConf = false

然后按照上面方式手动设置 DNS 文件。这个操作会禁用 WSL 自动生成 DNS 配置,从而保持你自定义的 nameserver 在重启后依然有效。

6.3 端口被占用 / localhost 访问不通

Windows 和 WSL2 共享 localhost 转发后,偶尔会出现端口冲突。比如 Windows 上已经有一个服务占了 8080,而你在 WSL2 里也想启动 8080 端口服务,端口转发就会异常。解决方式有两种:一是启动 WSL2 里的服务时换个端口;二是杀掉 Windows 上占用端口的进程。

排查过程先确定谁占用了端口。在 Windows PowerShell 里运行:

netstat -ano | findstr :8080

看到 PID 后,用taskkill /PID <PID> /F结束进程。如果 WSL2 这边有服务占用了端口,先停掉对应的进程或容器即可。

6.4 内存暴涨和磁盘空间不足

WSL2 的内存机制是按需使用,但它的缓存会占用一部分物理内存。如果感觉 Windows 整体变卡,多半是 WSL2 吃掉了不少内存。建议写一份.wslconfig限制上限,或者养成用完wsl --shutdown的习惯,彻底释放未使用的内存。

磁盘空间方面,WSL2 的虚拟磁盘文件是动态扩展的,删除文件后磁盘文件不会自动缩小,而是保持“已膨胀”的状态。可以用Optimize-VHD(Hyper-V 环境)或第三方磁盘压缩工具定期整理,也可以重建发行版来彻底瘦身。我在长期使用中发现,定期备份并重新导入发行版,是清理虚拟磁盘膨胀最有效且最稳妥的办法,前提是先把数据可靠备份好。

6.5 常见问题速查表

现象可能原因解决思路
安装后无法启动发行版Windows 功能未启用启用两个可选功能并重启
启动时提示内核过旧WSL2 内核未更新使用wsl --update更新
apt 下载慢或失败软件源在国外换国内镜像源
本地服务无法从 Windows 访问localhost 转发关闭或防火墙拦截检查.wslconfig和 Windows 防火墙
性能明显低于预期项目文件放在/mnt/c下将项目移到 Linux 文件系统中
关机后 WSL 仍在占用资源WSL 后台驻留使用wsl --shutdown彻底停止

7. 个人长期使用后的几点体会

WSL2 用到现在,我最深的感受是它已经不只是“Windows 上的一个 Linux 玩具”,而是可以支撑真实开发强度的环境。以前跑 CI 脚本、处理超大 Git 仓库、编原生模块,我都得切到一台单独的 Linux 机器上做,现在这些工作直接在 WSL2 里完成,配合 Windows 侧的 IDE 和浏览器,效率和体验都很均衡。

如果要说还有什么要特别留意的,我会反复强调两件事:一是项目文件尽量放在 Linux 文件系统内部,这个习惯直接决定了日常开发时编译、依赖安装和 Git 操作的流畅度;二是资源控制要主动管理,别让 WSL2 在后台无限吞噬内存,该限制就限制,该关机就关机。这两个点处理好了,WSL2 才能真正成为一个顺手又稳定的长期开发环境。

最后再分享一个小技巧:当你在 Windows 侧需要快速打开 WSL2 里某个目录,可以直接在文件资源管理器地址栏输入\\wsl$\Ubuntu\home\你的用户名,或者在 Windows Terminal 里敲code .,VS Code 会自动以远程模式连接 WSL2,并在发行版内打开当前目录,代码编辑、终端调试、文件树都一体化。很多人不知道这一步,实际上它就是 WSL2 开发体验的隐藏精华,强烈建议试一次。

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

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

立即咨询