☰
WSL2安装配置与调优:Windows上打造高效Linux开发环境
2026/10/17 8:09:46 网站建设 项目流程

最早我在 Windows 上折腾 Linux 开发环境的时候,路子很野:先装双系统,结果三天两头要重启切换,写代码的思路经常被打断;后来改用虚拟机,内存被吃得只剩可怜巴巴的几 G,虚拟机里的磁盘 IO 也慢得让人着急。直到 WSL2 出现,我才发现原来 Windows 上可以直接跑一个带完整 Linux 内核的环境,启动只要几秒,和文件管理器、编辑器的配合又几乎天衣无缝。这篇文章把我从零开始安装 WSL2、做完初始化、调好资源限制、再到踩坑恢复的全过程整理出来。适合想在 Windows 上获得 Linux 开发环境、又不想放弃 Windows 日常使用的人,特别是做后端、运维、嵌入式或者想入门 Linux 的同学。

1. 为什么要装 WSL2:从双系统、虚拟机到 Windows 直通 Linux 的取舍

1.1 三种方案的真实使用感受

很多人一提到在 Windows 上跑 Linux,第一反应就是双系统或者 VMware、VirtualBox 这些虚拟机。老实说,这两条路我都走过,也都有各自的好处,但用久了你就知道问题出在哪。

双系统最大的痛点不是安装,而是切换。你正在 Windows 上写着文档,突然要跑一段 Linux 环境下的脚本,就得重启,等系统加载,再进入另一个系统,搞完又得重启回来。一天来几次,整个人都会变得暴躁。而且双系统对磁盘分区是有要求的,需要在安装时就给 Linux 预留空间,后期想调整分区大小非常麻烦,稍有不慎就可能导致数据盘识别不了。

传统虚拟机的好处是隔离彻底、可以随便折腾,拍个快照再乱搞都行。但代价也很明显:虚拟机要分配固定内存和 CPU,你总得在 Windows 和虚拟机之间做个权衡;虚拟磁盘的 IO 性能比起原生环境差一截,跑数据库、编译大项目的时候特别明显;另外很多虚拟机软件是收费的,免费版本也有功能限制。更麻烦的是,虚拟机和 Windows 之间的文件交互、剪贴板共享、端口访问,虽然也能配置,但总会觉得隔着一层。

WSL2 的体验完全不同。它本质上是微软在 Windows 里内置的一个轻量虚拟机,但做了深度集成:启动一个发行版只需要几秒,不用完整开机;内存、CPU 可以按需使用,不启动就完全不占资源;Windows 和 Linux 两边可以互相访问文件,也能直接调用对方的命令工具。它不追求虚拟机那种完全隔离,而是追求开发时的顺畅和融合。对于绝大多数开发者来说,这套“Windows 日常 + Linux 干活”的组合,比双系统和传统虚拟机舒服得多。

1.2 WSL2 与 WSL1 的本质差异

网上关于 WSL 的资料很多,但很多人搞不清 WSL1 和 WSL2 到底有什么区别,甚至以为只是版本升级。实际上两者的底层实现完全不同。

WSL1 是一个系统调用翻译层,它把 Linux 程序发出的系统调用转换成 Windows 内核可以理解的调用。好处是启动快、资源占用低,因为是直接跑在 Windows 上,不需要虚拟化。但坏处也很明显:靠翻译不可能覆盖所有系统调用,有些涉及内核特性、文件系统权限、网络栈的高级功能就支持不了。最典型的就是 Docker 在 WSL1 里很难跑起来,还有像 FUSE、网络命名空间这类依赖内核模块的东西,基本无能为力。

WSL2 则直接换了一条思路:把真正的 Linux 内核放进一个轻量虚拟机里运行。这个内核是微软维护的定制版,和标准 Linux 内核高度兼容,所以能跑完整的 Docker、nftables、systemd 这些服务。启动速度依然很快,兼容性却比 WSL1 上了一个大台阶。

