1. 先把WSL的“管理对象”搞清楚,命令才学得明白
WSL这个命令,很多人把它当成一个打开Linux的开关,装完系统、进到Ubuntu里敲几条命令,就再也没碰过wsl.exe。但真到某天C盘飘红、默认发行版找不到了、或者安装卡在某个百分比一动不动时,才发现自己除了wsl之外什么都不知道。这篇东西就是要把wsl.exe这层管理命令梳理透,从安装、更新、切换、卸载,到备份、迁移、排错,一次性讲清楚。
我先说一个最容易被忽略的点:wsl.exe本身分两层管理对象。第一层是“WSL运行时”,就是支撑Linux子系统跑起来的那套组件和内核;第二层是“Linux发行版”,也就是你在上面装的Ubuntu、Debian、Kali这些具体系统。wsl --update管的是前者,wsl --install -d Ubuntu管的才是后者。很多人排错时把这两层混在一起,方向错了,自然越搞越乱。
1.1 wsl.exe 到底在管什么
打开PowerShell执行wsl --help,你能看到一长串命令,但归纳下来就几类:安装类(--install、--update),列表类(--list、--status、--version),运行控制类(--terminate、--shutdown),发行版操作类(--set-default、--set-version、--unregister),以及备份迁移类(--export、--import)。只要你记住“每个发行版都是可以被创建、启动、停止、删除、备份、恢复的独立对象”这个大前提,这套命令的逻辑就很顺。
我还想强调一下--set-version这个命令。它可以把某个发行版在WSL1和WSL2之间切换,比如wsl --set-version Ubuntu 1。WSL1的启动速度在某些场景下有优势,WSL2则有着完整内核和更好的应用兼容性。虽然现在绝大多数人都用WSL2,但遇到老项目、特殊网络栈或特定文件监控场景时,切回WSL1反而能救命。这个命令存在感不强,但值得记住。
1.2 发行版、VHDX、注册表的关系
理解管理命令之前,还需要明白WSL发行版在Windows侧是怎么存的。WSL2的每个发行版,本质上是一个轻量虚拟机,它的完整文件系统都封装在一个VHDX磁盘镜像文件里。以Ubuntu为例,这个文件默认在:
text复制C:\Users\<你的用户名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu...\LocalState\ext4.vhdx
你在WSL里创建的文件、装的所有软件、包括系统本身的配置,全部落在这个vhdx里。这就是为什么WSL会悄悄吃掉几十上百GB的C盘空间——因为所有东西都写进了一个文件里,而且这个文件并不会因为你删了WSL里的数据而自动变小。Windows侧还会在注册表里记录每个发行版的配置信息,位置在HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss,能看到发行版的BasePath等设置。知道这些,你就能理解wsl --unregister为什么那么危险——它把注册表项和vhdx文件一起删除,数据没有任何回收站可进。
文件系统的存储方式还解释了一个常见现象:为什么从Windows资源管理器往\\wsl$\Ubuntu里复制文件很快,但从WSL里访问/mnt/c下的文件却经常慢得让人抓狂。因为/mnt/c是跨系统文件访问,每次读写都要经过系统调用转换,涉及大量小文件时性能损耗会被放大。我自己的习惯是:代码工程、数据库这类IO密集的东西都放到WSL内部文件系统,Windows和WSL之间只交换必要的小文件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从零开始:安装、更新、初始化命令一次讲透
2.1 wsl --install 的完整用法
2020年之后,安装WSL的主流方式就是一条命令:
powershell复制wsl --install
这条命令会依次完成:启用“适用于Linux的Windows子系统”功能、启用“虚拟机平台”功能、下载并安装WSL运行时、再安装一个默认发行版(通常是Ubuntu)。听起来一气呵成,但它依赖网络下载和系统组件更新,所以实际执行中确实容易出现各种意外。
想安装指定发行版,先查一下在线列表:
powershell复制wsl --list --online
输出类似这样:
text复制NAME FRIENDLY NAME
Ubuntu Ubuntu
Ubuntu-24.04 Ubuntu 24.04 LTS
Debian Debian GNU/Linux
Kali-Linux Kali Linux Rolling
然后精确指定:
powershell复制wsl --install -d Ubuntu-24.04
这个发行版名称必须和列表里的NAME完全一致,大小写也要对上。第一次启动新安装的发行版时,会提示你创建一个Unix用户名和密码,这个用户是WSL内部独立的账号,跟Windows账户没关系。它会被自动加入sudo组,日常在WSL里提权就靠它。
2.2 安装太慢或卡住的替代方案
“wsl --install 太慢”绝对是近年来WSL搜索里的高频词。尤其是在某些网络环境下,安装进度条长时间卡在6%附近不动,原因大概率是默认走了Windows应用商店的下载通道,而访问微软存储服务在当前网络环境下并不稳定。
第一个有效方案是用web下载参数绕过商店通道:
powershell复制wsl --install -d Ubuntu-24.04 --web-download
这个参数会直接从微软的在线端点下载发行版,而不是走应用商店的UWP交付链路。实测在很多场景下,它的速度和成功率都比默认方式高,尤其是当应用商店组件本身有问题时,这招几乎是首选。
第二个方案是手动安装离线包。去微软官方文档找到“手动下载Linux发行版安装包”的页面,下载对应发行版的.appx或.appxbundle文件,然后执行:
powershell复制Add-AppxPackage .\Ubuntu_2204.1.7.0_x64.appx
安装完成后在开始菜单启动该发行版,首次启动时建账号,后面跟正常安装没有区别。
第三个方案是用rootfs的tar包直接导入。在Ubuntu官方或微软文档里能找到.tar.gz格式的WSL镜像包,下载之后通过第三小节要讲的wsl --import导入。这个方案完全不依赖应用商店,而且是纯命令行操作,适合内网离线环境或批量初始化场景。我个人的倾向是:网络状态正常时用--web-download最省心;公司内网受限时直奔rootfs导入路线,别在商店下载上死磕。
2.3 更新内核与WSL版本
WSL运行时本身也需要更新。最常规的命令:
powershell复制wsl --update
如果更新卡住或者报错,同样可以加web参数:
powershell复制wsl --update --web-download
更新完之后,用wsl --version确认版本号是否变化。另外还有一个容易被忽略的命令:
powershell复制wsl --status
它输出当前WSL的状态信息,包括默认发行版、默认版本(WSL1还是WSL2)、内核版本等。写脚本之前先跑一下status,能快速确认环境是否符合预期,节省很多排查时间。
3. 发行版生命周期管理:列出、切换、卸载、导入导出
3.1 查看和切换默认发行版
机器上同时装多个发行版的情况很常见,比如一个Ubuntu做日常开发,一个Debian做纯净编译测试。这时最常用的命令就是:
powershell复制wsl --list --verbose
简写是wsl -l -v,输出会包含每个发行版的名称、运行状态和WSL版本:
text复制 NAME STATE VERSION
* Ubuntu Running 2
Debian Stopped 2
行首的星号代表默认发行版。如果想把Debian设为默认,执行:
powershell复制wsl --set-default Debian
设置之后,在PowerShell里直接输wsl进入的就是Debian。临时想进某个特定发行版,不需要改默认设置,用:
powershell复制wsl -d Ubuntu
这个区分很有用,尤其是你同时跑多个项目时,默认发行版和临时指定发行版是两回事,可以作为两个固定操作习惯来记忆。
3.2 彻底卸载发行版:unregister的威力与代价
想删除一个用不上的发行版时,如果只是去“设置-应用”里找到对应程序卸载,其实并不彻底——它删掉的只是启动器入口,vhdx文件还在磁盘里占着空间,注册表信息也留着。真正彻底的删除命令是:
powershell复制wsl --unregister <Distro>
比如:
powershell复制wsl --unregister Debian
这个命令会把该发行版的注册表项、VHDX文件、所有内部数据一并删除,而且没有回收站、没有二次确认。我自己的原则是:执行unregister前必须先确认这个发行版里没有需要保留的数据,或者已经通过export做了完整备份。否则一旦手滑,开发环境、数据库数据全都救不回来。
有个场景我想特别提醒:当一个发行版启动不了了,很多人会下意识“删了重装”。但更稳妥的做法是先用export把状态导出来,哪怕导出的tar包以后用不上,也比直接清空数据要安心。重装的成本很低,数据丢失的成本可能很高。
3.3 导出导入:迁移和备份的最稳路径
备份和迁移WSL发行版,核心命令就是一对:
powershell复制wsl --export <发行版名称> <目标tar文件>
wsl --import <发行版名称> <VHD存放目录> <来源tar文件>
举个例子,把Ubuntu整体备份到D盘:
powershell复制wsl --export Ubuntu D:\wsl-backup\ubuntu-2025.tar
还原回来:
powershell复制wsl --import Ubuntu D:\wsl\Ubuntu D:\wsl-backup\ubuntu-2025.tar
第二个参数是新的VHD文件存放目录,建议放在一个独立的、有足够空间的磁盘路径下。新版WSL还支持直接导出/导入vhdx原始镜像:
powershell复制wsl --export Ubuntu D:\wsl-backup\ubuntu-2025.vhdx --vhd
wsl --import Ubuntu D:\wsl\Ubuntu D:\wsl-backup\ubuntu-2025.vhdx --vhd
tar和vhdx两种格式的区别在于:tar是文件系统快照,通用性好,适合迁移;vhdx是原盘格式,保留了更多底层结构细节。我个人日常备份用tar,整盘迁移用vhdx。
这套导入导出命令还有一个黄金应用场景——迁移到非系统盘。C盘空间吃紧时,把整个发行版挪到D盘,完整流程是:
- 先关闭所有WSL:
wsl --shutdown - 导出当前发行版:
wsl --export Ubuntu D:\wsl\ubuntu-migrate.tar - 注销原发行版:
wsl --unregister Ubuntu - 创建新目录,比如
D:\WSL\Ubuntu - 导入:
wsl --import Ubuntu D:\WSL\Ubuntu D:\wsl\ubuntu-migrate.tar - 执行
wsl -l -v确认状态,再进去看关键目录和数据
整个过程都是命令行操作,中途不依赖图形界面,所以哪怕Windows桌面已经卡顿,只要PowerShell能打开就有救。
3.4 恢复导入后的默认用户
这里必须提醒一个export/import的经典坑:导入后的发行版默认用户会变成root,因为tar包里只保存了文件系统,没有保留“哪一个是默认登录用户”的元数据。问题就是你之前配好的vim、git、zsh这些用户级配置全部“消失”了——它们其实都还在,只是入口从普通用户变成了root。
恢复方法很简单,进入发行版后编辑/etc/wsl.conf:
ini复制[user]
default=你的用户名
保存退出后,在Windows侧执行wsl --shutdown,重新进入发行版,默认用户就恢复了。如果你的用户名是dev,那么完整的操作就是:
bash复制sudo sh -c 'echo "[user]" > /etc/wsl.conf'
sudo sh -c 'echo "default=dev" >> /etc/wsl.conf'
然后回到PowerShell执行wsl --shutdown再进。这个坑我在第一次迁移时踩过,当时一度以为用户配置文件丢了,白白折腾了好一阵。
4. 日常运行控制:启动、终止、执行单条命令
4.1 启动与进出
绝大多数人最熟练的应该就是直接敲wsl进入默认发行版。但日常控制命令不止这一条:
powershell复制wsl
wsl -d Ubuntu
wsl -u root
wsl --cd ~
-d指定发行版,-u指定用户名,--cd指定进入后的初始工作目录。这几个参数组合起来,可以帮你精准地“降落”到某个发行版的某个用户、某个目录下,特别适合写脚本时使用。
还有一个容易被忽略但非常实用的参数是-e,即--exec,用来在不进入交互式shell的前提下执行单条Linux命令:
powershell复制wsl -e sh -c "uname -r && lsb_release -a"
比如你在PowerShell脚本里需要临时获取WSL里的内核版本,直接这样输出结果,比先进入shell再手动敲命令高效得多。
4.2 把WSL当成Windows的“Linux工具箱”
搜索热词里出现了wsl使用binwalk、wsl安装qemu、wsl激活python环境这类词,其实背后就是同一个思路:Windows上不想装一堆原生工具,那就把WSL装好的工具链直接拿过来用。
举个例子,我想分析一个固件文件,不需要在Windows里折腾binwalk的原生移植版,直接执行:
powershell复制wsl binwalk firmware.bin
想跑一个Python脚本,但Windows侧没配Python环境,WSL里有完整的Python,直接:
powershell复制wsl python3 script.py
这种用法让Windows和Linux的边界变得很淡。你可以在批处理或计划任务中直接用WSL执行Linux命令,获得一套更接近服务器的运行环境。
不过这里有个性能提醒:WSL里通过/mnt/c访问Windows文件系统的效率比访问WSL内部文件系统低得多。如果你要做大量小文件IO,比如读几千个图片、跑编译任务,建议把工作目录放到Linux侧,再从Linux侧访问Windows路径。这是很多人在WSL里跑项目时最容易踩的性能坑。
4.3 优雅地关闭WSL
关闭WSL不要用任务管理器“杀进程”的方式,那很可能导致VHD文件状态异常。正确的管理命令有两个:
powershell复制wsl --terminate Ubuntu
wsl --shutdown
第一条只关指定发行版,第二条把整个WSL运行时、所有发行版全部关闭。需要特别注意的是:修改/etc/wsl.conf、.wslconfig、或者想要让vhdx文件释放空间时,都必须先执行wsl --shutdown,否则改动不会生效,文件也可能仍被占用。
如果你正在用Docker Desktop的WSL2后端,执行wsl --shutdown之后,Docker Desktop会一起被停掉,打开Docker Desktop时会自动重新拉起完整的WSL运行时。这个现象不是故障,记住“关了WSL,Docker也会没”就行。
5. 高频踩坑实录:安装、更新、启动时的经典问题排查
5.1 wsl --install 卡在6%或一直转圈
这个问题在搜索热词里高到可以单独开一篇。卡住的位置通常在“正在下载适用于 Linux 的 Windows 子系统”或者“正在安装 Ubuntu”这两个阶段。
我的排查顺序是:
- 先确认Windows功能是否都已开启。打开“控制面板-程序-启用或关闭Windows功能”,看“适用于Linux的Windows子系统”和“虚拟机平台”这两项是否勾选。没勾选就先启用,然后重启。
- 如果功能已开启但还是卡住,优先改用web下载方式:
powershell复制wsl --install -d Ubuntu-24.04 --web-download - 仍然不行,走离线安装路线:下载appx安装包或者直接导入rootfs tar包。这一步不依赖在线下载,成功率高很多。
- 如果安装中途报错说某些服务无法启动,再回头检查Windows Update是否有挂起的更新,很多组件安装需要重启后才生效。
有一种“卡住”其实是假象:wsl --install在下载较大的组件时,如果网络较慢,进度条可能长时间不刷新,看起来就像死掉了。给它一点时间,同时可以去任务管理器里看网络占用,如果还有流量在跑,那就耐心等。假如确认网络完全没动静,再执行上面第2、3步不迟。
5.2 “适用于 Linux 的 Windows 子系统无法启动服务”
这条报错在更新WSL时经常出现,完整信息很长,但关键词是“无法启动服务”。它背后通常有三种原因。
第一种是WSL相关服务真的停了。在管理员PowerShell里执行:
powershell复制Get-Service LxssManager
如果状态不是Running,尝试:
powershell复制Start-Service LxssManager
第二种是CPU虚拟化没有开启。运行systeminfo,在输出末尾找“Hyper-V 要求”相关的行,如果显示虚拟化固件中已启用为“否”,就需要进BIOS把Intel VT-x或AMD SVM打开。这一步在部分品牌的机器上默认是关闭的,装WSL2之前务必确认。
第三种是“虚拟机平台”这个Windows功能没有启用。用管理员身份执行:
powershell复制dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
执行完重启。这三步基本能覆盖这个报错的大多数场景。
5.3 更新时碰到403错误
wsl --update报403,多见于网络环境对微软更新端点访问异常的情况。我这边实测最有效的解法是:
powershell复制wsl --update --web-download
加上--web-download之后,更新会从Web端点直接下载,绕开了应用商店更新通道,成功率高了不少。如果依然失败,等几分钟重试,有时是服务端CDN的临时问题。还有一个小技巧:先执行一次wsl --shutdown,让所有WSL进程释放,再执行update,能避开“文件被占用”的隐藏原因。
5.4 启动后提示“请启用虚拟机平台”
这个提示通常出现在打开发行版的一瞬间,说明WSL2所依赖的虚拟机平台功能没有被正确启用。处理方式和5.2里提到的dism命令一致。
有一种情况容易被忽略:机器上同时装了其他依赖Hyper-V组件的软件,有些安全软件会破坏“虚拟机平台”的启动状态。你在“Windows功能”界面里看着勾选项都是正常的,但底层虚拟化服务可能没跑。此时可以看看Windows安全中心的“内核隔离”和“内存完整性”设置,如果强行关闭过虚拟化相关防护,也可能出现这个提示。这个没有标准答案,方向是先确认虚拟化开关、再确认Windows功能、最后看第三方软件的干扰。
6. 集成开发场景中的WSL管理
6.1 在VSCode中调用WSL的完整链路
vscode连接WSL是现在很主流的开发方式。只要你在Windows侧安装了VSCode和“WSL”扩展,然后在WSL内部随便一个项目目录执行:
bash复制code .
Windows侧的VSCode就会以WSL模式启动,窗口左下角显示类似“WSL: Ubuntu”的标识,之后你看到的文件树、终端、调试器全部运行在WSL环境里。这意味着你不需要在Windows侧再配置一遍Node、Python、GCC,全用WSL里那套就行。
第一次使用这个功能时,VSCode会在WSL里自动安装一个server组件。如果这一步下载慢或失败,常见处理是删掉WSL里的~/.vscode-server目录,重新执行code .,让它再装一次。另外,确保默认发行版是你希望连接的那一个,可以在PowerShell里用wsl --set-default提前固定,免得code .连到不期望的发行版上。
6.2 Docker Desktop与WSL2的后端管理
Docker Desktop现在默认构建在WSL2后端上,安装时选择“Use WSL 2 based engine”而不是Hyper-V模式,启动速度和资源占用都会更好。安装完成后,执行wsl -l -v,你会看到多出来一个docker-desktop发行版(部分版本还有docker-desktop-data)。这两个是Docker引擎的专属发行版,原理上和普通发行版一样,可以关闭、可以重启,但不要unregister,否则Docker Desktop就永久失效了,只能重装。
日常管理Docker和WSL的关系时,记住一条:
powershell复制wsl --shutdown
这是让Docker Desktop彻底重启最干净的方式。如果你改了内存、CPU限制,或者感觉Docker的虚拟磁盘占用异常,就shutdown后重新打开Docker Desktop。改了%UserProfile%\.wslconfig里的配置(比如[wsl2] memory=8GB)之后,同样必须执行一次wsl --shutdown,配置才会生效。
6.3 让Windows脚本直接调用WSL里的工具
写批处理或PowerShell脚本时,可以这样调用WSL内部命令:
powershell复制wsl -d Ubuntu --user dev --cd /home/dev -- bash script.sh
这条命令的含义是:使用Ubuntu发行版、dev用户、工作目录/home/dev,执行bash script.sh。每个参数都可以单独调整,非常清晰。
如果涉及Python虚拟环境激活,比如搜索词里的“wsl激活python环境”,直接wsl python3通常不会自动激活venv或conda环境。我更推荐在WSL里写一个入口脚本,比如在~/.local/bin/run-app.sh里写好source /opt/venv/bin/activate,然后再执行业务逻辑。Windows侧调用这个脚本就能获得正确的环境,避免环境变量不生效的问题。
7. 我自己的WSL管理习惯
最后分享几个我一直在用的习惯,不算标准答案,但实测下来确实省心。
第一,每季度至少做一次wsl --export备份。备份文件放到另外一块硬盘或者网盘上,tar包可以压缩,体积比VHDX小很多。等真的遇上系统重装、硬盘损坏、误删发行版,恢复就是一条wsl --import命令的事。
第二,需要长期保留的实验环境,我都拆成独立发行版,而不是在一个Ubuntu里堆所有东西。比如Kali只做临时安全分析,Debian只做纯净编译验证,Ubuntu专门跑日常开发。管理层面无非就是wsl --install -d装需要的发行版,wsl --terminate关掉不用的,wsl --unregister清理不要的,互相之间不干扰,坏了也能单独重装。
第三,改了.wslconfig或/etc/wsl.conf之后的固定动作,一定是wsl --shutdown再重新进入,而不是直接在shell里exit退出。exit只是退出用户会话,很多配置不会重新加载。这一点我踩过很多次“改了没用”的坑,其实不是配置写错,只是没有让WSL运行时真正重启。
WSL的管理命令说到底就是一套围绕“发行版”的增删改查。把上面这几组命令用熟,常见的安装、迁移、备份、排错场景就都覆盖了。真遇到不认识的新参数,先wsl --help看一眼说明,再配合--web-download这类可选参数试,基本都能找到出路。
