WSL完全指南:从安装到实战,在Windows上高效运行Linux开发环境
2026/9/18 7:29:49 网站建设 项目流程

1. 从一次真实的安装经历说起

前几天同事跑来问我,说他在Windows上装一个开发工具死活装不上去,安装程序直接弹出一句"此应用程序需要适用于Linux的Windows子系统可选组件。通过运行wsl.exe --install...",然后就没有然后了。他一头雾水,问我WSL到底是个什么东西,为什么装个工具还要先装Linux子系统。

这个问题其实特别典型。最近两年,越来越多的开发工具在Windows上的安装方式都默认走WSL这条路。WSL全称是Windows Subsystem for Linux,翻译过来就是Windows的Linux子系统。说白了,它让你不用装虚拟机、不用装双系统,就能直接在Windows里跑一个真正的Linux环境。这个环境不是模拟出来的,而是实实在在的Linux内核和Linux用户态,只是它跑在Windows的底层调度之上而已。

这篇文章我打算把从零开始装WSL、配置WSL、到日常使用中那些容易踩的坑,一条龙讲清楚。不管你是刚接触WSL的小白,还是已经用了很久但老遇到莫名其妙问题的老手,这篇文章里应该都有你用得上的东西。

2. 核心思路:为什么要在Windows里装Linux子系统

2.1 WSL到底解决了什么问题

先聊聊最根本的问题:为什么我们需要在Windows上跑Linux。

原因其实很现实。程序员日常开发的很多工具链,天然就是为Linux设计的。比如Docker容器,比如Redis、Elasticsearch这类基础设施,又比如一些需要编译C/C++扩展的Python包,在Windows上要么装起来各种别扭,要么跑起来性能不对劲,要么压根没有官方Windows版本。以前遇到这种情况,主流方案有三条路:装双系统、开虚拟机、或者弄一台远程Linux服务器。

双系统的问题是切换麻烦,重启一次才能换个系统,日常操作太割裂。虚拟机的问题在于资源开销大,跑一个完整的Linux桌面或者带GUI的虚拟机,内存和CPU占用都很心疼,而且文件在Windows和Linux之间互相传还得靠共享文件夹,体验一般。远程服务器则受限于网络条件和资费,不是随时随地都方便。

WSL的解决思路很巧妙。它没有去搞一个完整的虚拟机,而是直接用Windows的内核机制去跑一个真的Linux内核。你在WSL里执行的bash命令、跑的Python脚本、起的Redis服务,都是直接在Linux内核里运行的,完完全全就是Linux,不是某个模拟器。这就意味着大部分Linux软件可以在WSL里无修改直接跑。而它的资源开销比虚拟机小得多,启动也快,基本是秒开。

2.2 WSL 1与WSL 2的选型差别

现在WSL有两个大版本,WSL 1和WSL 2,很多人搞不清楚该用哪个。这里我直接给结论:新装机直接用WSL 2,除非你确实遇到WSL 2无法满足的特殊场景,才考虑切换回WSL 1。

这两者的架构差异挺大的。WSL 1是一个系统调用翻译层,把Linux的系统调用翻译成Windows的系统调用。好处是启动快、文件访问走Windows文件系统时性能好,坏处是有些Linux底层的功能支持不全,比如Docker就几乎没法直接在WSL 1里跑,因为Docker依赖的很多内核特性WSL 1束手无策。

WSL 2则是用一个轻量级虚拟机技术跑了一个完整的Linux内核,兼容性大幅提升。Docker Desktop、完整的systemd、各种需要内核模块的软件,在WSL 2里都能正常工作。代价是它本质上是个虚拟机,所以将来如果有人做内核实验、改内核参数、跑需要特定模块的程序,操作空间比WSL 1大得多。也正因为WSL 2跑的是真正的Linux内核,不少人在里面研究Linux内存管理子系统、文件系统、进程调度这些底层话题,直接在WSL 2里看源码、写内核模块都是可行的。

从我的实际体验来说,绝大部分常规开发场景WSL 2都够用。唯一要注意的是,WSL 2里访问Windows端文件(就是/mnt/c/这种路径)的性能比WSL 1差一些,原因在于文件跨了虚拟化边界。所以一个很重要的使用习惯是:代码和项目文件尽量放在Linux子系统内部,不要放在/mnt/c下来回折腾。

