ARTICLE DETAIL

资讯详情

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

WSL2从安装到实战:比虚拟机更轻量的Linux开发环境

WSL2从安装到实战:比虚拟机更轻量的Linux开发环境 1. 为什么说WSL不是传统虚拟机却比虚拟机更好用1.1 别再以为它是Windows里塞了一个Linux虚拟机很多人第一次听说WSL第一反应是Windows里又多了一个虚拟机其实不是这么简单。WSL的全称是Windows Subsystem for Linux也就是Windows官方的Linux子系统你可以把它理解成Windows和Linux之间的一座桥。它不像VMware或VirtualBox那样先模拟出一整套硬件再去安装Linux系统而是通过一层系统级适配让Linux发行版如Ubuntu、Debian直接在Windows上运行起来。我最早接触WSL是在Windows 10刚推出那阵当时第一印象是这玩意儿启动居然只要一两秒而在虚拟机里装个Ubuntu光开机就要等几分钟。WSL能解决的问题非常明确如果你是一个开发者既要Windows里的办公软件、聊天工具、日常影音又需要Linux环境里的Shell、包管理器、开源工具链以前只有三条路——装双系统、开虚拟机、或者直接换一台Linux电脑。双系统切换麻烦虚拟机又笨重换电脑更不现实。WSL就是那个两边都要的最佳答案Windows负责图形界面和日常应用Linux环境负责跑命令、跑服务、做开发。它适合所有对Linux有需求的Windows用户无论是后端开发、运维、数据科学还是单纯想学Linux命令行的朋友。1.2 WSL1和WSL2你要搞清楚再选WSL现在默认有两条实现路径WSL1和WSL2两者原理完全不同但用起来都是同一个wsl命令。WSL1本质是一个系统调用翻译器Linux程序发出的系统调用会被实时翻译成Windows内核能理解的操作好处是文件系统性能非常高访问Windows下的文件几乎零延迟但坏处是很多依赖完整Linux内核的功能跑不了比如Docker、FUSE、某些内核模块。WSL2则是把真正的Linux内核跑在一个由Windows虚拟机平台托管的轻量级虚拟环境里内核和系统调用都是真的兼容性大幅提升。代价是文件跨系统读写变慢因为两边隔着虚拟化边界。我实测下来WSL2里编译大型C项目、跑Docker容器都完全没问题放在Windows上的项目源码通过/mnt/c访问时会明显比WSL1慢所以代码尽量放在Linux文件系统里。官方已经在较新的Windows版本中默认使用WSL2新装环境直接走WSL2就对了。如果你有老发行版停留在WSL1也可以用一条命令手动升级过去后面我会专门说。1.3 为什么开发人员都转向WSL而不是传统虚拟机我身边很多同事早就不用VMware装Linux开发机了原因其实用一张表就能说清楚对比项WSL2VMware / VirtualBox启动速度秒级开启冷启动通常要1-3分钟资源占用动态内存常驻几百MB通常需要提前分配固定内存动辄2GB起文件共享\\wsl$路径直接互访需要额外设置共享文件夹命令行集成宿主机直接进Linux shell需要打开虚拟机窗口再切换终端GUI支持WSLg 可运行Linux图形程序支持完整桌面环境运维成本基本不用管内核和驱动需要经常处理虚拟机内系统更新、网络配置当然传统虚拟机并没有完全被替代。如果你需要完整的Linux桌面、需要严格控制BIOS级别的虚拟化行为或者要测的软件和Hyper-V不兼容那VMware仍然有用武之地。但绝大多数日常开发场景里WSL2的轻量、快速和低占用都是传统虚拟机比不了的。2. 安装前的环境检查提前排除80%的坑2.1 先看一眼Windows版本别急着敲命令WSL现在已经非常好装了但前提是你的Windows版本够新。我建议在动手前先按Win R输入winver回车确认系统版本。Windows 10 2004内部版本19041以上或者Windows 11任意版本都可以使用最方便的wsl --install一条命令安装方式。Windows 10较老版本虽然也能装WSL但需要手动启用功能、手动下载内核更新包流程会稍长。如果遇到提示“无法识别wsl命令”大概率就是系统太老或者用了被精简过的系统需要先补好系统更新再说。我踩过一个小坑公司电脑是Windows 10 LTSC版本某些组件被精简过直接wsl --install会报错后来手动启用功能才解决。所以如果你的系统是Server版或LTSC不要默认它有完整支持先尝试再说。2.2 开启虚拟化BIOS里那步别忽略WSL2依赖Windows的“虚拟机平台”功能而这个功能又依赖CPU虚拟化。绝大多数现代CPU默认开启了虚拟化但也有不少品牌机出厂默认关闭这时候无论你怎么折腾都会报各种奇怪错误比如“无法启用虚拟机平台”或者“检测不到虚拟化管理程序”。在管理员PowerShell里执行systeminfo拉到“Hyper-V要求”那一段如果看到“已检测到虚拟机监控程序”说明虚拟化已经开启如果显示“无法检测”那你需要进BIOS开启Intel VT-x或AMD-V再保存重启。检查没问题后用管理员PowerShell执行下面两条命令把WSL需要的Windows功能打开dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完以后重启系统。很多教程没说重启结果功能没生效导致后面装完WSL但无法启动。2.3 磁盘规划C盘还是D盘提前想好默认情况下WSL发行版会安装在C盘位置在C:\Users\你的用户名\AppData\Local\Packages\下里面放着一个vhdx虚拟磁盘文件。Ubuntu基础安装大约占用1GB多但一旦你用起来包缓存、Docker镜像、项目依赖很快就会让这个文件膨胀到十到几十GB。如果你C盘空间本来就不宽裕强烈建议装之前就决定好要不要把WSL放到D盘。不过一个好消息是WSL支持无损迁移即使已经装好了也能搬到D盘。我后面单独用一节讲迁移方法所以这一步你只需要确认C盘剩余空间足够完成首次安装即可。3. 从零到一三种安装方式任你选3.1 新手闭眼入一条命令装好WSL2 Ubuntu如果系统版本满足条件最简单的方式就是在管理员PowerShell或cmd里输入wsl --install这条命令会自动完成三件事启用需要的Windows功能、下载安装WSL2内核、默认安装Ubuntu发行版。结束后系统会提示重启重启完再打开终端系统会自动进入Ubuntu的首次初始化流程让你创建Linux用户名和密码。整个过程基本不用碰电脑是所有方式里最不容易出错的。如果你不想用默认的Ubuntu可以在命令里指定发行版。先看有哪些可选wsl --list --online然后指定安装wsl --install -d Debian wsl --install -d kali-linux我个人建议新手直接选Ubuntu 22.04 LTS或更新版本遇到问题的概率最小网上资料也最多。Debian也很稳但生态和教程数量稍少一点。注意wsl --install不支持在老的Windows版本上执行如果你敲完提示未知命令就改用下面的手动方式别硬扛。3.2 老版Windows手动安装流程手动安装一共四步先启用功能再装内核然后从商店装发行版最后初始化。第一步和前面一样管理员PowerShell运行那两条dism命令然后重启。第二步去微软官方下载页搜“WSL2 Linux内核更新包”下载并安装x64版本的msi安装包。这个包体积不大但很容易漏装漏掉之后启动WSL会报错错误信息会提示“WSL 2 requires an update of its kernel component”。第三步打开Microsoft Store搜索Ubuntu或者Debian、openSUSE点击安装。第四步从开始菜单启动这个Linux发行版应用它会自动解压并引导你创建用户。手动方式的优势是你对每一步都清楚适合系统比较老或者网络环境需要走代理的场景。不过我要提醒一句如果你在公司内网环境Microsoft Store可能被禁用这种情况下更推荐用wsl --install或者下载发行版appx包离线安装别跟商店死磕。3.3 多发行版管理和WSL版本切换装好之后你可以用wsl --list --verbose查看已安装的所有发行版以及它们各自的WSL版本。如果你的系统里已经有旧版WSL1发行版想升级到WSL2wsl --set-version Ubuntu 2这条命令会把指定发行版从WSL1转换成WSL2耗时取决于现有文件系统大小可能需要几分钟。期间别开着很多WSL窗口免得转换卡住。另外如果你装了多个发行版可以用wsl -s Ubuntu设置默认发行版。平时直接在Windows终端里敲wsl会进入默认发行版但也可以执行wsl -d Debian直接进入指定系统。4. 把WSL真正装进D盘迁移避开C盘爆炸4.1 先搞懂WSL的文件到底存在哪里WSL发行版并非像普通软件那样装在一个看得见的文件夹里而是把整个Linux文件系统封装在一个vhdx虚拟磁盘文件中。这个文件默认躲在C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_*\LocalState\ext4.vhdx类似的位置。所以你在Windows资源管理器里可能找不到一个叫“Ubuntu”的文件夹但C盘空间确实在一点一点被它吃走。4.2 官方推荐export/import 迁移到D盘想把WSL搬到D盘最稳定的官方方案是“导出—注销—导入”。说出来很简单但每一步都要注意。第一步执行wsl --shutdown确保所有WSL进程关闭。第二步导出当前发行版到一个tar文件wsl --export Ubuntu D:\wsl-backup\ubuntu.tar导出过程中D盘临时文件会占空间确保D盘有足够容量。导出完成后第三步注销原发行版wsl --unregister Ubuntu执行这步前一定要确认导出文件已经生成因为注销会直接删除C盘里的旧vhdx文件找不回来的。第四步创建D盘目标目录然后导入wsl --import Ubuntu D:\WSL\Ubuntu D:\wsl-backup\ubuntu.tar --version 2导入完成后你运行WSL会发现默认用户变成了root。这是因为导入过程不保留原来的默认用户设置。解决方法是手动编辑Linux里的/etc/wsl.conf[user] default你的用户名保存后执行wsl --shutdown再重进就会恢复成普通用户登录了。4.3 vhdx瘦身删了文件但C盘空间没回来的解法还有一种常见情况你在WSL里删了几十GB的临时文件、Docker镜像Windows的C盘可用空间却没有多出来。因为vhdx是动态扩展的它只会变大不会自动收缩。解决方法是压缩VHD文件。新版Windows可以用这条命令直接压缩optimize-vhd -Path C:\Users\你的用户名\AppData\Local\Packages\...\ext4.vhdx -Mode Full如果系统没有optimize-vhd命令可以用diskpart。先wsl --shutdown然后打开管理员命令提示符执行diskpart select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\...\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit路径找不准的话可以在PowerShell里用wsl --manage Ubuntu --set-sparse true开启稀疏VHD再配合Disk Usage清理。不过这个功能需要在较新的WSL版本上才有老版本先用前面两种方法即可。5. 装好后最值得做的5件事终端、VSCode、文件互访、Docker5.1 第一次启动创建Linux用户和密码不管是哪条安装方式首次启动发行版后都会进入初始化流程。系统会提示你“Enter new UNIX username”这里要求小写字母、数字、下划线不能以数字开头也别用大写。接下来设置密码输入时屏幕不会显示任何字符这是Linux的正常行为不是键盘坏了。初始化完成后你就能看到类似用户名机器名:~$的提示符了。如果某天忘记密码可以在Windows终端里执行wsl -u root进入root用户再用passwd 用户名重置密码。5.2 Windows Terminal WSLg 桌面体验Windows Terminal是微软出的现代终端工具从Microsoft Store就能安装。装好后它会自动检测你系统里安装的所有WSL发行版下拉菜单里就能直接选择进入Ubuntu或Debian。我习惯开启Windows Terminal的启动页面和JSON设置把默认配置文件设为Ubuntu这样每次打开终端就直接进Linux环境非常流畅。如果你的系统是Windows 11WSLg默认开启可以在WSL里直接运行图形程序。比如在Ubuntu里sudo apt install gedit然后执行gedit Windows桌面就会弹出Linux窗口这已经接近一台轻量Linux桌面的体验了。5.3 VSCode 打通WSL开发环境这是WSL的核心价值所在。在Windows上安装VSCode再安装官方插件“Remote - WSL”然后打开VSCode按F1输入“WSL: Connect to WSL”VSCode就会以WSL作为工作环境。你打开的文件夹、终端、调试器全部走Linux环境但编辑器的界面和快捷键仍然是VSCode。这样做的好处是项目文件默认放在Linux文件系统里跑node、python编译速度比在Windows上快很多而且不需要在Windows里再装一遍环境。很多人觉得WSL开发“慢”十有八九是因为把项目文件夹放在/mnt/c或/mnt/d上如果你从第一天就把代码放在~/projects下慢这个字就压根不会出现。5.4 文件互通的关键\\wsl$和/mnt/cWindows资源管理器地址栏里输入\\wsl$\Ubuntu\home\你的用户名就能直接访问Linux里的用户目录。也可以右键映射网络驱动器以后就像访问一个普通文件夹一样。反过来WSL里访问Windows文件系统路径是/mnt/c/Users/你的用户名/Documents。这里必须提醒一个大坑WSL2里跨系统读写性能很差。如果你在Linux侧频繁读写/mnt/d上的文件比如D盘上的一个Git仓库速度可能会慢到让你怀疑人生。我建议所有需要Linux性能的项目和数据都放在Linux目录内Windows和Linux之间的文件传输仅作为临时交换不要作为日常工作目录。5.5 用WSL2跑Docker省掉Windows容器烦恼Docker Desktop是目前最流行的Docker客户端它支持选择WSL2后端。安装Docker Desktop时勾选“Use WSL 2 based engine”之后在Windows终端里可以直接用docker命令WSL里也能识别同一个Docker守护进程。这意味着你可以在Windows侧写配置在WSL侧跑容器两边共享一套环境。如果不想装Docker Desktop也可以在WSL里直接装原生Docker Engine。Ubuntu里执行sudo apt install docker.io再把当前用户加入docker组。这种方式更“纯净”但需要自己处理开机自启和服务管理适合喜欢折腾的朋友。6. 出错别慌WSL常见报错排查手册6.1 虚拟化开启但WSL仍然无法启动“无法启用虚拟机平台”算是高频报错。即使BIOS里已经打开虚拟化还有一个坑是Windows的“内核隔离”内存完整性功能有时会干扰Hyper-V平台导致WSL2起不来。解决方法是Windows安全中心 - 设备安全性 - 内核隔离 - 关闭内存完整性然后重启。如果你还在用VMware或VirtualBox注意新版本虚拟机软件需要开启Hyper-V共存模式否则也会互相打架。另一个排查点是Windows功能里“虚拟机平台”是否真的已启用。管理员PowerShell执行Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatformState显示Enabled才算好。如果State还是Disabled重新执行启用命令再重启。6.2 安装发行版时0x80070003、0x8007019e怎么办0x80070003很常见意思是系统找不到指定路径。这通常和磁盘分区有关比如你的C盘是FAT32、或者Windows安装在USB移动硬盘上。WSL要求存放发行版的磁盘是NTFS。解决方法是先卸载该发行版wsl --unregister 发行版再通过wsl --import手动把发行版导入到NTFS分区比如D盘。命令参考前面迁移那节。0x8007019e则通常指向WSL2内核没装好。去微软官网重新下载“WSL2 Linux内核更新包x64”并安装。装完之后执行wsl --shutdown再重进。别忘了系统是32位还是64位WSL2只支持64位系统。6.3 内核更新和VMware共存问题如果你打开VMware Workstation时看到“VMware Workstation 无法连接到虚拟机”并且你同时启用了Windows虚拟机平台一般是因为VMware版本太老不兼容Hyper-V。新版VMware Workstation 15.5支持在启用Hyper-V的Windows上运行但前提是勾选安装“Windows Hypervisor Platform”功能。另外WSL2和VMware共用同一套虚拟化底层时性能会有一定折损。如果你重度依赖VMware做复杂虚拟化测试建议要么固定用VMware不用WSL2要么把VMware换到WSL2上常用场景。不要同时开着大量虚拟机和WSL不仅内存吃紧也容易触发奇怪的驱动冲突。6.4 Docker Desktop与WSL相关报错Docker Desktop运行时报错“WSL docker-desktop distro is not running”或者“Please start the Windows daemon from a non-elevated terminal”常见原因有两个。第一个是权限问题Docker Desktop在管理员终端启动有时会触发异常官方明确建议从普通终端启动。第二个是镜像损坏可以先执行wsl --shutdown再到Docker Desktop设置里找到Troubleshoot点击“Restart Docker Desktop”。如果还不行就注销docker-desktopwsl --unregister docker-desktop wsl --unregister docker-desktop-data然后重启Docker Desktop它会自动重建WSL后端。这个方法我试过很多次基本都能救回来。6.5 端口占用和网络访问异常的排查WSL2里的服务默认在Windows侧可以通过localhost:端口访问这是微软做的端口转发。如果你访问不到先检查服务在Linux侧是否监听在0.0.0.0而不是127.0.0.1。比如启动web服务时加上--host 0.0.0.0否则虚拟机外面访问不了。在Windows侧如果你发现端口被其他进程占用了两步走netstat -ano | findstr :8080 taskkill /PID 1234 /F先查出占用端口的进程PID再强制结束。注意确认这个进程可以杀别杀到系统关键进程。7. 进阶操作给WSL调优和跑CUDA7.1 .wslconfig 限制内存和CPUWSL2默认会占用宿主机相当比例的内存最高可达物理内存的50%甚至80%。如果你不想让WSL吃光内存可以在用户目录比如C:\Users\你的用户名新建一个.wslconfig文件写入[wsl2] memory8GB processors4 swap2GB然后执行wsl --shutdown再重新进入配置就会生效。memory是WSL最大可用内存processors是CPU核心数swap是交换分区大小。我建议不要配满物理内存比如16GB内存的机器给WSL分8GB就够用了剩下给Windows开着浏览器和聊天工具还能流畅运行。7.2 WSL2 CUDA PyTorch 实测需要跑深度学习的同学WSL2是个好选择。前提是Windows侧安装了最新NVIDIA驱动WSL2会直接使用这个驱动访问GPU。Linux侧安装CUDA Toolkit for WSL然后创建Python虚拟环境conda create -n pytorch python3.10 conda activate pytorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118装完后在WSL里执行nvidia-smi如果能显示GPU信息就说明CUDA已经通到WSL里了。相比双系统来回重启WSL2里做深度学习实验的体验好了太多唯一要留意的是显存和内存消耗会同时算在Windows上别把资源吃满。7.3 清理迁移后的残留与卸载WSL如果你已经把发行版从C盘迁移到D盘原C盘位置留下的一些旧包缓存可能还在建议到C:\Users\你的用户名\AppData\Local\Packages下看看有没有旧的发行版文件夹确认没用后手动删除。彻底卸载WSL分两步注销所有发行版然后关闭Windows功能。wsl --shutdown wsl --unregister Ubuntu wsl --list然后再用管理员PowerShell执行dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /disable-feature /featurename:VirtualMachinePlatform /all /norestart重启后WSL相关功能就会彻底从系统里移除。我在实际使用中最深的体会是WSL不是拿来折腾的玩具而是一个能够让Windows和Linux共存的日常开发底座。刚开始遇到报错时我也想过放弃但真的把虚拟化、内核更新、磁盘迁移这些坑填平之后现在每天的工作流已经离不开它了。日常开发、跑脚本、Docker容器、深度学习实验全都在WSL里搞定Windows侧只做浏览器、通讯和文档处理这种分工越用越顺手。最后再分享一个小建议别一上来就折腾D盘迁移、CUDA、.wslconfig这些进阶设置先把Ubuntu装好用最简单的shell命令和文件互访跑一两个星期等你真正感受到WSL的便利之后再做迁移和调优一步一个坑地踩反而比一次性全配完更容易排错。把Linux文件系统和Windows文件系统的边界搞清楚很多“卡顿”“奇怪问题”自然就迎刃而解了。
返回列表