ARTICLE DETAIL

资讯详情

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

从虚拟机到WSL2:Ubuntu开发环境搭建与高频问题排查指南

从虚拟机到WSL2:Ubuntu开发环境搭建与高频问题排查指南 1. 为什么我把Ubuntu开发环境从虚拟机搬进了WSL2如果你平时写代码、折腾服务器、跑深度学习或者只是想把Linux环境作为日常开发主力大概率都经历过这种纠结到底用虚拟机、双系统还是直接在Windows上装个WSL2我以前一直用VMware跑Ubuntu后来折腾过一阵子双系统最终定居在WSL2 Ubuntu。这个选择不是谁比谁高贵而是WSL2解决了我在Windows下用Linux的三个核心痛点启动快、资源占用低、和Windows文件系统互通方便。先说WSL2的本质。WSL2和传统的虚拟机软件VMware、VirtualBox这类最大的区别是它运行在微软自家的轻量级虚拟化平台上底层用的是Hyper-V架构但用户感知层面完全不像虚拟机。你打开Windows Terminal输一个wsl命令Ubuntu环境瞬间就进去了不需要等待完整的虚拟机引导流程。WSL2是带完整Linux内核的不是之前WSL1那种翻译层这意味着Docker、CUDA、systemd这类依赖内核特性的软件都能稳定跑。什么场景最适合WSL2我觉得有三类人是典型受益者前后端开发主力机是Windows但代码要跑在Linux环境里比如Nginx、Redis、Node.js这些。学生党写作业、跑实验需要一个Ubuntu环境又不想承担双系统的风险。玩AI框架、CUDA加速的人WSL2的原生GPU支持做得相当好。当然它也有不适合的场景需要大量操作物理硬件、或者需要自定义内核模块并且对系统稳定性要求极高的场景还是老老实实用实体机。2. 安装前先确认这三件事避免装到一半返工很多人兴致勃勃执行wsl --install结果弹出各种报错大部分原因就是前置条件没满足。安装不复杂但有几个坑要提前排除。2.1 BIOS里虚拟化开关没开一切白搭最常见的报错就是这个WslRegisterDistribution failed with error: 0x80370102 Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.翻译成大白话你电脑的CPU虚拟化功能没打开。重启进BIOS在CPU Configuration或者Advanced这类菜单里找到Intel VT-xIntel平台或者SVMAMD平台设为Enabled。不同品牌主板叫法不一样有的叫Virtualization Technology有的叫VT-d认准就开。判断虚拟化到底开没开最靠谱的办法不是在BIOS里猜而是打开任务管理器切到性能标签页看CPU那一栏右下角的虚拟化是否显示已启用。如果这里是已禁用那后面WSL2基本起不来。2.2 检查Windows版本和系统类型WSL2对Windows版本有要求太老的系统装不上Windows 10 版本 2004内部版本 19041及以上Windows 11 全系都支持判断方式WinR输入winver看一下内部版本号。如果低于19041先更新Windows补丁再继续。另外系统必须是64位的32位系统跑不了WSL2。虽然现在市面上几乎没有32位Windows了但老机器偶尔还能见到装之前瞄一眼也好。还要注意Windows 10上装WSL2需要额外安装两个功能组件适用于Linux的Windows子系统虚拟机平台以管理员身份打开PowerShell执行这两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启系统。Windows 11用户就省事了一条wsl --install全给你搞定。2.3 设置WSL2为默认版本重启完系统打开PowerShell先把默认版本切到WSL2防止后面装好的发行版默认跑在WSL1上wsl --set-default-version 2这一步非常容易忽略。如果你没设默认版本某些情况下安装完Ubuntu后系统会以WSL1模式运行你后面装Docker、CUDA都会莫名奇妙出问题。怎么看当前跑的是哪个版本wsl -l -v输出结果里有个VERSION列如果显示1用下面命令转换wsl --set-version Ubuntu-22.04 2转换过程需要一点时间中途不要关窗口。3. 一条命令搞定Ubuntu安装但版本别选错前置条件都处理完接下来就进入正题安装WSL2并下载配置Ubuntu。3.1 wsl --install主流程在管理员PowerShell里直接敲wsl --install这条命令会自动安装WSL2、启用虚拟机平台、下载并安装默认的Ubuntu发行版。全程不需要手动去官网下载镜像微软的商店仓库会自动拉取。如果你想装指定版本先看看有哪些发行版可选wsl --list --online输出一般包含这些Ubuntu Ubuntu-22.04 Ubuntu-24.04 Debian kali-linux指定版本安装的格式是wsl --install -d Ubuntu-22.04这里我要多说一句版本选择。目前网上教程最多的还是Ubuntu 22.04 LTS因为很多开发工具链对它的兼容验证最充分比如CUDA、Pytorch这些大头。Ubuntu 24.04 LTS虽然是最新的LTSPython版本更激进但偶尔会遇到第三方包的编译依赖问题。如果你是拿来日常开发、跑主流框架选22.04最稳想尝鲜、长期使用24.04也可以。装完之后系统会让你设置一个UNIX用户名和密码。这个用户名是Linux内部用的可以跟Windows用户名不一样。输入密码时屏幕不会显示这是Linux的正常行为别以为键盘坏了。3.2 验证安装和检查WSL2状态装完先验证一下wsl -l -v看到Ubuntu的VERSION是2说明跑在WSL2模式。再进Ubuntu终端看一眼内核版本uname -a sudo cat /etc/os-release能正常输出信息说明内核活着Ubuntu本体也没毛病。有人会碰到一个问题输入wsl后卡在某个界面很久然后提示Processing fstab with mount -a failed或者直接黑屏。这通常是安装了干净镜像后没重启或者WSL内核组件没更新。执行一次wsl --update这条命令会升级WSL内核到最新版能解决大部分启动异常。4. 装完第一件事换源和系统更新Ubuntu 装好之后你如果直接跑sudo apt update可能等很久甚至卡住。原因不复杂Ubuntu 默认的软件源指向的是官方服务器国内访问延迟较高。我一般拿到新系统先做两件事换源然后全面更新。4.1 把apt源换成国内镜像备份原始源文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bakUbuntu 22.04 的源已经改用deb822格式存放所以直接编辑/etc/apt/sources.list.d/ubuntu.sourcessudo nano /etc/apt/sources.list.d/ubuntu.sources把这个文件里的http://archive.ubuntu.com/ubuntu/全部替换成清华镜像地址Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg替换成镜像源之后执行sudo apt update sudo apt upgrade -y你会发现速度快得像是换了台电脑。Ubuntu 24.04 的源策略有点不一样它默认用的是/etc/apt/sources.list.d/ubuntu.sources不用去动/etc/apt/sources.list改完记得跑一次update验证语法没写错。如果apt update时报Signature verification相关的错说明Signed-By路径或keyring不对去镜像站首页确认对应版本的配置说明为准。4.2 顺手装几个基础工具换了源的Ubuntu才算能干活。我个人习惯装上这些基础包sudo apt install -y build-essential git curl wget net-tools vim unzip zipbuild-essential包含gcc、g、make编译软件必需。net-tools提供ifconfig、netstat这些命令排查网络问题离不开。git curl wget日常下载代码和文件三件套基本必装。还有很多人会问中文输入法怎么装这块内容我在下面单独细讲因为涉及额外的桌面配置不是一条命令能解决的。5. 中文输入法和编程字体把WSL2调成最喜欢的样子WSL2分两种使用姿势一种只当纯命令行终端用写代码全在Windows的VSCode里另一种是把WSL2里的Ubuntu当成轻量桌面来用配好中文输入法、图形界面日常编辑文档都能在里头完成。后者更接近完全替代虚拟机的体验。5.1 fcitx5 中文输入法配置很多人搜ubuntu中文输入法怎么设置、搜搜狗输入法ubuntu安装搜狗输入法确实有Linux版但安装包体积不小对WSL2这种环境反而fcitx5更干净。在WSL2的Ubuntu里装fcitx5sudo apt install fcitx5 fcitx5-chinese-addons然后修改环境变量告诉系统我用的是fcitx作为输入法框架。编辑~/.bashrc在最后加上export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx执行source ~/.bashrc然后启动fcitx5fcitx5 第一次启动会提示找不到键盘布局之类的这个是正常的在配置界面里把拼音加进去就能用了。如果你用的是Windows 11WSLg自带GUI支持fcitx5的配置窗口能直接显示出来。小技巧在纯命令行场景不开图形界面输入法其实用处不大你的主要使用场景如果是VSCode Remote WSL中文输入直接用Windows侧的中文输入法就行了不需要在Ubuntu里再折腾一遍。5.2 编程字体接近macOS的书写体验网上有个热词很精准wsl ubuntu写代码最推荐的字体接近macos的体验。Hack、JetBrains Mono、Fira Code都试过之后我长期用的是Sarasa Mono SC更纱黑体它是中文英文等宽一体字体中文毫不突兀英文清晰带感整体观感和macOS的Menlo字体很接近。在Ubuntu里装这套字体很简单sudo apt install fonts-noto-cjk sudo mkdir -p /usr/local/share/fonts/sarasa把下载好的Sarasa Mono SC的ttf文件放到上面目录后执行sudo fc-cache -fv然后在Windows Terminal或VSCode的字体设置里把字体设为Sarasa Mono SC。改完字体的第一感受代码在屏幕上排列得整整齐齐中文注释不再挤成一团。这个细节看着不起眼但长期写代码的人真的能感受到差别。6. 断网、迁移、SSH连接WSL2日常使用三大高频问题WSL2用久了你迟早会遇到这几个问题。我挨个讲清楚排查思路和解决办法。6.1 WSL2频繁断网的常见原因wsl2老断网在搜索热词里出现了不止一次。WSL2的网络默认走NAT模式和宿主机在一个虚拟交换机里通常很稳但有时候Windows更新或者系统休眠恢复后WSL2里突然访问不了外网。我自己遇到过的情况是ping 8.8.8.8通但ping baidu.com不通说明DNS解析挂了。WSL2的DNS配置在/etc/resolv.conf里如果文件被重置成nameserver指向一个不可用的地址网络就完了。快速重置方法在PowerShell里wsl --shutdown再重新打开WSL2网络配置会自动重建。如果重启依旧断网手动修改/etc/wsl.conf加一个网络配置[network] generateResolvConf false然后手动写/etc/resolv.confnameserver 223.5.5.5 nameserver 8.8.8.8223.5.5.5 是国内延迟极低且稳定的公共DNS用这个做首选一般不会再出幺蛾子。6.2 更改WSL2默认安装路径默认情况下WSL2的虚拟磁盘文件ext4.vhdx放在C盘的用户目录下路径像这样C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_*\LocalState\ext4.vhdxC盘空间不够的可以把它迁走。迁法很简单先在PowerShell里关掉WSL2wsl --shutdown然后导出当前发行版到D盘某个目录再注销旧发行版最后从文件导入新位置。wsl --export Ubuntu-22.04 D:\wsl_backup.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\WSL\Ubuntu22.04 D:\wsl_backup.tar --version 2注意wsl --unregister会删除当前发行版的所有数据所以导出之前先确保备份文件生成完整。导入完成之后重新进WSL2默认用户名会变成root需要在/etc/wsl.conf里加一行[user] default你的用户名然后wsl --shutdown再进来用户就切回普通用户了。还有一个更省事的办法Windows 11 新版WSL已经支持wsl --manage 发行版 --move 路径直接迁移不用导出再导入。不过如果你的WSL版本没有这个命令用上面老办法最保险。6.3 用XShell连接WSL2里的Ubuntu有不少人的使用习惯是终端用XShell或者FinalShell然后通过SSH连进WSL里的Ubuntu操作。默认情况下WSL2是没有开SSHD服务的需要手动装sudo apt install openssh-server sudo service ssh start然后确认IPhostname -IXShell新建连接时填这个IP用户名密码用你设置的那个就能连上了。这里有个很常见的坑Windows防火墙会拦SSH端口XShell连不上时检查一下Windows Defender防火墙是否允许22端口入站。还有一个更稳的方案直接改/etc/wsl.conf打开镜像网络模式[network] hostnameubuntu generateHostsfalse networkingModemirrored镜像网络模式下WSL2和Windows共享同一个IP和网络栈你直接用localhost、127.0.0.1访问WSL2里的服务就行不用再查虚拟IP。这个功能需要WSL新版本支持先执行wsl --update确保内核组件是最新的。7. 进阶踩坑CUDA、图形界面与一次环境校验报警的排查走到这一步WSL2 Ubuntu 的基础使用已经没太大问题了。但如果你要跑AI模型或者轻量GUI程序会发现有些坑藏在进阶用法里。7.1 在WSL2里安装CUDA跑AI开发WSL2对NVIDIA GPU的支持是原生级的不用像虚拟机的直通那样折腾显卡。判断GPU是否能用在Ubuntu里跑nvidia-smi如果能正常输出GPU信息说明驱动已经透传进来了。这时候CUDA几乎就是一条命令的事直接装NVIDIA官方给的对应WSL版本CUDA Toolkit按照官网的deb方式安装说明执行就行。安装完验证一下nvcc --versionnvcc输出了版本信息CUDA编译器环境就是好的。之后你想装Pytorchpip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121配置好之后跑一个简单的GPU识别脚本能正常返回True和GPU型号大功告成。7.2 工具说could not safely verify the WSL2 environment怎么办这是我在一次跑自动化工具时遇到的报错原话是openclaw could not safely verify the wsl2 environment.这种环境校验未通过的错误在不少需要检测WSL2底座的工具中都会出现。排查思路没那么玄乎按优先级检查WSL内核是不是最新版2./etc/wsl.conf是否配置异常3. Windows侧是否同时装了老版本WSL。当时我的问题出在WSL内核过旧Windows更新之后WSL组件一直是老版本。在PowerShell执行wsl --update重进WSL2再验证问题就消失了。如果你的WSL版本比较老还可以打开Windows功能里把虚拟机平台和适用于Linux的Windows子系统全勾上再重启一次。7.3 图形界面应用与Windows Terminal的配合Windows 11自带WSLgUbuntu里的GUI应用可以直接弹到Windows桌面。比如你装一个geditsudo apt install gedit gedit它会像一个原生Windows软件一样打开窗口这是WSLg的功劳不需要额外装X Server。Windows 10用户没有WSLg需要用VcXsrv或者MobaXTerm做X Server然后设置export DISPLAY:0。这块配置比较繁琐但如果是Windows 11用户我强烈建议直接升级系统省掉这些破事。日常写代码我基本还是在Windows Terminal里敲命令wsl一个命令进去不用开虚拟机不用等系统启动内存占用也低这种爽感用一次就回不去了。如果你手头的机器配置一般又想在Windows下拿Linux干活WSL2值得认真试一试。
返回列表