2.3 什么时候适合用WSL、什么时候不适合

WSL能做的事情很多,但也不是万能的。我根据自己的日常使用,整理了一张适用场景对照表:

场景是否适合WSL说明
跑Linux命令行工具非常适合git、ssh、grep、awk、脚本,完美替代Git Bash
跑数据库/中间件非常适合Redis、MySQL、Elasticsearch等,Linux版安装方便
跑Docker容器非常适合(WSL 2)Docker Desktop直接基于WSL 2运行
跑Python/Node.js开发非常适合避免Windows下各种编译器和路径坑
跑需要图形界面的Linux软件一般WSLg支持部分GUI,但复杂图形性能有限
跑Windows原生软件不适合这是Windows自己的事,别折腾子系统
需要高性能GPU计算一般CUDA等可以配置,但不如原生Linux直接

当时我那个同事碰到的问题,根源就在这里。他要装的工具官方只提供Linux安装包,Windows版只是套了个壳,壳里面强制要求WSL环境存在。所以不把WSL装好,这类工具在Windows上根本跑不起来。

3. 安装前的准备:检查你的环境

3.1 系统版本要求与虚拟化检查

在动手安装之前,最好先确认一下你的Windows系统支持WSL,免得装到一半报错又得回头查。

WSL 2要求Windows 10版本2004及以上,或者Windows 11任意版本。Windows 10的老版本系统,比如LTSC 2019或者更早的,要么不支持WSL 2,要么需要特殊处理。如果系统太老,建议能升级就升级,实在不能升级就只能考虑WSL 1了。

另外一个关键是CPU虚拟化功能。WSL 2依赖虚拟化技术,所以必须确保BIOS里开启了虚拟化。怎么确认?打开任务管理器,切到"性能"选项卡,看CPU信息里的"虚拟化"这一项。如果显示"已启用"就万事大吉;如果显示"已禁用",就得进BIOS找Intel VT-x或者AMD SVM选项,把它打开。这一步不少人会忽略,如果虚拟化没开,装好的WSL 2启动时会直接报错,说什么"请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用了虚拟化"。

检查Windows版本的方式也很简单,按Win+R,输入winver,回车,弹出的对话框里就能看到版本号。顺便看一眼系统类型是64位还是32位,WSL只支持64位系统,32位的还是趁早放弃。

3.2 确认必要的Windows功能是否开启

WSL安装过程中,有几个Windows功能需要提前打开,包括"适用于Linux的Windows子系统"和"虚拟机平台"。在较新的Windows版本里,执行wsl --install命令会自动开启这些功能,但老版本或者某些精简版系统,可能会漏掉。

手动开启的方式是:控制面板 → 程序 → 启用或关闭Windows功能,然后在列表里找到"适用于Linux的Windows子系统"和"虚拟机平台"两个选项,勾选上,点确定,重启系统。

顺便说一句,如果之前装过WSL但没成功,或者卸载过,建议先检查一下这两个功能。我遇到过几次,功能没开全,后面怎么装都报错。确保这两个勾选框都处于勾选状态,能省去很多麻烦。

3.3 命令行工具的基础准备

WSL的安装和管理主要靠wsl.exe这个命令行工具。在Windows 10 2004之后,wsl.exe已经内置在系统里了,不需要额外安装。你可以打开PowerShell或者Windows Terminal,直接输入wsl --version看看能不能正常输出。如果能显示版本信息,说明wsl.exe一切正常;如果提示找不到命令,那就说明系统版本太老,得先升级。

好一点的实践是尽量用Windows Terminal来操作WSL,而不是老的cmd。Windows Terminal对WSL的支持更友好,标签页、UTF-8编码、复制粘贴,都舒服得多。这个工具在Windows 11上自带了,Windows 10可以去Microsoft Store搜Windows Terminal,免费安装。

4. 两种安装路径:快速安装与传统安装

4.1 最快捷的方式:一条命令搞定

