Windows下WSL2安装Linux系统完整教程:原理、排错与调优

发布时间:2026/10/4 8:16:31
Windows下WSL2安装Linux系统完整教程:原理、排错与调优
Linux | 在Windows下基于WSL2的Linux系统安装教程很多做开发的同学都会遇到一个尴尬场景日常办公、聊天、写文档都在Windows上但真要跑点什么服务端的东西——Redis、Nginx、Docker、编译脚本——Windows上装起来总是别扭。以前我都是开虚拟机VirtualBox加个大镜像启动慢、占内存、文件共享还麻烦。后来换到WSL2Windows Subsystem for Linux 2之后这个痛点基本消失了真正在Hyper-V虚拟机里跑一个完整Linux内核但你日常操作又感觉像是在用Windows的一个普通应用启动快、集成好、能用VSCode直接连进去改代码。这篇内容就是分享我在Windows下从零折腾WSL2的完整过程包括安装思路、踩过的坑、高频报错的排查链路以及把发行版迁移到D盘、配合Docker Desktop使用的经验适合刚开始接触Linux、想在Windows上跑Linux环境、或者对WSL2有了解但卡在某一步装不过去的同学参考。1. 先搞清楚WSL2是什么再决定要不要装WSL2这几年在Windows开发圈子里很火但很多人其实没搞明白它和传统虚拟机、和WSL1到底有什么区别。我先把这个底层逻辑说透因为理解了原理后面遇到问题你才知道往哪个方向查。1.1 WSL1和WSL2的本质差异WSL1严格来说不算一个真正的Linux系统它是一个翻译层把Linux的系统调用翻译成Windows的系统调用所以它启动快、文件系统直接挂载Windows目录性能也很高。但问题在于翻译层总有覆盖不到的地方很多依赖完整内核特性的软件比如Docker、需要内核模块的应用在WSL1里跑不起来。WSL2则完全不同。它内置了一个轻量级虚拟机跑的是真正的Linux内核系统调用完全原生。正因为有了完整的Linux内核Docker Desktop可以直接把后端跑在WSL2里顺带解决了以前Docker Toolbox基于VirtualBox的那种笨重体验。两者的对比如下对比项WSL1WSL2Linux内核无系统调用翻译完整独立内核启动速度极快毫秒级较快秒级文件系统性能跨系统操作性能好原生Linux文件系统快跨系统访问慢兼容性部分系统调用不兼容接近真实Linux环境支持Docker不友好支持良好一句话总结如果你想在Windows上获得一个接近于真实服务器的Linux环境直接选WSL2如果只是跑几个简单的Linux命令或脚本WSL1的轻量感会更舒服但考虑到Docker和后续扩展我还是推荐一步到位上WSL2。1.2 哪些场景适合用WSL2从我自己的实践来看WSL2最适合下面这几类场景学Linux不用装虚拟机不用双系统Windows下直接敲Linux命令不怕把电脑搞坏。跑服务端软件Nginx、MySQL、Redis、Elasticsearch一个WSL2全搞定配置文件改起来和服务器上一模一样。开发Linux部署脚本本地验证Shell脚本、systemd服务文件写完了直接推到生产服务器行为基本一致。配合Docker DesktopDocker Desktop的WSL2后端减少了虚拟机开销性能比Hyper-V模式更稳。嵌入式网络设备模拟比如ensp等网络模拟工具里需要Linux环境做后端时WSL2也常被拿来当替身。当然WSL2也不是万能的。如果你需要图形界面的完整Linux桌面、需要大量跨系统文件共享、或者需要直接操作USB串口设备那要么用完整虚拟机要么考虑双系统。WSL2对串口直通的支持比较弱这是它的物理瓶颈。2. 安装前要确认的硬件与系统开关我见过太多人装到一半卡住最后发现是BIOS没开虚拟化或者Windows功能没启用。所以这一步别跳过花三分钟确认好后面会省很多事。2.1 虚拟化是否开启WSL2本质是虚拟机所以CPU虚拟化是硬前提。检查方法很简单打开任务管理器切到性能标签点CPU看右下角虚拟化这一项。如果显示已启用说明BIOS层面的虚拟化已经开了。如果显示已禁用需要进BIOS设置里找Intel VT-x或AMD-V/SVM选项一般路径是Advanced → CPU Configuration把对应选项改成Enabled保存重启。不同品牌主板菜单名字不完全一样但基本都是VT-x、VT-d、SVM这几个词注意别开错开VT-x或SVM就行。2.2 Windows版本与旧版离线安装方案WSL2对系统版本有硬性要求Windows 11所有版本都支持。Windows 10版本号必须是2004build 19041及以上或者升级到21H2、22H2。如果你用的是Windows 10老版本、或者办公电脑上有IT管控没法随意联网也还有一条离线安装的路先到微软官网下载WSL2内核更新包wsl_update_x64.msi再手动启用两个Windows功能这个方法我后面会拆开细讲适合内网环境的同学。查看Windows版本号的方法WinR输入winver回车在弹出的窗口里看版本号。低于19041的话建议先系统更新不要直接闷头装否则内核包装不上。2.3 启用虚拟化平台与WSL功能旧版系统手动安装的核心是手动开启两个Windows功能一个是适用于Linux的Windows子系统也就是WSL本体另一个是虚拟机平台VirtualMachinePlatform。这两个功能缺一个WSL2都跑不起来。以管理员身份打开PowerShell依次执行下面两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一条装的是WSL功能第二条装的是虚拟机平台组件。命令执行完会提示重启重启后再继续下一步。有一点要注意即便安装完成了如果不手动把默认版本设置为WSL2新旧系统可能会默认用WSL1。执行下面这条命令把默认版本固定下来wsl --set-default-version 2如果这一步提示找不到WSL或内核版本过旧说明系统版本不满足19245要求或者内核更新包还没装。内核更新包是一个MSI安装包双击装完就行这一步经常被忽略却是WSL2能否真正跑起来的关键。3. 完整安装流程从wsl --install到进入Ubuntu环境确认完虚拟化和系统版本之后就可以正式安装了。我分两种路径讲一种是新版本Windows上最简单的命令流玩法另一种是适合下载慢、网络不稳场景下的手动部署方案。3.1 新版本Windows的一行命令玩法如果你的Windows 10或11版本足够新Win11是确定的Win10推荐升到22H2那么安装WSL2已经被微软简化到一条命令搞定。管理员PowerShell里输入wsl --install这条命令会自动完成三件事安装WSL2所需功能、下载并安装最新内核、设置默认版本为WSL2。如果之前系统里没有任何Linux发行版它还会顺手帮你装一个默认的Ubuntu。装完重启后可以用下面的命令看可用的发行版列表wsl --list --online输出里会列出Ubuntu各个版本、Debian、Kali Linux等。想指定安装某个版本比如装Ubuntu 22.04就执行wsl --install -d Ubuntu-22.04如果你想装24.04就把后面的名字改成Ubuntu-24.04。看到正在下载的进度条后等几分钟就可以下载速度取决于你的网络环境如果卡住或极慢就转到3.2的手动方案。3.2 手动下载安装Ubuntu 22.04/24.04的完整步骤wsl --install虽然简单但我实测在很多网络环境下会卡在下载阶段半天不动。这种时候就别死磕命令行用手动流程一样能装完而且每一步都有反馈更容易定位问题。第一步启用功能。这个前面已经写过了就是那两条dism命令。第二步安装内核更新包。直接去微软官方文档里找WSL2内核更新包的链接下载wsl_update_x64.msi并双击安装。很多教程会跳过这步只让你执行dism和wsl --set-default-version实际上如果不装内核包后面启动发行版时会直接报The requested operation was unsuccessful或者提示WSL2的内核组件缺失。第三步下载Linux发行版安装包。有两个途径在Microsoft Store搜索Ubuntu 22.04.3 LTS或Ubuntu 24.04 LTS点安装。用wsl --import导入根文件系统。在微软的WSL文档中提供了各个发行版的appx/zip下载链接下载解压后用管理员PowerShell执行wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\path\to\ubuntu-22.04.tar.gz第一个参数是发行版名称自定义第二个参数是WSL发行版的存储位置第三个参数是下载好的tar.gz文件路径。用这种方式装的好处是可以从一开始就把系统放在非C盘避免C盘空间被撑爆。第四步启动发行版配置账号。安装完成后在开始菜单里点一下Ubuntu的图标或者执行wsl -d Ubuntu-22.04。第一次启动会提示设置UNIX用户名和密码。这个用户名不需要和Windows用户名一致建议起个简单好记的比如你自己的名字拼音或者缩写。创建完用户后这个用户默认在sudo组里可以用sudo执行管理员命令。3.3 初始化配置换源、创建用户、启用systemd装好一个裸Ubuntu只是第一步日常好用还得做三件小事情。第一件是换软件源。Ubuntu默认的apt源在国外下载软件包经常慢得让人头大。我习惯换成阿里云或清华的镜像源。操作方式很简单编辑/etc/apt/sources.listsudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt updateUbuntu 24.04之后的版本apt源配置改到了/etc/apt/sources.list.d/ubuntu.sources操作方式类似把URL从archive.ubuntu.com替换成mirrors.aliyun.com即可。如果用的是纯deb822格式直接编辑那个.sources文件替换URL一样生效。换完源再跑一次sudo apt update速度会明显快很多。第二件是启用systemd。WSL2默认在较新版本上已经能支持systemd了但需要手动开启。用文本编辑器打开/etc/wsl.conf如果没有就新建一个写入[boot] systemdtrue然后在Windows的PowerShell里执行wsl --shutdown重新进入WSL2后执行systemctl status验证。能看到systemd在正常工作后面你装的服务才能用systemctl管理。第三件是统一时区和语言环境。执行sudo timedatectl set-timezone Asia/Shanghai sudo update-locale LANGen_US.UTF-8这两个配置能避免后面跑一些脚本时因为时区字符串不对而报错。4. 排错比安装更重要五个高频踩坑现场与定位思路WSL2的安装流程在文档里看起来顺风顺水真正动手时总会在某个角落出意外。下面是我安装和使用WSL2过程中遇到的、以及身边同事常问的五个高频问题每个都附上完整排查链路。4.1 wsl --install卡住、下载慢的处理链路症状执行wsl --install后进度条停在正在下载或正在安装半天不动或者直接报超时错误。排查链路先看是卡在下载内核包还是卡在下载发行版。按CtrlC中断后手动执行wsl --update看单独更新内核是否正常。如果wsl --update也卡基本可以断定是网络问题导致对微软的下载端点连接不稳定。处理办法有两条路。一是加上--web-download参数重新执行wsl --install -d Ubuntu-22.04 --web-download这个参数会改用直接从网络下载的模式有时候能绕过缓存里的坏文件。二是干脆放弃自动安装手动下载内核MSI包和发行版appx或tar.gz文件按3.2的步骤走。我推荐第二条因为手动步骤每一步都有明确反馈你永远知道卡在哪一步。4.2 Docker报错error: start the windows daemon from a non-elevated terminal我在Windows上装了Docker Desktop后端选了WSL2模式后在终端里跑docker pull时忽然跳出这条错误error during connect... error: start the windows daemon from a non-elevated terminal; shared clients.先说结论这个报错的直接含义是你当前终端是以管理员权限打开的但Docker Desktop运行在普通用户权限Docker的Windows服务无法被管理员终端访问到。Docker Desktop设计上推荐从普通权限的终端里操作否则客户端和守护进程之间权限不匹配。处理链路关闭所有管理员权限的PowerShell或CMD窗口。打开一个普通权限的终端执行docker version验证能不能正常连接。如果仍然报错直接退出Docker Desktop然后以非管理员身份重新启动Docker Desktop等右下角鲸鱼图标稳定后重试。如果还有问题去Docker Desktop的Settings → Resources → WSL Integration确认你要用的发行版比如Ubuntu-22.04后面的开关已经打开然后点Apply Restart。这个报错很容易让人误以为WSL2本身出问题实际上Docker Desktop配置的锅占大多数。以后跑Docker命令记住一个原则普通终端干活别随便用管理员终端。4.3 系统盘空间不足把WSL2迁移到D盘WSL2默认把发行版镜像存在C盘路径在%LOCALAPPDATA%\Packages下面一个装完常用开发环境的Ubuntu轻松吃掉二三十个G。C盘紧张是迟早的事所以我强烈建议一上来就把发行版放到其他盘。迁移的核心思路是导出→注销→导入。wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu-22.04.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-backup\ubuntu-22.04.tar注意wsl --unregister会把原发行版的数据全部删除所以务必确保前一步导出成功且导出的tar文件大小正常。导入完成后默认登录用户会变成root而且之前设置的用户信息需要重建。解决方法是进入WSL后改默认用户为之前的用户名在PowerShell里执行ubuntu2204.exe config --default-user 你的用户名你需要找到发行版对应的exe来执行这个命令一般安装后会在开始菜单或WindowsApps目录里。如果嫌麻烦也可以修改/etc/wsl.conf[user] default你的用户名保存后执行wsl --shutdown再重进同样生效。4.4 内核缺失/过旧导致的WSL2无法启动问题症状启动WSL发行版时直接提示WSL2 requires an update to its kernel component或者退出码显示0xffffffff。这个基本就是内核更新包没装或版本太老。处理方式很直接去微软官网把最新的WSL2内核更新MSI包下载下来双击安装然后重启Windows再执行wsl --set-default-version 2重新进发行版。如果你系统版本比较老比如Windows 10 1903那是真的没救只能升级系统。别在小版本上浪费时间WSL2对内核的支持和系统版本强绑定。4.5 其他容易忽略的小坑wsl --set-default-version 2后新建的发行版默认是WSL2但已有发行版需要在PowerShell里单独切换wsl --set-version Ubuntu-22.04 2Windows Terminal里执行wsl时会继承Windows的环境变量导致Linux里执行某些命令比如npm、python时找错可执行文件。解决办法是在WSL的~/.bashrc里把Windows路径从$PATH中过滤掉或者安装完Linux版本的Node、Python后确认which指向的是Linux路径。如果公司办公网络有额外的网关策略导致WSL2的DNS解析异常表现为apt update时无法解析域名。可以在/etc/resolv.conf里临时指定DNS服务器或者检查Windows的Internet连接共享设定。正常情况下WSL2会自动继承Windows的DNS配置如果被公司网络策略覆盖文件里会看到一堆奇怪的内容先写成nameserver 223.5.5.5试试。5. 日常使用与性能调优的实战建议装好WSL2只是开始日常使用里有很多配置能决定体验优劣。我从性能、内存、跨系统协作三个维度说说我自己的调优方案。5.1 文件跨系统访问的性能红线WSL2里访问Windows文件系统和Windows里访问WSL文件系统性能差距非常大。WSL2访问/mnt/c下的文件是通过9P协议转发过去的跑大量小文件操作时明显卡顿反过来在Windows里通过\\wsl$\Ubuntu-22.04\home\xxx访问Linux侧文件速度还可以但也不如Linux内部操作快。所以我的红线就一条代码和项目文件尽量放在Linux文件系统内也就是/home/用户名目录下Windows侧只保留浏览器和办公文件。开发时用VSCode的Remote-WSL插件打开Linux侧目录VSCode会自动启用WSL后端编译和格式化都在Linux环境里跑体验和SSH远程开发几乎一样。千万别把项目文件放到/mnt/c下面再硬撑着开发跑个npm install能慢到让你怀疑人生。5.2 内存与CPU限制配置WSL2基于Hyper-V默认会动态占用Window内存且对内存上限没有硬限制。默认配置下WSL2最多能用Windows总内存的50%我的32GB机器还好但8GB内存的机器同时跑Windows WSL2很容易卡死。解决方案是在Windows用户目录下新建一个.wslconfig文件[wsl2] memory6GB processors4 swap8GB localhostForwardingtruememory限制WSL2最大内存processors限制可用CPU核数swap是Linux虚拟内存大小。改完之后在PowerShell里执行wsl --shutdown重启WSL2生效。需要注意的是memory设太小时跑大型编译或Docker镜像构建会OOM公式其实很简单Windows本身留4~6G浏览器开一堆标签页再留2~3G剩下的均匀给WSL2就行。我实际测试下来16GB机器设6~8GB比较均衡。5.3 与Docker Desktop协同、OpenSSH、常用命令备忘最后一个建议是把WSL2当你的主力Linux工作台来配置。我目前的工作环境是这样的Docker Desktop安装在Windows侧后端选WSL2模式WSL Integration里只勾选Ubuntu-22.04。这样Linux侧直接就能用docker命令不需要在Ubuntu里再装一套Docker Engine避免了两套守护进程抢配置的问题。SSH远程Windows上一般自带OpenSSH Server但WSL2里的sshd是独立的。如果你只想从局域网其他机器连到Linux环境更推荐直接在Windows上开启OpenSSH Server然后用wsl -d Ubuntu-22.04作为宿主要求的shell这样能绕开WSL2 NAT网络模式下的端口转发问题。如果你实在要直接在WSL2里跑sshd记得Windows侧用netsh interface portproxy做端口转发否则外部访问不到。常用命令热身刚入门Linux的先把ls、cd、grep、find、tar、apt、systemctl、ssh这八个命令练熟日常开发就基本不卡壳了。想要更进一步再学一下vim基本操作和bash脚本基础。从我这几个月的体验来说WSL2最舒服的地方在于它保留了Windows的图形界面和鼠标操作又把Linux那套命令行工作流无缝嵌进来不需要来回切换虚拟机窗口C盘也不会被厚重镜像撑爆。当然资源占用和网络转发这些限制依然存在真正跑重负载时一台原生Linux机器永远是更靠谱的选择。但对于绝大多数人来说WSL2已经足够了。最后再分享一个小技巧如果你经常用WSL2跑后台服务可以在Windows上创建一个计划任务开机自动执行wsl -d Ubuntu-22.04 -u root -e service docker start这样Docker服务会跟着Windows启动省得每次手动进WSL2敲启动命令。Linux下的开发环境越自动化越省心。