用表格可以更直白地看出两者差异:

对比维度WSL1WSL2
底层实现系统调用翻译层轻量虚拟机 + 完整 Linux 内核
内核兼容性有限,依赖翻译完整,可运行 Docker、systemd 等
是否需要虚拟化不需要需要 CPU 虚拟化支持
Linux 侧文件 IO跨文件系统性能尚可Linux 内部文件 IO 更接近原生
Windows 与 Linux 跨文件访问较快相对较慢
支持的发行版常见发行版常见发行版,且支持更全面

我现在所有的新开发环境都默认用 WSL2,只有在极少数老机器不支持虚拟化时才考虑 WSL1。如果你是刚接触,直接奔着 WSL2 去就对了。

2. 安装前的三个前提条件与版本选择

2.1 系统版本、虚拟化与内存底线

安装 WSL2 之前,先花三分钟确认环境,省得后面折腾半天才发现是硬件不支持。

第一,Windows 版本有硬性要求。WSL2 最早是在 Windows 10 版本 2004(内部版本号 19041)之后才正式支持,所以如果你的电脑还在用老得掉牙的 Windows 10 版本,最好先把系统更新到位。Windows 11 就更不用说了,WSL2 是完整的默认组件,体验也最顺畅。怎么查版本?按 Win + R 输入 winver 回车,弹出来的窗口里能看到具体版本号。

第二,CPU 虚拟化必须开启。WSL2 的底层是轻量虚拟机,依赖 Hyper-V 体系,而 Hyper-V 又依赖 CPU 的虚拟化指令集。绝大多数现代 CPU 都支持,但有些电脑在 BIOS 里默认关掉了。怎么确认?打开任务管理器,切到“性能”标签页,选中 CPU,看右下角是否有“虚拟化:已启用”。如果显示未启用,需要重启进 BIOS 设置,找到类似 Intel VT-x / AMD SVM 的选项打开。不同品牌主板的 BIOS 菜单位置不一样,实在找不到就搜索一下自己主板的型号。

第三,内存建议 8GB 起步,16GB 会更从容。WSL2 默认可以占用的内存在某些配置下相当大,虽然我们可以通过配置文件手动限制(后面第 6 章细讲),但如果你只有 4GB 内存,跑一个 WSL2 再加上 Windows 本身,会很紧张。我个人建议把 WSL2 当作一个“永远挂着的开发环境”来用,内存给足 4-6GB 是合理负担。

2.2 x64 与 ARM64 的差异,以及 Windows 10/11 的选择

很多人没注意,WSL2 在 x64 和 ARM64 两种架构下的表现是有差异的。x64 电脑上 WSL2 体验最稳定,各种发行版、Docker、GUI 应用都能跑;ARM64 上 WSL2 也支持,但部分发行版的 ARM 版本镜像可能不如 x64 版本完善,偶尔会遇到软件源里某些包没有 ARM 架构的情况。

Windows 10 和 Windows 11 的选择上,我更倾向于推荐 Windows 11,主要不是因为它新,而是因为 WSL2 的集成度更好。Windows 11 里wsl --install一条命令就能把 WSL 和默认发行版装好,还会自动处理内核更新;Windows 10 上则要手动启用功能、手动下载内核更新包,步骤多不少。另外 Windows 11 对 WSLg(图形界面支持)、systemd、GPU 加速的支持都更成熟。如果你还在 Windows 10 上观望,而且电脑配置允许升级,建议早点升到 Windows 11。

3. 完整安装流程:从启用功能到跑起 Ubuntu 的命令全记录

3.1 两个 Windows 功能开关:名字看着像,作用完全不同

安装 WSL2 的第一步,不是去下载 Ubuntu,而是先把 Windows 的两个功能模块打开。这两步需要管理员权限,很多教程会混着写,我拆开讲,因为它们管的不是一回事。