如果你用的是Windows 10 2004或者Windows 11,安装WSL现代而标准的做法就一条命令。打开PowerShell或Windows Terminal,以管理员身份运行,输入:

wsl --install

这条命令会自动完成所有事情:启用需要的Windows功能、下载并安装WSL 2内核、安装默认的Linux发行版(多数情况下是Ubuntu)。整个过程需要联网,下载时间取决于网速,一般几分钟到十几分钟不等。装完之后系统会提示你重启电脑。

重启之后,系统会自动弹出一个Ubuntu窗口,让你设置Linux的用户名和密码。注意这个用户名不一定要和Windows用户名一样,而且密码输入时屏幕上不会有任何显示,不要以为键盘坏了,正常输完回车就行。

后面如果你还想要别的Linux发行版,可以在管理员PowerShell里执行:

wsl --list --online

这条命令会列出所有可用的发行版。看到列表之后,用下面的命令安装指定发行版:

wsl --install -d Ubuntu-22.04

这里的Ubuntu-22.04可以替换成你从列表里看到的任何发行版名字,比如Debian、Kali Linux、openSUSE等。

4.2 传统方式:适合老系统或自定义安装

如果你的系统比较老,或者需要更精细的控制,那就走传统的手动安装路径。

首先,按我上面说的,在"启用或关闭Windows功能"里勾选"适用于Linux的Windows子系统"。如果需要WSL 2,再把"虚拟机平台"也勾上。重启系统。

然后以管理员权限打开PowerShell,设置WSL 2为默认版本:

wsl --set-default-version 2

接下来去Microsoft Store里搜"Linux",选择你想要的发行版(推荐Ubuntu),点击安装。安装完成后,从开始菜单启动它,它会引导你完成用户名和密码的设置。

这种方式的优点是可以直接看到Microsoft Store里的发行版列表和介绍,适合对命令行不熟的新手。缺点是如果Microsoft Store里的下载有问题(比如国内网络环境下偶尔下载卡住),体验就不太好。

如果你对网络下载有顾虑,还有一个更原始的办法:手动下载Linux发行版的安装包,然后在PowerShell里执行Add-AppxPackage命令来安装。这种方式适合公司内网环境或者Microsoft Store失效的情况,但步骤繁琐一些,一般用不到。

4.3 安装后先确认一下状态

安装完成之后,别急着开始用,先花一分钟确认一下状态。在PowerShell或Windows Terminal里执行:

wsl --status wsl --list --verbose

第一条命令显示WSL的版本和默认发行版信息;第二条命令以列表形式显示已安装的发行版以及它们各自运行的WSL版本。正常情况应该看到类似这样的输出:

NAME STATE VERSION * Ubuntu Stopped 2

开头的星号表示默认发行版,VERSION列显示的是2,说明WSL 2已经正常启用。如果VERSION显示的是1,而你希望用WSL 2,执行:

wsl --set-version Ubuntu 2

系统会提示正在转换,这个过程可能需要几分钟。转换完成后,再执行一次wsl --list --verbose确认版本已经变成2。

注意:在安装过程中如果遇到"wsl.exe --install"后没有任何反应,或者提示安装未完成,最常见的原因是Windows功能没有开启完毕,或者系统版本确实太老。先把系统更新都打上,再重试一次,大多数情况下都能解决。

5. 安装后的核心配置与日常使用技巧

5.1 进入子系统的几种姿势

WSL装好之后,怎么进去用是第一个问题。最简单的办法,直接在PowerShell、Windows Terminal或者cmd里输入wsl命令,回车,就能进入默认发行版的Shell。

还有两种更精细的进入方式。一种是直接指定发行版:

wsl -d Ubuntu-22.04

另一种是以指定用户身份进入:

wsl -d Ubuntu-22.04 -u root

日常开发中,我通常会在Windows Terminal里配置一个Ubuntu的标签页,点一下就直接进子系统,用起来就像开了一个新的终端标签一样,特别顺手。配置方式也很简单:Windows Terminal的设置里,点击左下角的"添加新配置文件",选择Ubuntu,就会自动生成一个专属标签页入口。

5.2 文件互操作:Windows和Linux之间怎么传文件

这是新人最爱问的问题之一:我在Windows里下载了一个压缩包,怎么弄到Linux子系统里?

