ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

WSL2踩坑指南:从安装超时到403报错,解决Windows下Linux环境的核心痛点

WSL2踩坑指南:从安装超时到403报错,解决Windows下Linux环境的核心痛点 说真的我原本没打算跟WSL死磕。就是想用binwalk拆一个固件包教程里一行命令的事结果从安装开始就各种妖蛾子。周末两天我在 wsl --install、wsl --update、wsl --export 这一串命令之间反复横跳才算把这玩意儿彻底捋顺。所以这篇不是那种从零讲到一百的官方教程而是一个踩坑踩出来的经验包按我实际踩坑的顺序来写每个坑都附带排查思路和最终解法希望能帮你把在搜索引擎里翻半天都找不到答案的WSL痛点一次解决掉。先说清楚我的使用场景Windows 10 系统目标是能在Windows下跑一个正经的Linux环境用来做逆向分析、跑Docker、偶尔编译点东西后期还想折腾CUDA和深度学习工具链。如果你也是类似需求这篇文章应该能覆盖你目前遇到的大多数问题。1. 为什么我选了WSL从需求倒推方案1.1 我的真实需求要一个不折腾的Linux环境在很多自学场景里你会发现一个尴尬的事实教程是Linux下的工具是Linux下的偏偏自己的主力机是Windows。我这次就是为了跑binwalk才动了装Linux环境的念头。当时摆在面前的选择无非就这么几个装双系统切换要重启来回折腾而且磁盘分区一旦不满意后期调整很麻烦。开虚拟机VMware或者VirtualBox性能损耗是一方面加上图形界面占用资源老笔记本直接风扇起飞。买云服务器延迟倒是能接受但Ops工具链都跑在远端本地文件同步、代码编辑总觉得隔了一层。WSL不需要重启不用额外付费直接在Windows里跑Linux用户态还能和VS Code、PyCharm联动。我最后选了WSL核心原因只有一个我想在“不离开Windows桌面环境”的前提下获得一个和原生Linux几乎无差别的命令行环境。WSL恰恰是那条最平滑的路径。而且现在的WSL2不再是简单的系统调用翻译层而是跑在一个轻量虚拟机里的完整Linux内核这意味着绝大多数Linux软件都能直接跑不用再担心兼容性。1.2 WSL 1和WSL 2怎么选刚开始接触WSL的人很容易被这俩版本搞晕。简单概括一下WSL 1是把Linux的系统调用翻译成Windows的系统调用启动快和Windows文件系统互通性强但不支持完整的Linux内核很多依赖内核模块的工具比如Docker无法正常使用。WSL 2则是用Hyper-V虚拟化技术跑了一个真正的Linux内核兼容性大幅提升Docker、FUSE这些都能跑代价是内存占用更高跨文件系统的IO性能在某些场景下反而变慢。我用一张表把对比列出来方便你按需选择对比项WSL 1WSL 2架构本质系统调用翻译层轻量虚拟机 完整Linux内核启动速度极快较快Linux内核兼容性差依赖内核模块的工具可能失败高绝大多数Linux软件可用跨文件系统访问速度尚可访问Windows文件明显偏慢内存占用低相对高可配置限制Docker支持不友好原生支持CUDA/GPU加速不支持支持结论很明确除非你的机器老到开不了虚拟化否则一律选WSL2。后面遇到的所有问题我也默认你用的是WSL2。2. 安装环节从“一条命令”到“一路坎坷”2.1 开启WSL功能这里就埋了第一个坑官方文档告诉你在PowerShell里执行一条wsl --install就能装好但实际上这要求你的系统版本比较新。Win10企业版、长期服务版LTSC这类系统很可能连WSL功能都没默认开放。我的排查路径是这样的先确认系统版本winver。如果版本较老需要手动开启两个Windows功能控制面板 - 程序和功能 - 启用或关闭Windows功能 - 勾选“适用于Linux的Windows子系统”和“虚拟机平台”。重启电脑。再以管理员身份打开PowerShell执行wsl --install -d Ubuntu。这里有个容易被忽略的点wsl --install这条命令在较新的Windows上会自动开启所需功能并下载发行版但如果你用的是Win10老版本它可能只帮你安装WSL应用不会自动启用“虚拟机平台”。所以先手动检查两个功能是否勾选能省掉后面很多奇怪报错。2.2 安装太慢怎么办--web-download 与手动安装我踩的第一个大坑就是wsl --install -d Ubuntu卡在“正在安装: Ubuntu”进度条半天不动甚至等了一个小时还在转。热词里“wsl --install 太慢”“wsl安装速度慢解决方法”基本都是这个原因。后来我试出来的方案有两种亲测有效方案一强制走网页下载通道。执行命令时加一个--web-download参数wsl --install -d Ubuntu --web-download这个参数的意思是让WSL直接从微软的网页分发服务下载发行版包而不是尝试走Microsoft Store的安装流程。很多人反映加了参数之后速度快了一大截。方案二手动下载发行版安装包。如果连--web-download都慢那就去微软官方的WSL发行版列表页面找到Ubuntu对应的.appx或.msixbundle文件用浏览器下载浏览器下载通常比命令行稳定然后执行Add-AppxPackage .\Ubuntu.appx装完之后开始菜单里会出现Ubuntu图标点击即可初始化。提示Windows 10 上如果提示“无法安装此应用包”多半是因为系统版本过低需要更新系统或者用后面的离线导入方案。2.3 离线安装Ubuntu没有商店照样装如果你在的公司内网限制多或者Microsoft Store根本打不开又或者你不想用商店版本那离线安装就是最靠谱的方案。这种方式对应热词里的“ubuntu22.04 wsl离线包”“wsl离线安装ubuntu”。第一步准备rootfs包。可以从Ubuntu官方镜像站下载WSL专用rootfs压缩包也可以从网上下载别人打包好的Ubuntu WSL应用包。我使用的是从官方源下载的ubuntu-22.04-minimal-rootfs.tar.gz。第二步在Windows下解压或者直接用wsl --import导入wsl --import Ubuntu-DIY D:\WSL\Ubuntu-DIY D:\Downloads\ubuntu-22.04-minimal-rootfs.tar.gz --version 2这个命令的意思是把rootfs导入为一个名为“Ubuntu-DIY”的WSL发行版安装到D:\WSL\Ubuntu-DIY目录并指定使用WSL2。第三步进入系统wsl -d Ubuntu-DIY注意用--import导入的发行版默认是以root用户登录的。如果你想恢复成普通用户需要手动配置一下。在WSL里面编辑/etc/wsl.conf[user] default你的用户名保存后执行wsl --shutdown再重新进入就会切换到指定用户。这个方法同样适用于想装CentOS、Debian等其他发行版的情况。网上常有人问“wsl centos8怎么装”其实思路一模一样找到对应发行版的rootfs包然后wsl --import一把梭。2.4 安装后的初始化换源和基础包不管你用哪种方式装好Ubuntu第一件事永远是更新软件源。我实测下来默认源在拉取软件包时速度非常不稳定有时候一个apt update都能卡到怀疑人生。所以我会在装好之后立刻换成国内镜像源。Ubuntu 22.04及以下版本直接改/etc/apt/sources.listsudo sed -i s//.*archive.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list sudo apt update sudo apt upgrade -yUbuntu 24.04开始软件源配置改成了/etc/apt/sources.list.d/ubuntu.sources文件格式不太一样。我建议直接用文本编辑器打开那个文件把里面的http://archive.ubuntu.com/ubuntu/之类的地址替换成镜像地址。顺便把基础工具装一遍后面用得到sudo apt install -y build-essential git python3-pip vim net-tools这套组合拳打完一个能用的WSL环境才算真正落地。可我的折腾还没结束因为接下来升级WSL核心组件的时候又踩了大坑。3. 升级与配置让WSL从“能用”到“好用”3.1 版本过旧报错wsl --update 救不回来装好Ubuntu之后我兴冲冲地在Windows终端里输入wsl结果直接弹出来一行字your version of windows subsystem for linux (wsl) is too old. run the command wsl --update。这句话的意思是你机器上的WSL核心组件版本太旧需要更新。这个报错在Win10上尤其常见因为商店里的WSL应用版本可能跟系统不完全匹配。官方建议的运行wsl --update我在第一时间照做了结果又掉进另一个坑——更新请求被拒提示403。这个我们下一节说。先说正常情况下的解决思路用管理员身份打开PowerShell。执行wsl --update。执行wsl --version确认版本号。如果wsl --version显示的是旧版本或者提示命令不存在说明WSL应用本身就没装新需要去商店或者GitHub手动安装。值得注意的是新版WSL已经变成了一个商店应用更新逻辑由MSIX包管理。如果你的系统是Win10可能因为缺少某些更新组件导致wsl --update一直失败这时候就不得不走手动安装的路。3.2 wsl --update 403去GitHub手动装wsl --update 已禁止(403)是我这两天遇到的最让人崩溃的报错之一。403不是系统错误通常是网络请求被拒绝。WSL更新要从微软的CDN下载新版本如果你的网络环境访问这个CDN不稳定就会看到403。我的经验是与其跟它较劲不如直接去GitHub上微软的WSL仓库microsoft/WSL下载最新的.msi安装包。具体步骤打开浏览器访问github.com/microsoft/WSL/releases。找到最新release下载wsl.2.x.x.x64.msi文件。双击安装安装过程中会让你确认是否替换旧版WSL组件。安装完成后重启终端执行wsl --version验证。这个方案一是绕开了可能出问题的CDN二是GitHub的Release下载在多数网络环境下都比较稳定。装上之后WSL版本直接拉到最新之前报的too old问题和403问题一并解决。注意安装MSI包时如果提示“Windows无法安装”可能是权限不够或者旧版本没卸载干净。建议先执行wsl --shutdown再以管理员身份运行MSI安装包。3.3 修改WSL安装路径C盘空间告急时的救命招商店安装的Ubuntu默认会放在C:\Users\用户名\AppData\Local\Packages\下面对于一块256G的系统盘来说Ubuntu的ext4.vhdx虚拟磁盘文件会以肉眼可见的速度膨胀。装几个开发库、拉几个镜像轻松突破20G。C盘变红之后我才想起要迁移路径这时候就要用WSL自带的导出导入功能。第一步查看当前发行版名字。wsl -l -v第二步导出为tar包到D盘。wsl --export Ubuntu D:\backup\ubuntu.tar这一步会生成一个完整的发行版快照。我实际导出的系统大概20G压缩成tar之后反而变小了大概8G左右等了十分钟左右。第三步注销原来的发行版。wsl --unregister Ubuntu这一步会删除原发行版对应的文件C盘空间立刻释放。执行前务必确认已经导出成功否则数据直接没了。第四步导入到新目录并指定使用WSL2。wsl --import Ubuntu D:\WSL\Ubuntu D:\backup\ubuntu.tar --version 2第五步重新进入系统。wsl -d Ubuntu导入之后我又遇到了一个坑默认变成root用户了。解决办法前面提过改/etc/wsl.conf添加[user]段然后wsl --shutdown重启。3.4 内存和资源限制用 .wslconfig 管住这个“内存怪兽”WSL2本质是一个虚拟机默认情况下它会按照宿主机物理内存的一定比例分配资源。这么做的结果是如果你电脑是16G内存WSL2可能直接占掉8G甚至更多Windows这边就开始卡顿。热词里“wsl 内存配置”就是解决这个问题的。解决方案是在Windows用户目录下创建一个.wslconfig文件内容如下[wsl2] memory4GB processors4 swap8GB swapFileD:\\WSL\\swap.vhdx各参数的意思很直白限制WSL2最多使用4G内存、4个CPU核心交换分区最多8G交换文件放到D盘。保存之后执行wsl --shutdown再重新进入系统配置就会生效。查看配置是否生效可以进入WSL并执行free -h能看到总内存已经变成了4G。这段配置救了我的老笔记本Windows侧再也不会因为WSL2内存占用而卡死。如果你只是日常轻度使用WSL内存限制到2G-4G完全够用。4. 开发工具联动让WSL融入日常工作流4.1 VS Code WSL一行命令打开Linux工作区WSL装好之后如果不和编辑器联动用起来会很难受。VS Code在这方面做得非常丝滑核心是两个关键词一个叫code .命令一个叫 Remote - WSL 扩展。在WSL终端里进入你的项目目录然后执行code .VS Code会自动识别到这是一个WSL远程工作区窗口左下角会出现一个类似WSL: Ubuntu的绿色标识。这时候你在VS Code里打开终端直接就是Linux shell打开文件直接操作Linux文件系统调试代码走的也是Linux环境。这里有个经典坑VS Code的扩展有“本地安装”和“在WSL中安装”的区别。比如Python插件、Pylance这类和解释器强绑定的插件必须选择“在WSL中安装”否则VS Code找不到WSL里的Python环境。第一次执行code .时VS Code会自动在WSL中下载一个server组件。如果网络不好这一步可能会卡住。我的经验是多等一会儿别急着关窗口实在卡住了再执行一次code .重试。4.2 PyCharm中使用WSL conda环境如果你更习惯JetBrains系编辑器问题也不大。PyCharm对WSL的支持一直在进步尤其是想在WSL里用conda环境跑深度学习训练时这个功能特别香。步骤大概是在WSL里安装Miniconda或Miniforgewget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装完成后在WSL里创建你的conda环境。打开PyCharmFile - Settings - Project - Python Interpreter - Add Interpreter - WSL。选择WSL发行版然后指定Python解释器路径。一般在/home/你的用户名/miniconda3/envs/环境名/bin/python。路径映射层面PyCharm会自动处理好Windows路径和WSL路径的转换。如果你需要在PyCharm的Terminal里直接用WSLWindows侧能访问的路径格式是\\wsl$\Ubuntu\home\用户名\...。有一点要注意PyCharm连接WSL时需要Windows防火墙放行WSL的虚拟网络通信。如果遇到连接超时先检查防火墙。4.3 Docker Desktop WSL2别把Docker装到WSL里这是很多人绕弯子的地方。我当时想在WSL里直接apt install docker.io然后手动启动dockerd结果遇到各种systemd缺失、iptables权限问题。后来才想明白在Windows上用Docker最舒服的方式是装Docker Desktop让它基于WSL2后端运行。Docker Desktop的安装流程一般是安装Docker Desktop - 设置里勾选“Use WSL 2 based engine” - 选择要集成的WSL发行版。集成完成后你在WSL终端里执行docker ps就能直接使用Docker命令因为Docker Desktop会把Docker CLI接入到WSL的PATH中。这个方案有个好处Docker镜像和容器都放在Docker Desktop管理的WSL发行版里不在你手动的Ubuntu发行版里互不干扰。也正因如此Docker Desktop占用的磁盘空间不会挤占你自己WSL发行版的C盘配额。如果遇到热词里那个“docker desktop there was a problem with wsl”的报错我的排查顺序是执行wsl --shutdown重启WSL服务。确认wsl -l -v中Ubuntu的STATE是Running而不是Stopped。升级WSL核心组件参考3.2手动安装MSI。重新启动Docker Desktop。这套操作下来绝大多数问题都能解决。5. WSL里的实用工具部署从binwalk到CUDA5.1 在WSL中使用binwalk回到我最初装WSL的动机——用binwalk拆固件。在WSL里装binwalk非常简单sudo apt update sudo apt install -y binwalk安装完成后用起来和原生Linux没有任何区别。比如我想提取一个固件包里的文件系统binwalk -Me firmware.bin-M表示递归提取-e表示自动提取识别到的文件。拆出来的内容会放在_firmware.bin.extracted目录下。对于需要经常分析路由器固件、IoT设备固件的人来说这条命令的使用频率极高。补充一点如果binwalk提示缺少某些文件依赖可以先sudo apt install -y mtd-utils gzip bzip2 tar unzip之类把常见的压缩格式支持装齐。5.2 在WSL里装Redis和其他常用服务很多时候把WSL当开发服务器用临时起一个Redis、MySQL比开一堆Docker容器更轻量。热词里“redis安装教程wsl”就是这么来的。我在WSL里安装Redis的过程sudo apt install -y redis-server sudo service redis-server start redis-cli ping如果返回PONG说明Redis已经跑起来了。这里又牵扯到一个经典问题WSL默认不启动systemd所以你会发现在WSL里systemctl命令用不了只能通过service命令管理服务。如果实在想用systemctl新版WSL支持在/etc/wsl.conf里开启[boot] systemdtrue然后执行wsl --shutdown重进系统systemd就生效了。开启后Redis、Docker这些服务都可以用systemctl start redis-server这种方式管理。不过我的建议是如果是日常开发测试用service就够了开systemd会拖慢启动速度还会增加资源占用。5.3 深度学习环境与CUDAWSL2的GPU加速热词里“wsl安装cuda”搜索量一直不低因为现在很多AI相关的工具链像热词里提到的某些分布式训练框架、视觉模型部署工具都要求Linux环境。WSL2支持GPU直通让Windows用户也有了折腾深度学习的可能。先说结论你不需要在WSL里额外安装NVIDIA驱动只需要在Windows侧装好支持WSL2的NVIDIA驱动WSL2里就可以直接通过CUDA调用GPU。判断你的驱动支持情况可以在WSL终端里执行nvidia-smi如果能看到显卡信息说明GPU已经映射进来了。接下来安装CUDA Toolkit。我的做法是去NVIDIA官网下载WSL-Ubuntu对应的runfile安装包然后执行wget https://developer.download.nvidia.com/compute/cuda/xx.x.x/local_installers/cuda_xx.x.x_linux.run sudo sh cuda_xx.x.x_linux.run安装过程会提示是否安装显卡驱动这里一定要取消勾选只装Toolkit和对应的CUDA工具链。装完之后设置环境变量echo export PATH/usr/local/cuda/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc最后执行nvcc --version验证安装。这套环境配好之后PyTorch、TensorFlow都能在WSL里正常用GPU跑。WSL2对GPU的支持已经相当成熟至少对我这种轻度炼丹用户来说体验和原生Linux差别不大。6. 常见报错排查速查表这两天的经历让我攒了一堆报错信息我整理了一张速查表遇到问题直接按图索骥比搜索引擎好用现象/报错可能原因解决方案wsl --install -d Ubuntu一直停在“正在安装”网络访问Microsoft Store或CDN不稳定加--web-download参数重新安装或手动下载appx/msixbundle后Add-AppxPackage安装wsl/installdistro/wininet_e_timeout下载发行版包超时换用wsl --web-download或手动下载rootfs包后wsl --import导入your version of windows subsystem for linux (wsl) is too oldWSL核心组件版本过旧管理员PowerShell执行wsl --update失败则去GitHub microsoft/WSL Releases下载最新MSI手动安装wsl --update 已禁止(403)CDN访问受限或代理干扰改用GitHub Release的MSI手动安装Docker Desktop显示there was a problem with wslWSL服务异常或版本过旧wsl --shutdown后重启升级WSL组件确认wsl -l -v状态正常MATLAB识别不到WSLWindows侧调用wsl命令时环境变量未生效或WSL未正确注册在Windows终端执行wsl -l -v确认发行版存在检查Windows PATH是否包含WSL相关组件必要时重新注册发行版wsl -d Ubuntu -u root想以root身份进入某个发行版这是WSL内置参数-u root指定用户直接使用即可WSL占用内存过高WSL2默认按比例占用宿主机内存在C:\Users\用户名\.wslconfig中设置memory、processors、swap后wsl --shutdown重启发行版装在C盘导致空间不足商店版WSL默认安装在C盘wsl --export导出 -wsl --unregister注销 -wsl --import导入到D盘WSL内systemctl无法使用WSL默认不启用systemd在/etc/wsl.conf添加[boot] systemdtrue后wsl --shutdown重进这张表里的每一条我都是实际踩过坑之后才整理出来的。尤其是403和wininet_e_timeout这两个几乎每个刚接触WSL的人都会碰到建议优先收藏。除了上面这些还有两个容易忽略的细节时区问题。如果执行date发现时间和Windows对不上运行sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime网络代理问题。WSL的DNS解析偶尔会抽风导致apt和git都连不上。如果遇到git clone卡住可以检查WSL里的DNS配置修改/etc/resolv.conf或使用镜像地址下载。我个人在实际操作中的体会是安装WSL其实并不难难的是在报错面前保持清醒一条条判断问题出在网络层、系统层还是配置层。很多人卡在第一步就放弃了但只要你愿意多试几个方案WSL这套环境最终一定能跑起来。最后再分享一个小技巧如果你不确定某个命令会带来什么后果在WSL里先用wsl --shutdown关闭所有实例再回到Windows端检查文件状态。WSL的虚拟磁盘文件ext4.vhdx在运行中是不能安全拷贝的但关机之后随便备份。这个习惯能帮你避免很多数据丢失的惨剧。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进