第一个是“适用于 Linux 的 Windows 子系统”(WSL 功能),这是 WSL1 和 WSL2 共同的基础;第二个是“虚拟机平台”(Virtual Machine Platform),这是 WSL2 专用的,因为 WSL2 需要跑轻量虚拟机。如果你只开第一个,装完的发行版只能用 WSL1,跑不了 Docker,也享受不到完整内核。

操作方式有两种。一种是在“启用或关闭 Windows 功能”界面里勾选,但可能找半天;我更推荐直接用管理员 PowerShell 敲命令。右键点击开始菜单,选择“Windows PowerShell (管理员)”或者“终端 (管理员)”,然后执行:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

执行完通常会提示你重启。别犹豫,重启是必须的,不重启功能不会真正生效。这一步是很多人第一次安装失败的原因:命令执行完直接去装发行版,结果启动时报错,提示找不到虚拟化支持。

3.2 安装 Ubuntu:应用商店、命令行、离线包三条路径

功能开启并重启之后,就可以安装 Linux 发行版了。最常见的发行版是 Ubuntu,它的 LTS 版本稳定性好、软件源丰富、遇到问题搜索资料也容易,新手首选。

第一条路径是去系统自带的应用商店搜 Ubuntu。搜索的时候会看到 Ubuntu 22.04.3 LTS、Ubuntu 20.04.5 LTS 等多个版本,推荐选带 LTS 字样的,维护周期长。点安装就行,不需要多余操作。

第二条路径是命令行安装。在 Windows 11 或已经装好新版 WSL 的 Windows 10 上,管理员/普通 PowerShell 都可以执行:

wsl --install -d Ubuntu-22.04

这会把对应发行版下载并注册到 WSL 里,速度取决于你的网络。

第三条路径是离线安装包。有些公司的电脑出于安全策略限制了应用商店的访问,或者网络环境特殊,就需要先下载一个 .appx 格式的发行版安装包,然后放到本机,用 PowerShell 执行:

Add-AppxPackage .\Ubuntu_2204.1.7.0_x64.appx

装完之后,Ubuntu 应用会出现在开始菜单里。首次运行会弹出一个控制台窗口,显示正在安装,等它跑完,就会提示你设置 Linux 用户信息和密码,这部分内容我在第 4 章细讲。

3.3 切换到 WSL2 并验证:wsl -l -v 看状态

发行版装好后,你有可能还是 WSL1 的状态。WSL 的默认版本取决于系统设置,有些老版本默认是 1。所以我们要做两件事:把默认版本设为 2,同时验证现有发行版的版本。

在 PowerShell 里执行:

wsl --set-default-version 2

如果系统提示需要更新 WSL 内核,按提示下载并安装对应更新包,装完再执行一遍。然后执行:

wsl -l -v

你会看到类似这样的输出:

NAME STATE VERSION * Ubuntu-22.04 Running 2

VERSION 那一列是 2,就说明已经跑在 WSL2 上了。如果还是 1,可以用下面的命令把指定发行版转换到 2:

wsl --set-version Ubuntu-22.04 2

转换时间取决于文件系统大小,几分钟到十几分钟都有可能,期间不要关机或者强制关闭终端。转换完成后建议重新启动一次 WSL(wsl --shutdown再重新进入),让内核状态干净一点。

4. 首次进入系统的初始化配置:用户、软件源与必备工具

4.1 首次启动的用户创建与后续默认用户修复

首次启动 Ubuntu,终端会显示类似 “Installing, this may take a few minutes...” 的等待界面,然后进入创建用户的交互流程。它会要求输入一个 Linux 用户名和密码,注意密码输入时屏幕上不会显示任何字符,这是 Linux 终端的正常现象,不是坏了。

这里有两个容易被忽略的点。