WSL的设计里已经内置了文件互通的桥梁。Windows端的文件系统在Linux里被挂载到了/mnt/目录下。你的C盘就是/mnt/c/,D盘就是/mnt/d/,以此类推。所以在Linux子系统的终端里,直接cd /mnt/c/Users/你的用户名/Downloads就能看到Windows下载文件夹里的东西,用cp命令就能把它拷贝到Linux的目录下。

反过来,要在Windows里访问Linux子系统的文件,在文件资源管理器的地址栏输入\wsl$\Ubuntu-22.04,回车,就能像访问网络共享一样打开Linux的文件系统。更简单的方式是,在Linux终端里执行explorer.exe .,Windows文件资源管理器会直接弹出并定位到当前Linux目录。这个命令我几乎每天都用,从Linux往Windows拖文件不要太方便。

但这里有一个重要的性能提醒:跨系统访问文件虽然方便,但也慢。在Linux里操作/mnt/c/下的文件,尤其在WSL 2里,性能损失很明显。所以如果做开发项目,一定把代码放在Linux内部,也就是~/目录下面,不要图方便放在/mnt/c/下。文件传输走/mnt/c/没问题,但日常开发运行还是老老实实待在Linux自己的文件系统里。

5.3 设置默认用户和切换到root

安装完Ubuntu的时候,你创建的那个用户是普通用户。日常操作里,凡是涉及系统级安装的命令,比如apt install,都需要sudo权限。sudo的用法很简单,在命令前加sudo,然后输入当前用户的密码。

如果你经常需要root权限,有人习惯直接切成root用户:

sudo -i

执行完,终端就切到root用户了,再执行apt相关命令就不用每次输sudo了。但我的建议是,不要长期用root做日常操作,权限太大,容易误删东西。养成sudo的习惯,等真正需要root时才用。

如果你希望wsl命令默认以root身份进入子系统(有些自动化脚本场景需要),可以修改WSL的默认用户。编辑C:\Users\你的用户名.wslconfig文件(如果没有就新建一个),加入:

[user] default=root

保存后重启WSL(wsl --shutdown),再次进入就是root用户了。不过还是那个建议,日常开发别这么干。

5.4 把子系统迁移到D盘,别让C盘爆掉

WSL默认把所有发行版的文件放在C盘,时间一长,C盘空间会越来越紧张。我的个人经验是,装完WSL基本没多久就有好几个G,加上Docker的镜像文件,C盘很容易告急。所以把WSL迁移到其他盘是很有必要的。

迁移过程分四步:

第一步,关闭所有WSL进程:

wsl --shutdown

第二步,把现有的发行版导出成一个tar文件:

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

第三步,从WSL里移除原来的发行版:

wsl --unregister Ubuntu

第四步,重新导入到新位置,比如D:\WSL\Ubuntu:

wsl --import Ubuntu D:\WSL\Ubuntu D:\wsl-backup\ubuntu-export.tar --version 2

导入完成后,可以删除第二步的tar文件,腾出空间。--version 2这个参数是保证导入后继续使用WSL 2版本。

这里有个坑要注意:通过wsl --import迁移之后,WSL里的默认用户会变成root用户,而不是你之前创建的那个普通用户。解决办法有两个,要么在迁移之前先记住自己用户名,然后执行:

Ubuntu config --default-user 你的用户名

要么用一个更快的方法,因为迁移后你直接以root登录,使用下面的命令改回来:

sed -i 's/default=root/default=你的用户名/' /etc/wsl.conf

另外也可以手动编辑/etc/wsl.conf,加上:

[user] default=你的用户名

我个人推荐第二种,因为/etc/wsl.conf的方案在未来重装WSL时也适用,提前在子系统内部写好配置,任何时候启动都以指定用户登录。

5.5 systemd与开机自启服务

WSL默认不启用systemd,这对很多习惯Linux管理方式的用户来说是个困惑点。比如你用service redis start启动的服务,关闭WSL再打开它就停止了,想让它在WSL启动时自动运行,传统方法是在配置里加开机命令,但现在新版WSL已经支持完整的systemd。

