十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL2从零到上手:安装配置、踩坑复盘与开发环境优化指南

WSL2从零到上手:安装配置、踩坑复盘与开发环境优化指南 我第一次决定认真用WSL2是被虚拟机逼疯了之后的事。当时项目需要Linux环境我开了VMware一台4核8G的笔记本瞬间卡成PPT想从Windows往虚拟机里拖一份大文件十分钟都没复制完。后来朋友甩给我一句“你试试WSL2呗”我就从Windows功能开关开始一路摸爬滚打装好Ubuntu 20.04的那一刻真有“原来Linux环境可以这么顺滑”的感觉。这篇内容就是我当年完整安装过程的重写版既面向准备从零装WSL2的朋友也覆盖已经装好但总出各种奇怪问题的情况。无论你是看懂了想开整还是已经在踩坑等着捞人都可以对照着一路看下来。1. WSL2为什么值得装和虚拟机、双系统对比后你会有结论1.1 三种Linux环境的日常体验对比我在推荐别人用WSL2之前都会先让他们看一张对比表。很多人不是不想用Linux是被“装系统”这件事劝退了其实WSL2跟传统方案完全是两码事。对比项WSL2虚拟机VMware/VirtualBox双系统启动速度秒级随Windows一起可用30秒到几分钟每次要重启切换内存占用动态分配可设上限固定占用几个GB独立系统占用磁盘占用几个GB起步随用随长通常需要预留几十GB需要独立分区图形界面Win11支持GUI日常够用完整桌面环境完整桌面环境与Windows文件互访直接在Linux里访问/mnt/c需要通过共享文件夹需要挂载分区很麻烦网络模式NAT与Windows共享网络NAT或桥接可选独立网卡对开发者的核心价值终端、服务、脚本无缝使用完整隔离测试重度本地计算从这张表能看出来WSL2名字里虽然带个“W”Windows但它本质上就是跑在Windows上的轻量级Linux环境日常开发中绝大部分命令、脚本、服务都跟原生Linux一致而且和Windows共存得特别好。1.2 WSL1和WSL2的本质差异装WSL的时候很多人会被WSL1和WSL2搞晕。简单说WSL1没有真正的Linux内核它靠一个翻译层把Linux的系统调用转换成Windows的系统调用好处是启动极快、资源占用极低但坏处也很明显——只要碰到翻译层覆盖不到的系统调用程序就会报错。WSL2则完全不同它是在微软的虚拟化平台上跑一个真实的Linux内核系统调用是完整兼容的。你在WSL2里用Docker、跑内核模块、装需要内核特性的软件基本都不会有“翻译不出来”的尴尬。代价就是它本质是个虚拟机需要开启硬件虚拟化也会占用一部分内存和磁盘。这里有个特别反直觉的点WSL2的整体磁盘性能比WSL1强很多因为WSL1访问Linux文件还得经过Windows文件系统那套逻辑。但如果你在WSL2里直接去访问Windows盘符下的文件比如/mnt/c/Users/...速度反而会慢得让你抓狂具体原因我在后面“坑一”里会展开说。1.3 什么样的电脑适合WSL2先说结论绝大多数Windows开发机都适合。只要你的CPU支持硬件虚拟化近十年的Intel和AMD基本都支持内存不低于8G磁盘剩余空间至少有20G就完全够用。不过有三类情况我会劝退你需要一整套完整Linux桌面来取代Windows日常使用那直接装双系统更省心。你需要在隔离环境里测病毒、做系统级破坏性实验那虚拟机更合适。你的Windows版本太老比如还停在Win7或早期Win10那升级系统之前尽量别折腾WSL装了也会被各种兼容问题劝退。我个人的选型建议是主力日常开发、学习Linux命令、跑服务、搭环境无脑选WSL2有GPU训练深度学习任务WSL2配上CUDA也能胜任真要拿Linux当唯一系统用了再考虑双系统。这样至少你不用因为写两行命令就来回重启电脑。2. 装之前先检查三件事版本、虚拟化和系统功能2.1 先确认Windows版本很多WSL2安装失败的根因根本不是操作问题而是Windows版本太旧。按Win R输入winver回车会弹出一个“关于Windows”的窗口。这里看两个信息一个是系统版本号比如“Windows 10 专业版”另一个是“版本”后面那串数字比如22H2。WSL2要求Windows 10 2004及以上也就是Build 19041及以上Windows 11全系都没问题。如果你的版本低于这个线我的建议是先把Windows更新到最新再继续安装。千万别抱着“我就试试旧版本先将就”的心态后面会遇到无数跟“虚拟机平台”相关的报错排查起来非常痛苦。2.2 硬件虚拟化到底开没开这一步是WSL2能不能跑起来的硬门槛。Windows自带的systeminfo命令就能查systeminfo在输出结果末尾找“Hyper-V 要求”这一项。如果显示“已检测到虚拟机监控程序”说明虚拟化已经开启可以直接往下走。如果显示“将在启用Hyper-V后使用”或者干脆提示检测不到那就是BIOS里没开虚拟化。还有一个更简洁的PowerShell命令(Get-CimInstance Win32_ComputerSystem).HypervisorPresent返回True就说明虚拟化就绪返回False就需要进BIOS。开机时按Del、F2或F10进入BIOS设置不同主板入口不一样找到“Intel Virtualization Technology”Intel平台或“AMD-V/SVM”AMD平台改成Enabled保存重启。这里有个高频误区任务管理器里的“性能”页签确实能看到“虚拟化已启用”但它显示的只是CPU虚拟化指令不完全是Hyper-V平台的状态。所以最靠谱的验证方式还是systeminfo。2.3 开启两个Windows功能WSL2依赖两个Windows功能一个是“适用于Linux的Windows子系统”另一个是“虚拟机平台”。两个都得开只开一个后面装完进系统时会报各种起不来的错。图形化操作是控制面板 - 程序 - 启用或关闭Windows功能弹出窗口里勾选“适用于Linux的Windows子系统”和“虚拟机平台”确定后重启。命令行操作更快用管理员身份打开PowerShell依次执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart两条命令跑完重启电脑。注意这里的/norestart只是让命令执行时不立即重启不代表不需要重启。改完功能必须重启一次让系统完成配置否则后续会莫名其妙地报“WSL无法启动”。我见过太多新手栽在这一步功能开了但没重启然后装Ubuntu时报0x80370102错误。这个错误码我后面也会专门讲其实根源就是虚拟化或者功能没就绪。3. 两条安装路线实测一键安装和手动安装我都帮你跑了3.1 路线Awsl --install 一键安装如果你的Windows版本够新最省事的方式是管理员身份打开PowerShell直接执行wsl --install这条命令会一次性完成三件事安装WSL组件、启动虚拟机平台、从微软商店拉取默认的Ubuntu发行版。正常情况下它会自动把WSL2设为默认版本不需要你再手工设置。如果你想指定装Ubuntu 20.04或22.04可以这样wsl --install -d Ubuntu-20.04或者wsl --install -d Ubuntu-22.04想先看看目前在线商店有哪些发行版可以选择可以执行wsl --list --online装完命令提示重启时重启电脑。然后在开始菜单里找到刚装好的Ubuntu图标比如“Ubuntu 20.04”第一次启动会提示你创建一个Linux用户名和密码。这个用户名不是Windows账号是Linux内的账户后面所有命令都以它来执行。实际跑下来你会发现路线A是真的“一键”但有个前提系统版本必须够新网络也得能正常连通微软商店。如果wsl --install报“无法使用管理员权限”重新用管理员身份开一次终端如果提示网络错误换一个能正常访问的WiFi再试。3.2 路线B拆开手动安装适合老系统和离线场景有些机器是LTSC版本没有微软商店或者公司网络禁了商店访问这时候就得走手动路线。第一步还是先把Windows功能开好参考2.3重启后管理员PowerShell里执行wsl --set-default-version 2这句话是把默认安装的发行版都切成WSL2模式。如果这里报错提示需要“Virtual Machine Platform”那就是功能没开完整回去再查一遍。第二步安装Ubuntu。有微软商店的话直接搜“Ubuntu 20.04”或“Ubuntu 22.04”点安装就行。没有商店的去微软官方下载对应的Linux发行版安装包appx或msixbundle格式在当前用户的PowerShell里用Add-AppxPackage安装操作也不复杂。装完在开始菜单里启动Ubuntu初始化和创建用户的过程跟路线A一样。这就有个很容易忽略的坑很多教程默认你走的是路线A安装完成后直接进入Ubuntu设置用户。但如果你是用wsl --install -d装的且商店里装了多个发行版默认登录的可能不是你刚装的那个。用wsl -l -v看一眼有哪些发行版在跑实在确认不了就用wsl -d Ubuntu-20.04指定进入。3.3 装完之后的版本核对Ubuntu装好后第一件事不是急着敲命令而是先确认自己到底在什么环境里。PowerShell里执行wsl -l -v输出类似NAME STATE VERSION * Ubuntu-20.04 Running 2VERSION列必须是2如果是1说明当前发行版还在WSL1模式下。手动转一下wsl --set-version Ubuntu-20.04 2转换过程可能耗时几分钟期间机器负载会明显升高别去关终端也别强制关机等它自然结束。进入Linux后也要看一眼系统版本cat /etc/os-releaseVERSION_ID20.04或VERSION_ID22.04就说明装对了版本。这一步能提前排查掉一种很常见的问题你想装20.04结果某个老教程的镜像或者商店版本偷偷给你装成了22.04甚至24.04后面的内核模块、CUDA版本可能都会对不上。3.4 装错了版本或者玩坏了怎么办如果装完发现版本不对或者环境被你搞坏了别急着重装Windows。WSL提供了很干净的卸载方式。wsl --unregister Ubuntu-20.04注意这条命令会把这个发行版的所有数据全部删除相当于格盘重来。所以如果你只是想修问题千万别手滑执行。想备份当前环境可以先用导出命令打包wsl --export Ubuntu-20.04 D:\backup\ubuntu2004.tar卸载或者重装后再导入wsl --import Ubuntu-20.04 D:\WSL\Ubuntu-20.04 D:\backup\ubuntu2004.tar --version 2import之后有个坑默认用户会变成root而不是你之前创建的普通用户。解决办法是在Linux内编辑/etc/wsl.conf[user] default你的用户名保存后执行wsl --shutdown再重进用户就回来了。4. 装完才是开始换源、建用户、中文环境和终端美化4.1 必须做的第一步换apt源Ubuntu默认的apt源指向官方服务器在国内环境下访问速度经常一言难尽几十KB/s是常态。换成国内镜像源之后速度能提升几十倍。Ubuntu 20.04代号focal和22.04代号jammy的源文件位置一样都是/etc/apt/sources.list。先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用vim或nano编辑或者直接用sed批量替换。以清华源为例20.04的完整内容如下deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse22.04就把focal全部换成jammydeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse用sed的话可以这样sudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i ssecurity.ubuntu.commirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list改完执行更新sudo apt update sudo apt upgrade -y顺手把基础工具装上sudo apt install -y build-essential git curl wget net-tools如果你的镜像源没问题apt update应该几秒钟就能跑完如果卡住或者报错先检查源文件是不是填错了版本代号。4.2 建一个自己的账号别一直用rootWSL第一次启动会让你创建用户这个操作是Ubuntu安装程序自动引导的。但如果你是导入的tar包或者在安装时直接跳过了用户创建那你会发现自己处于root账户下。长期用root不是好习惯权限管不住一个误操作可能把环境搞废。手动建一个账户很轻松sudo adduser yourname按提示设置密码剩下的信息都可以直接回车跳过。然后加入sudo组sudo usermod -aG sudo yourname如果你是从导入包恢复的默认用户是root需要改一下WSL默认登录用户。编辑/etc/wsl.conf[user] defaultyourname保存后执行wsl --shutdown退出重新进入Ubuntu默认用户名就是你的了。4.3 中文显示与字体WSL2本身没有图形界面终端里显示中文靠的是Windows终端的字体和字库。很多人刚装完Ubuntu在终端里ls一个中文文件名看到的是一堆方块或问号那不是系统坏了是Linux环境里缺中文字体和locale。装中文语言包和Noto CJK字体sudo apt install -y language-pack-zh-hans fonts-noto-cjk然后设置localesudo update-locale LANGzh_CN.UTF-8执行完退出WSL执行wsl --shutdown重进终端再echo $LANG看到zh_CN.UTF-8就对了。要提醒的是你Windows端显示中文没问题不代表WSL里就一定有中文字体这两个环境是隔离的。所以装了fonts-noto-cjk之后无论你是用终端看中文文件名还是后面跑图形界面的中文软件都不会再出现乱码。4.4 Windows Terminal VSCode Remote-WSL默认的黑框终端能跑命令但体验确实一般。我强烈建议装Windows Terminal它和WSL2是绝配。管理员PowerShell里安装winget install Microsoft.WindowsTerminal打开Windows Terminal点标题栏的箭头“∨”选择“设置”在“配置文件”里把刚装的Ubuntu设为默认配置文件这样每次打开终端直接进入Linux环境。再配合VSCode的Remote-WSL插件在WSL里随便进入一个目录code .VSCode会直接以远程WSL模式打开左侧的资源管理器、终端、运行调试全部走Linux环境。这个组合用起来几乎感觉不到Windows和Linux的边界日常开发效率比来回切换工具高出一大截。5. 五个高频坑的完整复盘每个都是我亲自踩过的5.1 坑一项目放在/mnt/c下编译文件慢到怀疑人生这个坑几乎每个WSL2用户都会遇到。你会习惯性地把项目放在Windows目录下比如/mnt/c/Users/xxx/project然后在WSL2里直接编译。结果就是代码量一大编译速度慢到让人怀疑电脑是不是老化了。原因在于WSL2访问Windows盘符走的是9P协议跨文件系统的IO开销非常大尤其在大量小文件读写场景下速度比Linux原生目录能差一个数量级。这不是WSL2本身慢而是跨系统访问的天花板。解决方式很简单项目代码放在Linux文件系统内比如~/projectsWindows侧通过\\wsl$\Ubuntu-20.04\home\用户名\projects访问。两边需要文件同步时用git和rsync而不是直接拖文件。实测下来同样的代码放Linux目录编译速度和原生Linux基本一致。5.2 坑二Vmmem进程吃掉大半个内存WSL2在后台会有一个叫Vmmem的进程它就是WSL2虚拟机的宿主。默认配置下它最多能用掉物理内存的一半甚至80%加上其他程序电脑卡成PPT就不奇怪了。解决办法是手动限制WSL2的资源上限。在Windows用户主目录下新建一个.wslconfig文件[wsl2] memory6GB processors4 swap4GBmemory是内存上限processors是CPU核数swap是交换分区大小按你电脑实际配置填。保存后执行wsl --shutdown重启WSL后配置生效。到任务管理器里看Vmmem的内存占用马上就老实了。5.3 坑三systemctl报错服务管理废了在WSL2里跑一些需要systemd的软件时常常会遇到System has not been booted with systemd as init system (PID 1). Cant operate.这个报错说明WSL2当前环境没有以systemd启动服务管理类命令全都不好用。老版本的WSL默认用SysV init所以很多软件装了也启动不起来。解决方式很简单把你的WSL升级到0.67.6以上版本wsl --update然后在Linux里编辑/etc/wsl.conf[boot] systemdtrue保存后wsl --shutdown重新进入执行systemctl is-system-running看到running或degraded都说明systemd已经接管。这一步做完Docker、SSH、各种需要systemd的服务管理就全通了。5.4 坑四电脑睡眠再唤醒WSL时间不准WSL2本质是个虚拟机Windows睡眠时它会被挂起唤醒后时钟并不会自动重新同步。所以你会遇到跑日志、定时任务、证书校验时时间莫名其妙偏移了几分钟甚至几个小时。临时解决办法是手动同步系统时间sudo hwclock -s或者更省心在Windows任务计划程序里建一个任务触发器设为“登录时”或每小时操作设为运行wsl -d Ubuntu-20.04 -u root hwclock -s这样不用每次睡醒都手敲一遍同步命令。5.5 坑五局域网里的其他设备连不上WSL里的服务你在WSL2里跑了一个Web服务监听8080端口。Windows本机浏览器访问localhost:8080没问题但拿手机、另一台电脑访问Windows的局域网IP加8080就是连不上。原因在于WSL2是NAT网络模式它内部的端口并不会自动暴露给局域网。解决思路是端口转发。先查WSL2的IPwsl hostname -I比如输出172.18.78.4然后在Windows管理员PowerShell里添加转发规则netsh interface portproxy add v4tov4 listenaddress0.0.0.0 listenport8080 connectaddress172.18.78.4 connectport8080同时确保Windows防火墙允许了8080的入站访问或者执行netsh advfirewall firewall add rule nameWSL2 Port dirin actionallow protocolTCP localport8080这套方案有一个麻烦点WSL2的IP地址在每次重启后会变化所以转发规则里的connectaddress可能失效。更省事的方法是写个脚本启动时自动获取WSL IP并刷新转发规则。6. 进阶玩法CUDA、Docker与WSLg图形界面6.1 开启systemd后WSL2才算是完整Linux如果你在前面“坑三”里已经把systemd开启了那恭喜你WSL2现在可以算一个“完整Linux”了。接下来很多服务都能用systemctl管理比如SSH、Docker、数据库等。如果你还没开现在再去把/etc/wsl.conf里的[boot] systemdtrue加上重启WSL再继续往下看。6.2 原生Docker Engine安装比Docker Desktop更轻WSL2上跑Docker有两条路线一是装Docker Desktop它会用自己的WSL2后端和图形面板二是直接在WSL2里原生安装Docker Engine资源占用更少终端操作也更符合Linux习惯。我建议日常开发直接原生安装。一条脚本搞定curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh把自己加入docker组免去每次敲sudosudo usermod -aG docker $USER然后启动Dockersudo service docker start验证docker run hello-world能输出Hello from Docker!就说明环境正常。注意WSL2默认不开机自启所以每次进入Linux后需要手动执行sudo service docker start。你可以把这行加进~/.bashrc也可以接受这个习惯。6.3 WSL2上用CUDA跑深度学习前提是Windows驱动WSL2一个很诱人的特性是能直通GPU用来跑CUDA深度学习任务。它的架构是这样的GPU驱动装Windows端WSL2里只装CUDA Toolkit两边是配合关系。先保证Windows端装了最新的NVIDIA驱动不用在WSL里装驱动。然后进入WSL装CUDA Toolkit for WSL2wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update sudo apt-get -y install cuda装完执行nvidia-smi如果能看到显卡型号和驱动版本CUDA环境就算通了。之后装PyTorch时它会自动检测到CUDA设备训练速度和原生Linux基本没有差别。需要注意WSL2的CUDA版本和Windows驱动要匹配建议都保持最新。如果你在WSL里装了老版本CUDA又长时间不更新Windows驱动一升级两边可能对不上这时重装一次WSL内的CUDA Toolkit就好。6.4 WSLgWin11直接跑Linux图形程序Windows 11自带的WSLg让WSL2可以直接跑Linux图形界面程序不需要额外的X Server。比如你装一个文本编辑器sudo apt install -y gedit gedit图形窗口会直接弹出来像是Windows原生程序一样。这个能力来自WSLg的RDP封装中文输入、剪贴板共享这些基础功能也都能用。Windows 10用户如果想体验WSLg需要升级到合适的版本或者用第三方的X11转发方案。我的建议是如果你主力是Windows 10又确实需要图形界面要么装个轻量虚拟机要么趁早考虑升级Windows 11。WSLg在体验上的差距不是手动装个X Server能追回来的。最后说点实在的我见过太多人卡在WSL2安装的某个环节最后排查来排查去原因无非两个——Windows版本太旧或者BIOS虚拟化没开。你在按这篇流程操作时如果哪一步报了看不懂的错先回头检查这两处往往比搜错误码更快。WSL2不是万能的它替代不了完整桌面但在Windows上做日常Linux开发它是我目前试过的折腾成本最低的方案。希望这份记录能帮你少走点弯路。
返回列表