第一个是默认用户的选择问题。如果你在创建时随便输了个用户名,用了一段时间后发现某些操作需要 root 权限很麻烦,或者你想让某个用户成为默认登录用户,不用重装系统,直接改 WSL 的配置文件。在 Linux 终端里编辑/etc/wsl.conf:

sudo nano /etc/wsl.conf

写入:

[user] default=你的用户名

保存后回到 Windows 执行wsl --shutdown,再重新进入,默认用户就变了。

第二个是忘记密码怎么办。很多新手会忘记自己设的 Linux 密码,其实不用慌。回到 Windows PowerShell,用 root 身份进入发行版:

wsl -d Ubuntu-22.04 -u root

然后直接重置密码:

passwd 你的用户名

重置完退出重进即可。这个小技巧我每次给人排错时都会用到,值得记一下。

4.2 软件源与系统更新:别急着刷 apt upgrade

新装的 Ubuntu 什么都不缺,就是默认官方软件源在国内网络环境下速度不太稳定。我建议先做一次软件源替换,再进行系统更新。

不同 Ubuntu 版本的软件源配置文件位置不一样。Ubuntu 22.04 及以后版本用的是一个叫ubuntu.sources的文件,路径在/etc/apt/sources.list.d/;旧版本则是在/etc/apt/sources.list。操作之前先备份:

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

然后把文件里的官方源地址替换成你所在网络环境下速度合适的镜像地址,具体域名我建议你根据自己所在地区搜索“Ubuntu 软件源镜像”进行选择。替换完成后执行:

sudo apt update sudo apt upgrade -y

这里有一个坑:很多人以为在 WSL2 里执行apt upgrade会更新 Linux 内核,其实不会。WSL2 的内核是随 Windows 侧由微软维护更新的,你在发行版里看不到常规的/boot内核管理流程,也千万不要尝试自己去装什么内核包,很容易把环境搞乱。apt upgrade只更新用户态软件包,内核更新请关注 Windows Update 里 WSL 相关组件的更新。

4.3 常用开发包与终端体验:Zsh + Windows Terminal

系统更新完之后,顺手把开发必需的几个包装上,免得后面用到的时候临时找:

sudo apt install -y build-essential git curl wget net-tools unzip

build-essential包含 gcc、g++、make 等编译工具,很多源码安装场景都依赖它;git、curl、wget就不用解释了;net-tools提供 ifconfig、netstat 这些传统命令,排查网络时经常用到。

然后是终端环境。WSL2 默认会打开一个基于控制台的窗口,但说实话,传统 Windows 控制台窗口在标签、复制粘贴、主题这些体验上都比较一般。我的建议是安装 Windows Terminal,它不仅能多开标签页,还能把多个 Linux 发行版、PowerShell、CMD 都收到同一个窗口里管理。

Windows Terminal 装好后,进入设置,把默认配置文件改成 Ubuntu,再把启动选项里的启动目录设置成\\wsl$\Ubuntu-22.04\home\你的用户名,这样一打开终端就是干净的 Linux 环境,不会再落到 Windows 路径下。

如果喜欢折腾命令行外观,可以在 WSL2 里再装一个 Zsh 和 Oh My Zsh,终端补全、主题、历史记录这些体验都会提升不少。不过这个不是必须的,按个人口味来。

5. Windows 与 Linux 的文件互通:路径规则、编辑器联动与命令互调

5.1 两边路径互访:\wsl$ 与 /mnt/c 的规则

WSL2 最吸引人的一点,就是 Windows 和 Linux 两边可以互看文件,不需要像虚拟机那样用共享文件夹来配置。从 Windows 访问 Linux 文件系统非常简单:打开资源管理器,在地址栏输入\\wsl$\Ubuntu-22.04\home\你的用户名,就能直接看到 Linux 目录下的文件。我经常这样把编译好的二进制文件直接拖到 Windows 桌面。

反过来,在 Linux 里访问 Windows 的磁盘也很直接,例如:

cd /mnt/c ls