在/etc/wsl.conf中,如果有以下内容:

[boot] systemd=true

保存后执行wsl --shutdown,再重新进入子系统,然后执行systemctl status就能看到systemd正常工作了。这时候想装个服务并设置开机自启,就像在正统Linux上一样:

sudo systemctl enable redis sudo systemctl start redis

有了systemd,你在WSL里玩Elasticsearch、MySQL这类服务,管理起来会舒服很多。

6. 实战:在WSL里搭建常见开发环境

6.1 更新软件源与基础软件

进入WSL后的第一件事,永远是更新系统软件源列表和已安装的软件包:

sudo apt update && sudo apt upgrade -y

更新完成后,建议装一些基础工具,比如git、curl、wget、zip、unzip等:

sudo apt install -y git curl wget zip unzip build-essential

git在Linux下的体验比Windows原生版好很多,尤其遇到项目里的换行符、权限问题,一切行为跟标准Linux完全一样。

6.2 安装Miniconda:Python环境管理利器

很多人在Windows上装Python环境时,被各种路径问题、PATH变量、权限问题折腾得够呛。在WSL里装Miniconda,你会发现这才是正确姿势。

首先在官网获取Miniconda的最新安装包地址,然后进入WSL终端执行:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh

按照提示一路输入yes,如果询问是否初始化conda init,一定要选yes。安装完成后,关闭终端重新打开,conda命令就能用了。

在WSL里用conda创建一个干净的Python环境,然后装一些需要编译的原生库,基本不会再出现Windows上"缺这个dll、缺那个编译器"的情况。我自己的做法是,项目环境都建在WSL里,Windows那边只留了一个轻量的Python做辅助脚本。

6.3 安装Redis与Elasticsearch

Redis和Elasticsearch是典型的重运维型中间件,在Windows上总感觉像后妈养的一样,官网连Windows版本都只停留在实验阶段。但在WSL里安装它们,和在一台标准Linux服务器上安装完全没区别。

Redis的安装:

sudo apt install -y redis-server sudo systemctl enable redis sudo systemctl start redis

启动后执行redis-cli ping,返回PONG就说明Redis正常工作了。之后你的Windows程序可以通过localhost:6379直接访问WSL里的Redis,因为WSL 2默认会做端口转发。

Elasticsearch稍微复杂一点,因为ES不允许使用root用户运行,而且对JVM版本有要求。我的安装步骤是:

sudo apt install -y openjdk-17-jre-headless wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.2-linux-x86_64.tar.gz tar -xzf elasticsearch-8.10.2-linux-x86_64.tar.gz cd elasticsearch-8.10.2/bin ./elasticsearch

需要注意的是,ES不能用root跑,所以需要切换到一个普通用户再来启动。如果只是本机开发测试,可以直接在config/elasticsearch.yml里配置network.host为localhost,避免安全配置的提示干扰。

启动后,Windows浏览器访问http://localhost:9200,如果能看到ES的JSON信息,就说明一切都通了。

6.4 在WSL里跑Docker

WSL 2最大的价值之一就是Docker。Docker Desktop for Windows现在默认就是基于WSL 2后端运行的,可以说WSL 2和Docker是天生一对。

Docker Desktop安装时,它会自动安装并配置WSL 2的Docker集成。装完后,你的WSL发行版里可以直接用docker命令,因为Docker Desktop会把Docker CLI挂载进WSL环境里。

如果你不想用Docker Desktop,也可以在WSL里直接装原生Docker引擎:

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

最后一步是把当前用户加入docker组,这样以后运行docker命令就不需要每次都sudo了。改完需要重新登录WSL(wsl --shutdown再进入)才能生效。

在WSL里跑原生Docker的好处是更贴近真实的Linux服务器环境,资源占用也小一些。但Docker Desktop的图形界面、自动代理配置、多发行版切换功能对新手来说更友好,怎么选择看你自己的使用习惯。

6.5 集成VSCode:把编辑器和Linux环境打通

写代码如果只用命令行工具,总感觉缺了点现代IDE的便利。VSCode对WSL的支持非常完善,在Windows端安装VSCode,再装一个Remote - WSL扩展,然后进入WSL终端执行:

code .

它会自动检测到Windows端的VSCode,打开一个新的VSCode窗口,这个窗口里所有操作都是直接作用于WSL环境的。终端是Linux终端,文件管理器看到的也是Linux文件系统,连Python解释器、Git都自动识别成WSL里的。

这意味着你可以写代码、装依赖、跑测试,整个过程无缝衔接,不需要在Windows和Linux之间来回切换。Remote - WSL是我认为微软做得最好的一个功能,强烈建议每个人配好。

6.6 在WSL里跑Codex类开发工具

现在很多AI开发工具,比如OpenAI Codex CLI这类新型终端编程工具,官方推荐在Linux/macOS环境下运行,Windows版本要么不支持,要么需要WSL环境。这就是一开篇同事遇到的那类问题:Windows上的安装程序检测到WSL缺失,直接中断安装。

在WSL里装这类工具时,Node.js环境和Python环境是标配。我的建议是先用nvm装Node.js LTS版本,再用pip装工具依赖,这样可以避免很多版本冲突问题。如果安装过程中提示权限不足,检查是不是用错了用户;如果提示网络问题,检查一下代理配置,确保WSL内也能正常访问外网。

这类工具的X因素在于它们可能会调用系统编译链,所以提前把build-essential装好会省心很多。

7. 常见问题与排查技巧实录

7.1 "此应用程序需要适用于Linux的Windows子系统可选组件"

这个报错出现的频率最高。原因分两类:一类是WSL确实没装或者装的不完整;另一类是WSL装了,但版本过旧或没有正确注册到系统组件。

排查步骤:

  1. 在PowerShell里执行wsl --status,看能不能正常输出。如果报错"未安装",说明WSL环境不完整。
  2. 执行wsl --update,更新WSL到最新版本。
  3. 确认Windows功能里的"适用于Linux的Windows子系统"和"虚拟机平台"都勾选了。
  4. 执行wsl --shutdown重启WSL。
  5. 最后,重新运行那个提示缺少组件的程序。

绝大多数情况下,这套组合拳能解决90%的问题。

7.2 wsl --install之后毫无反应或一直卡住

wsl --install命令的理论行为是自动下载并安装,但实际执行时可能卡在下载阶段。这通常跟网络环境有关,WSL的发行版下载和更新走的是微软的服务器,在网络不太理想的场景下可能会非常慢甚至不动。

处理方案:

  1. 耐心等,第一次下载确实可能比较慢,给个5分钟看看。
  2. 如果确认很久没动静,Ctrl+C中断,重新执行一次,有时重试就能成功。
  3. 也可以换成手动从Microsoft Store安装Linux发行版。
  4. 安装完成后第一时间执行wsl --update,确保内核版本是最新的。

7.3 "注册表配置信息不完整或已损坏"

这是Windows端WSL配置损坏导致的错误,我当时遇到的时候也很头疼。通常的原因是Windows更新后WSL组件状态异常,或者是多次强制关闭WSL进程导致的残留问题。

尝试的解决顺序是:

  1. 先在"启用或关闭Windows功能"里取消勾选"适用于Linux的Windows子系统"和"虚拟机平台",重启。
  2. 重启后再次勾选这两项,再重启。它会重新注册组件,清掉损坏的残留状态。
  3. 如果还不行,以管理员身份执行:
dism /online /cleanup-image /restorehealth
  1. 如果系统文件有损坏,执行:
sfc /scannow

7.4 "由于配置信息(注册表中的)不完整或已损坏,Windows无法启动这个硬件设备"

听着像是硬件问题,其实和虚拟化功能的注册有关。这个提示通常出现在虚拟机监控程序相关的设备上,也就是Hyper-V或者虚拟化平台相关的组件启动异常。

排查方向:

  1. BIOS里确认虚拟化(VT-x/AMD-V)已经开启。
  2. 检查"虚拟机平台"这个Windows功能是否正确开启。
  3. 确认系统没有同时开启与Hyper-V冲突的其他虚拟化软件(部分老版本沙箱软件、某些安全软件会对虚拟化产生干扰)。
  4. 在PowerShell里执行bcdedit /set hypervisorlaunchtype auto,把Windows的Hyper-V启动类型改为自动,重启试试。