这里/mnt/c对应的是 Windows 的 C 盘,/mnt/d对应 D 盘。在 WSL2 里也可以用一条命令直接把当前目录在 Windows 资源管理器中打开:

explorer.exe .

这个命令会先转换为 Windows 路径,再调起资源管理器窗口。注意它是前台调用,终端会卡住一会儿,是正常现象,关掉资源管理器窗口即可释放。

这里要特别强调一个性能问题:WSL2 和 Windows 之间跨文件系统访问,比 WSL1 要慢不少。尤其是大量小文件的读写场景,比如在/mnt/c下的项目里跑 npm install 或者 pip install,编译进程会频繁跨文件系统,速度慢到你可能怀疑人生。正确做法是把项目代码放到 Linux 文件系统内部,比如/home/你的用户名/projects/,然后在 Windows 侧通过\\wsl$路径访问它。需要改动的代码、配置、构建脚本都放在 Linux 侧,Windows 只负责浏览和编辑。

5.2 PowerShell 里直接跑 Linux 命令:wsl.exe 的玩法

WSL2 不仅能从 Linux 里调用 Windows 命令,反过来也可以。在 Windows 的 PowerShell 或 CMD 里,直接执行wsl加上想运行的命令,就能临时调用 Linux 环境。比如:

wsl ls -la /home wsl whoami

这非常适合在 Windows 脚本里穿插使用 Linux 工具链,比如用 grep、awk、sort 处理文本,或者跑一段 Linux 下的测试命令。如果装了多个发行版,可以指定目标发行版:

wsl -d Ubuntu-22.04 php -v

还有一个非常有用的命令wslpath,它负责 Windows 路径和 Linux 路径的互转。比如在 Linux 终端里获取当前目录对应的 Windows 路径:

wslpath -w $(pwd)

也可以把 Windows 路径转成 Linux 路径:

wslpath 'C:\Users\Public\Desktop'

在写脚本、处理配置文件路径时,这个工具能省下大量来回拼接路径的功夫。

5.3 VSCode Remote-WSL:不用配置映射的开发环境

如果你日常用 Visual Studio Code 写代码,那 WSL2 和它的配合可以说是天作之合。只要在 Windows 端的 VSCode 里安装 Remote - WSL 扩展,然后在 WSL2 终端里进入项目目录,执行:

code .

会自动启动一个新的 VSCode 窗口,并且这个窗口是直接连接进 WSL2 环境里的,终端、调试器、路径解析全部指向 Linux 侧。你在 VSCode 里打开文件、跑调试任务,操作的是 Linux 文件系统中的真实文件,和本地 Windows 开发几乎没有区别。

第一次执行code .的时候,VSCode 会在 Linux 侧自动安装一个服务端组件,需要等一两分钟,之后就会很快。这个方案比我以前用 SFTP 同步代码、在 Windows 上编辑再上传的方式强太多了,既保证了代码运行环境是纯正的 Linux,又兼顾了 Windows 上丰富的编辑器体验。

6. 资源占用不失控:内存、CPU 与磁盘空间的调优方案

6.1 .wslconfig 文件:内存、CPU 与交换分区的总闸

WSL2 默认的资源占用策略比较“豪放”:内存和 CPU 都可能在系统负载高时占用很大比例,尤其是内存,WSL2 会把未使用的内存当缓存吃掉,看起来像是内存一直被占满。很多刚接触 WSL2 的人看到任务管理器里内存占用很高,第一反应是“是不是中毒了”,实际上不是,而是 WSL2 的缓存机制在起作用。

想要让资源占用可控,就在 Windows 用户目录下建一个名为.wslconfig的配置文件。路径固定是C:\Users\你的账号\.wslconfig,如果文件不存在就手动新建。文件内容示例:

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

memory限制 WSL2 最大可用内存,单位 GB;processors限制逻辑 CPU 核数;swap是交换分区大小,如果内存不够时有大量编译任务,可以留一点;localhostForwarding保持默认开启即可,它负责让 Windows 通过 localhost 直接访问 WSL2 里监听的端口。

配置改完之后,需要执行wsl --shutdown再重新进入发行版才会生效。有一点要注意:如果给 WSL2 的内存限制设得太小,而你的程序又需要大内存,系统不会自动弹到 Windows 侧,而是会触发 Linux 的 OOM Killer 把最占内存的进程杀掉。遇到“进程突然消失”的情况,先检查一下是不是内存限制导致的。

6.2 vhdx 磁盘只涨不缩的清理方法

WSL2 的 Linux 文件系统存储在一个叫ext4.vhdx的虚拟磁盘文件里,位置在你用来安装发行版的那个包的 LocalState 目录下,一般默认在 C 盘。这个文件的特点是“只涨不缩”:你在 Linux 里删除文件后,虚拟磁盘占用的宿主机空间不会自动释放回来。时间一长,就算 Linux 内部没多少数据,C 盘空间也可能会被这个文件吃掉几十 GB。

清理方法不复杂,但要按顺序来,否则会提示磁盘被占用。先在 Windows 里彻底关闭 WSL:

wsl --shutdown

然后打开管理员命令行,启动 diskpart 工具:

diskpart

在 diskpart 交互界面里,选择 vhdx 文件,执行压缩操作:

select vdisk file="C:\Users\你的账号\AppData\Local\Packages\你的发行版包名\LocalState\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit

attach vdisk readonly表示以只读方式挂载虚拟磁盘,compact vdisk就是压缩操作的命令。等它跑完后,返回 Windows 资源管理器看 vhdx 文件大小,通常能明显瘦身。注意,整个操作期间必须保证 WSL 处于完全关闭状态,否则 diskpart 会报“虚拟磁盘正在使用中”的错误。

如果你嫌用 diskpart 麻烦,还有一个笨办法:把发行版导出再导入,导入之后重新生成的 vhdx 就是全新大小。这个方法顺带还能迁移位置,我放到第 7 章讲。

6.3 关掉 WSL 与开机自启的取舍

WSL2 属于“按需启动”的机制,Windows 开机后它不会自动运行,只有你第一次执行wsl相关命令或者打开发行版时,它才会起来。这也就意味着,日常不用的时间里,WSL2 不会占任何资源。

但有时候你会发现程序明明没在跑,内存却被 WSL2 占着,多半是因为某些后台进程还在运行,比如启动过 Docker Desktop、开过 VSCode 的 Remote-WSL 窗口,或者某个服务常驻了。直接执行下面这条命令,可以关掉所有正在运行的 WSL 环境,彻底释放内存和 CPU:

wsl --shutdown

关掉之后,下次进入发行版又是一次快速启动,不影响你的系统和文件,所以不用舍不得关。我个人的习惯是:晚上下班或长时间离开电脑时,顺手执行一次wsl --shutdown,让系统回到干净状态。如果你只想让特定的发行版关闭,而不是全部关闭,可以先执行wsl -l -v查看状态,再在发行版内执行sudo shutdown -h now或者exit,但部分后台进程可能不会随之退出,这时候wsl --shutdown才是最彻底的。

7. 我踩过的 WSL2 坑:网络、目录挂载与导出迁移的排查记录

7.1 localhost 转发与局域网端口暴露的配置

WSL2 的网络模式是 NAT 式的轻量虚拟机,所以虚拟机内部和 Windows 之间有一个地址转换的关系。默认情况下,Windows 访问 WSL2 里监听的端口,可以直接用localhost。比如你在 WSL2 里启动了一个 8080 端口的 Web 服务,直接在 Windows 浏览器里打开http://localhost:8080就能访问,不需要额外配置,这是localhostForwarding=true的作用。