7.5 WSL里的脚本一闪而过直接闪退

这里有一个特别经典的坑:Windows和Linux的换行符不一样。很多人在Windows上用记事本或VSCode写的shell脚本,拷贝到WSL里执行时,因为文件是CRLF(回车+换行)结尾,Linux的bash会报错或者直接退出。表现就是脚本"一闪而过"。

验证方法很简单,在WSL里用file命令看一下脚本文件:

file myscript.sh

如果输出里带CRLF字样,那就确认了。修复方式:

sed -i 's/\r$//' myscript.sh

另一类闪退是因为脚本里用了bash特有的语法,但脚本开头写的是#!/bin/sh,而系统的sh并不是bash。这种情况把脚本开头改成#!/bin/bash,或者直接用bash myscript.sh执行。

7.6 WSL网络突然不通了

WSL 2的网络是基于虚拟交换机的,偶尔Windows更新或休眠唤醒后,WSL的网卡状态会出现异常,表现为WSL里curl外网超时,但Windows本身网络正常。

我的处理顺位是:

  1. 先执行wsl --shutdown,再重新启动WSL。大多数情况这一招就好使。
  2. 如果还不行,检查Windows防火墙是否拦截了WSL的虚拟网卡。给"适用于Linux的Windows子系统"相关的程序放行一下。
  3. 如果是在公司内网或特殊网络环境,可能需要配置Windows的代理转发,或者在/etc/wsl.conf里配好DNS设置,常见做法是把nameserver改为8.8.8.8或你所在网络提供的DNS地址。

7.7 WSL不断弹出"Windows系统执行了非核心操作"之类的安全日志提示

有些安全防护工具会持续记录WSL的活动,比如发现wsl.exe从命令行被调用。这个不是异常,是正常行为,WSL里的程序执行、文件读写本来就会走Windows内核的审计路径。如果觉得日志太多影响排查,可以在安全软件的设置里把WSL相关的进程加白名单,只记录不告警。

7.8 问题排查速查表

我把上述典型问题整理成一张速查表,方便遇到问题时快速定位:

现象可能原因最快解决方案
安装提示缺少WSL组件WSL未安装或未更新wsl --install、wsl --update
wsl --install卡住网络下载慢重试或从Microsoft Store安装
注册表信息不完整WSL状态损坏取消勾选Windows功能再重新开启
虚拟化设备启动失败BIOS未开启虚拟化进BIOS开启VT-x/AMD-V
脚本一闪而过CRLF换行符sed -i 's/\r$//' 脚本名
WSL无法上网虚拟网卡异常wsl --shutdown重启WSL
端口访问不通服务监听在WSL内部确认Windows防火墙放行对应端口

8. 自动化、运维与更多玩法

8.1 Windows与WSL的自动化协作

WSL不仅是一个交互式的Linux环境,还可以作为Windows自动化方案的一个执行引擎。比如你可以写一个Windows上的计划任务,调用wsl命令去执行Linux侧的一个Python脚本,这样一来Python生态的处理能力就能无缝接入你的Windows工作流。

举个例子,我常见的一种用法是:Windows上的数据文件定时拷贝到WSL目录,然后通过wsl命令运行数据清洗脚本,处理完再把结果传回Windows。命令长这样:

wsl -d Ubuntu-22.04 -- bash -c "python3 /home/myuser/scripts/process.py"

wsl命令还支持直接从Windows把参数传进Linux:

wsl -d Ubuntu-22.04 -- python3 /home/myuser/scripts/process.py --input "C:\data\in.csv" --output "/mnt/c/data/out.csv"

需要注意,路径参数中Windows路径最好转成/mnt/c/的形式,让Linux侧的程序直接识别。这种自动化写法,可以把Windows上不好搞的复杂数据处理、批量转换、爬虫任务都扔给WSL里的Linux工具链完成。

如果你经常需要写WSL相关的自动化脚本,这里有个小技巧:wsl命令后面跟的命令,是用当前目录自动映射的,所以在Windows的某个项目目录下调用wsl python3 xxx.py时,Linux侧的当前工作目录会自动切换成对应的/mnt/c/路径,非常方便。