但如果是局域网里的其他设备想访问 WSL2 里的服务,比如同一公司内网的同事要访问你这台机器上的服务,光在 WSL2 里监听是不够的,因为 WSL2 的 IP 是 NAT 分配的,局域网设备访问不到。这时候要做端口转发和防火墙放行。

在管理员 PowerShell 里,先获取 WSL2 当前的 IP:

wsl hostname -I

假设拿到的是172.20.10.5,然后执行端口转发,把 Windows 的 8080 端口转发到 WSL2 的 8080 端口:

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=172.20.10.5

再放行防火墙:

netsh advfirewall firewall add rule name="WSLPort8080" dir=in action=allow protocol=TCP localport=8080

这里必须提醒一个坑:WSL2 每次重启后 IP 都可能变化,是一条动态地址,所以上面的命令在 WSL 重启后可能失效。解决思路是写一个 PowerShell 脚本,启动时自动获取 WSL IP,然后刷新上面的 portproxy 规则,或者干脆不依赖动态 IP,用localhost只做本机访问。

7.2 网络卡顿、DNS 异常与安全软件冲突的排查

WSL2 稳定用下来,网络问题是我遇到最多的,常见的有两类:一类是 WSL2 内部 ping 不通外网或者解析不了域名,另一类是 WSL2 和 Windows 之间的连接经常卡顿。

先说 DNS 问题。WSL2 的网络是 NAT 架构,Linux 内的 DNS 配置是从虚拟网卡自动获取的,正常情况下/etc/resolv.conf会指向一个虚拟网关地址。如果出现域名解析失败,第一步先检查这个文件内容是否正常:

cat /etc/resolv.conf

如果发现配置异常或者里面指向了一个不可用的地址,可以先执行sudo nano /etc/resolv.conf手动临时指定一个公共 DNS,例如填写运行商提供的 DNS 或公共 DNS 地址,保存后重新解析测试。但要注意,WSL2 重启后这个文件可能会被重新生成,所以临时改动只能应急。更稳妥的办法是先wsl --shutdown再重新进入,让系统重新分配网关和 DNS。

另一类卡顿问题,往往和安全软件或系统优化类工具有关。这类软件有时候会插手虚拟网络适配器的链路,结果就是 WSL2 里的数据包走到半路被拦下来,表现出来就是一段时间能上网,过一会儿又全断,重启 WSL 后暂时恢复,过一阵又出现。排查思路是:先wsl --shutdown,停用这类软件,再测试网络是否恢复;如果恢复,就在软件设置里把 WSL 相关的虚拟网卡加入白名单,而不是关掉系统保护。这个定位顺序比较可靠,我试过好几次都是这样解决的。

7.3 导出迁移:C盘空间告急时的完整搬家流程

vhdx 位于 C 盘,时间久了 C 盘空间告急,最有效的处理方式是给发行版换一个存储位置。WSL 本身提供了导出和导入命令,操作相当简单。

先关闭所有 WSL 环境:

wsl --shutdown

然后把整个发行版导出一份 tar 包:

wsl --export Ubuntu-22.04 D:\backup\ubuntu.tar

导出完成后,如果要彻底把原发行版从 C 盘移除,执行:

wsl --unregister Ubuntu-22.04

注意这一步会把该发行版内部的所有数据从 WSL 注册表里删除,所以一定要在导出成功之后再操作。接着重新导入到新位置:

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

第一个路径是导入后发行版的根目录位置,第二个路径是刚才导出的 tar 包路径。导入完成后,你会发现一个“不太舒服”的问题:默认用户变成了 root,之前创建的那个普通用户不在默认登录列表里。解决办法还是修改/etc/wsl.conf,写上[user] default=你的用户名,然后重启 WSL。顺带说一下,导出的 tar 包比 vhdx 文件小得多,因为导出的过程压缩了文件系统内容,但不包括空闲空间。我建议重要数据至少每月手动备份一次,把某个稳定状态的发行版导出成一个 tar 包,放在非系统盘保存。

8. 把 WSL2 变成日常主力环境:Docker、多个发行版与终端配置

8.1 WSL 里跑 Docker:两条路线怎么选

很多开发者的 WSL2 里有八成原因是冲着 Docker 去的。在 WSL2 里跑 Docker 有两条路线,我两个都用过,各说利弊。

第一条是安装带有 WSL 集成功能的桌面版 Docker 工具。装好之后,在设置里找到 WSL Integration 相关的选项,把 Ubuntu 发行版勾选上,那么在 WSL2 终端里直接就能用docker命令,容器跑在 WSL2 的 Linux 环境里,和 Docker Desktop 的界面联动,看日志、管理镜像都比较方便。缺点是它同时会启动一个 Windows 侧的后台服务,内存占用偏高,对于只想偶尔用命令行的轻量用户来说有点重。

第二条是只在 WSL2 内部安装 Docker 引擎,不装桌面版。具体步骤是:

sudo apt install -y docker.io docker-compose-v2 sudo systemctl enable --now docker

前提是 WSL2 开启了 systemd 支持,否则systemctl用不了。然后就能直接拉镜像、跑容器了。这个方案的优点是轻量、不依赖 Windows 侧服务,适合已经习惯了命令行操作的人;缺点是没有图形界面,镜像、容器的管理都要自己敲命令。

我的建议是:日常主要是做 Web、后端开发,建议走第一条路线,省心;如果你想彻底当一个 Linux 用户,或者想在公司受限环境下尽量少装软件,走第二条路线更干净。

8.2 同时装多个发行版与管理命令

WSL 并不限制只能装一个发行版,你完全可以同时装 Ubuntu、Debian、Kali 等多个环境,通过wsl -l -v查看当前已安装的列表,用wsl -d 发行版名指定进入某个环境。

查看当前可用发行版列表:

wsl --list --online

安装一个新的发行版:

wsl --install -d Debian

把某个发行版设置成默认打开:

wsl --set-default Debian

多发行版最实用的场景是“环境隔离”:比如一个发行版专门做通用开发,一个发行版专门跑数据库集群,一个发行版用来测试不同发行版的兼容性。它们之间互不影响,但注意它们共用同一个 .wslconfig 资源配置,内存限制是所有发行版共享的。

8.3 Windows Terminal 的日常效率配置

最后聊聊终端体验。Windows Terminal 在我这里已经成了打开 WSL2 的主要入口,我把日常使用的几个配置点整理出来。

第一个是默认启动配置。在 Windows Terminal 的设置里,把默认配置文件改成 Ubuntu,这样每次打开终端直接进入 Linux 环境,不用再手动切换。

第二个是选项卡和快捷键。Windows Terminal 支持 Ctrl + Shift + T 新建标签页,Ctrl + 数字键快速切换,还可以设置一个全局快捷键呼出下拉式终端。我习惯用这个方式“随时拉出一个 Linux 环境”来执行命令,比来回切窗口顺手很多。

第三个是字体和主题。做开发的话,配一个等宽字体,把行距微调一下,长时间盯着屏幕不容易累。Windows Terminal 还支持自定义配色方案,把终端背景调成深色,能让代码高亮的对比度更舒服。

这些配置都能在 Windows Terminal 的图形化设置界面里完成,不需要写 JSON 配置文件。等你把终端、VSCode、Docker 都跑顺之后,WSL2 就不再是一个“实验性功能”,而是一个能天天依赖的主力开发环境了。

说实话,我做项目时的习惯是把数据库、编译环境、脚本工具链都放进 WSL2,Windows 这边只留日常办公和通讯软件,数据通过\\wsl$和 VSCode Remote 自然衔接。用了这么久,整体体验就是两个字:省心。如果你看完这篇也想试试,就按顺序从安装开始走一遍,前几个命令敲完跑起一个 Ubuntu,很多之前纠结的问题都会迎刃而解。

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

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

立即咨询