8.2 WSL内存与CPU的核心配置

WSL 2的默认资源配置是动态的,占用的内存和CPU核数取决于宿主机可用资源。如果你的机器配置一般,跑着多个服务时可能会觉得卡,这时可以手动限制WSL的资源占用。

在Windows端创建或编辑C:\Users\你的用户名.wslconfig文件,内容可以这样写:

[wsl2] memory=6GB processors=4 swap=2GB localhostForwarding=true
  • memory:限制WSL最大使用内存
  • processors:限制WSL可用CPU核数
  • swap:指定交换分区大小
  • localhostForwarding:确保Windows能通过localhost访问WSL里开的服务

修改完执行wsl --shutdown,重新启动就能生效。反过来,如果你的机器内存很大(比如32GB以上),可以把memory调高,给Linux侧更多空间,也能让Docker和数据库跑得舒服一点。

8.3 WSL与SSH远程登录

如果你想从局域网另一台机器连接WSL环境,最常见的方案是在WSL里跑一个SSH服务:

sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh

然后编辑/etc/ssh/sshd_config,确认端口开启。Windows防火墙需要放行22端口的入站请求。WSL 2的IP是动态的,从外部访问时先查一下WSL的IP(在WSL里执行hostname -I),再用ssh 用户名@WSL的IP连接即可。

如果觉得每次都查IP很麻烦,也可以配置端口转发,比如把Windows的某个端口转发到WSL的22端口。这个属于进阶玩法,日常用得不多,就不展开说了。

8.4 WSL下的命令行直播与远程演示

提到热词里有"windows系统命令行直播",这其实是我们在开发交流或讲师授课时会遇到的一个实用场景。WSL天然支持在一个Windows终端里运行,屏幕录制、直播推流这类工具可以直接捕获Windows终端的画面,操作过程和日常直播类工具的使用是一致的。要注意的是,WSL终端的字体和配色,建议选一个大一点的字号和等宽字体,这样直播时观众看起来不会太吃力。

另一个小技巧是,直播演示时如果怕误操作暴露个人路径和用户信息,可以在进入WSL前先修改Shell提示符,把用户名和主机名隐藏掉,让画面更干净。

8.5 卸载WSL与清理空间

使用WSL久了,想卸载换一个新的发行版,或者整个不用了,清理方式也有讲究。

单独卸载某个发行版:

wsl --unregister 发行版名称

这会删除该发行版的所有数据,包括你在里面的所有文件和配置,所以操作前务必做好备份。

整个停止使用WSL,则在"启用或关闭Windows功能"里取消勾选"适用于Linux的Windows子系统"和"虚拟机平台",重启即可。注意,这不会删除你在磁盘上已有的Linux发行版文件,如果空间还是不够,可以手动删掉之前wsl --export导出的tar文件,以及导入时设置的目录。

9. 我的一点心得与建议

WSL这几年发展得特别快,从最初被吐槽"不能跑Docker、不能跑systemd、WSL 1和WSL 2之间尴尬并存",到现在的WSL 2已经基本可以替代日常开发中80%的Linux虚拟机使用场景。如果你是一个常年依赖Windows、但又要搞Linux开发的人,花一晚上把WSL配置好,收益是巨大的。

最后分享几个我踩过坑之后总结的小建议:

系统更新能自动就自动,WSL的很多bug修复都依靠Windows更新和wsl --update,保持最新能省去很多坑。

养成定期备份WSL发行版的习惯,wsl --export做一次全量备份也就是几分钟的事,但出问题的时候能救命。

在WSL里不要装开发板工具链或者交叉编译需要的特殊内核模块,WSL 2的内核是微软定制的,和标准发行版内核略有差异,这类需求还是留给虚拟机或者真机。

把项目文件放在Linux内部目录,别放在/mnt/c下,性能差距你实际跑一次就知道有多明显。

WSL是一个工具,不是万能钥匙。遇到Windows原生支持很好的软件,还是用Windows版;遇到必须依赖Linux环境的场景,也不要硬扛,WSL是你的好帮手。合理使用这两种环境,开发效率会有一个质的提升。

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

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

立即咨询