☰
Windows11 WSL2 安装 Ubuntu 全流程与配置避坑指南
2026/9/29 1:16:33 网站建设 项目流程

我前前后后在四台机器上装过 WSL,也帮同事远程排过不下十次「装不上、装完连不上、装完卡成 PPT」的问题。Windows11 自带的 WSL 装 Ubuntu,现在基本是我拿到一台新机器、做完系统更新之后第一件顺手干的事——它把 Linux 环境和 Windows 桌面塞进同一台机器里,不用重启切系统,也不用给虚拟机预留一半内存。这篇内容就是把这几年攒下来的完整流程、踩过的坑和参数取舍写清楚,适合从来没碰过 Linux 的 Windows 用户,也适合装过一次但被各种报错劝退、想彻底搞明白原理的人。整套流程走下来,从零到能写代码、能跑图形程序,大概四十分钟;其中真正卡人的不是安装命令本身,而是前期几个开关没打开、以及后面文件放在哪里这两个问题。

1. 为什么我最终把票投给了 WSL 而不是虚拟机

1.1 四种常见方案的横向对比

新手问得最多的一句话是:「我到底该装 WSL、VMware 虚拟机,还是干脆双系统?」这个问题没有标准答案,但有一个判断依据——你主要想拿 Linux 干什么。

我先把这几年的实际体验摊开说。双系统是最"纯粹"的方案,Linux 独占硬件,性能拉满,显卡驱动、桌面环境全都是原生状态,但代价是每次切换要重启,而且分区一旦搞砸,Windows 那边也可能进不去。VMware、VirtualBox 这类虚拟机是折中方案,快照、克隆、隔离性都很好,折腾坏了直接删掉重来,但它需要提前给虚拟机分配固定内存和磁盘,宿主机资源被硬切走一块,笔记本上跑久了风扇基本不停。云主机是第四种思路,性能看钱包,但你要忍受网络延迟,本地文件同步也麻烦。

WSL 的定位很特别:它不是虚拟机软件那种"完整的另一台电脑",而是把 Linux 内核跑在 Windows 提供的轻量虚拟化层上,同时和 Windows 共享网络、文件系统和显卡。实际用起来的感觉是——你在 Windows 里敲wsl,一秒多钟就进了 Ubuntu 的 shell,比打开一个浏览器还快。

对比项WSL2传统虚拟机双系统
启动耗时1~3 秒20~60 秒需重启整机
内存占用按需增长,可回收开机即固定占用独占
磁盘占用单个稀疏 vhdx,初始约 1GB预分配 20GB 起独立分区
与 Windows 互访文件原生支持,双向需共享文件夹需要挂载另一分区
GPU 加速 / CUDA支持(需 WSL2)需额外配置,部分不支持原生
快照与回滚靠导出 tar 实现原生快照靠分区备份
系统调用兼容性极高(真内核)原生原生
桌面图形界面WSLg 可跑,性能中等完整桌面原生

看完这张表你会发现,WSL 的优势集中在"轻、快、互通",劣势集中在"图形性能一般、不太适合当长期生产服务器"。如果你要学命令行、跑 Python 数据脚本、做交叉编译、写后端服务,WSL 是最省事的选择;如果你要跑大型 3D 游戏或者做 Android 系统源码编译这种吃满 CPU 和内存的活,虚拟机或者双系统更稳。

1.2 WSL1 和 WSL2 到底差在哪,为什么现在只推荐 WSL2

网上很多老教程还在讲 WSL1,得说清楚这两代的本质区别,不然你会被过时的步骤带偏。

WSL1 的思路是"翻译":Windows 自己实现了一套 Linux 系统调用的转换层,你的uname -a看到的其实是伪装的 Linux。好处是启动极快、跨文件系统访问(也就是访问/mnt/c下的 Windows 文件)几乎和本地一样快;坏处是系统调用覆盖不全,Docker 跑不起来,虚拟内存、inotify、部分网络套接字行为都和真 Linux 对不上,编译某些项目时会莫名其妙失败。

WSL2 换了思路:微软直接内置了一个优化过的 Linux 内核,跑在 Hyper-V 提供的轻量虚拟机上,你的 Ubuntu 是一个货真价实的 Linux。系统调用兼容性接近 100%,Docker、systemd、CUDA 全都能用。代价有两个:一是跨文件系统访问要走 9P 协议,慢得明显;二是内存会被虚拟机动不动吃到几个 GB。

现在新装的话,没有任何理由选 WSL1。微软从 Windows 11 开始,wsl --install默认就是 WSL2,wsl --set-default-version 2这条命令基本上已经变成历史遗留操作了。

1.3 什么情况下我会劝你别用 WSL

说了这么多好处,也得说说什么人别碰它。第一种是笔记本内存只有 8GB 的同学——WSL2 起来的 Ubuntu 加上 Docker,再加上 Windows 自己的占用,很容易把内存吃满导致整机卡顿,虽然可以通过.wslconfig限制内存上限,但限制太狠又会 OOM。第二种是需要在 Linux 里做密集磁盘 I/O 的场景,比如动辄几十万小文件的代码仓库编译,WSL2 在跨文件系统下的表现确实劝退。第三种是必须用特定硬件驱动或者内核模块调试的工作,WSL2 用的是微软定制的内核,加载自定义内核模块需要自己编译内核,门槛不低。

除此之外,日常开发、学习 Linux 命令、跑脚本、做数据处理,WSL 都是性价比最高的选择。

2. 装之前先花五分钟把环境摸清楚

2.1 系统版本与硬件条件的硬性门槛

先说版本。打开 PowerShell 敲winver,弹出的窗口里能看到版本号和内部版本号。WSL 的完整安装命令需要 Windows 10 版本 2004(内部版本 19041)以上,或者任意版本的 Windows 11。如果想用networkingMode=mirrored(后面会讲,这个对解决 SSH 连不上很有用)和自动内存回收,得是 Windows 11 22H2 以上,内部版本 22621 起步。

家庭版和专业版这件事经常被误传。很多人说"WSL2 要专业版才能用",这在早期的确是个坑,因为 WSL2 依赖 Hyper-V 的虚拟化平台,而老版本家庭版没有完整的 Hyper-V 管理器。但从 Windows 10 2004 之后,家庭版已经内置了"虚拟机平台"这个可选功能,wsl --install在家庭版上照样跑得很好。所以看到自己系统是家庭中文版就放弃的,大可不必。

硬件上真正需要确认的是 CPU 虚拟化。任务管理器切到"性能"标签,点 CPU,看右下角,"虚拟化"那一项必须是"已启用"。如果显示"已禁用",重启进 BIOS,找Intel VT-x、Intel Virtualization Technology、SVM Mode(AMD 平台)之类的选项打开它。这项不打开,WSL2 会在启动时报"请确保虚拟机平台和 Linux 子系统功能已启用"之类的错,而你明明已经启用了。

再补一条命令,用管理员权限的 PowerShell 跑:

systeminfo

往下翻到最底部的"Hyper-V 要求",正常情况下应该看到四项全是"是"。如果"固件中已启用虚拟化"那一项是"否",那就回到 BIOS 去解决。

2.2 两个可选功能到底要不要手动开

wsl --install这条命令会自动帮你启用两个 Windows 可选功能:Microsoft-Windows-Subsystem-Linux(Linux 子系统本体)和VirtualMachinePlatform(虚拟机平台)。但实际经验是,这条命令偶尔会因为权限或者组策略的问题只成功一半,然后你重启,再启动 Ubuntu 时报错。

我的习惯是先手动确认状态。用管理员 PowerShell 查询:

dism /online /get-featureinfo /featurename:VirtualMachinePlatform dism /online /get-featureinfo /featurename:Microsoft-Windows-Subsystem-Linux

输出里的"状态"字段显示"已启用"就说明没问题。如果是"已禁用",手动开:

dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

也可以用老式的 PowerShell 命令:

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart

这两条执行完必须重启,不重启后面的步骤全是白费功夫。我见过有人执行完直接wsl --install,报了一堆错,回头一看根本没重启。

这里顺带提一句系统内置的"基于虚拟化的安全性"(VBS,也叫内存完整性)。这个功能开启后确实会占用一部分虚拟化性能,网上有不少教你关掉它的教程。但我要说清楚:它是 Windows 的一项安全防护机制,我不建议为了跑 WSL 就随手关掉。WSL2 和 VBS 是可以共存的,微软自己就在做这方面的兼容优化。如果你真的怀疑它有影响,先做性能对比测试,量化看看到底差多少,再决定,别听风就是雨。

2.3 网络和磁盘这两件小事最容易坏事

WSL 的安装过程需要联网下载两样东西:WSL2 的 Linux 内核更新包(几十 MB),以及你选的发行版镜像(Ubuntu 大概 500MB 到 1GB)。第三条热词里那个wsl --install 太慢,八成就是卡在这一步。

公司内网、校园网如果对下载源做了限制,或者 DNS 解析慢,你会看到安装进程长时间停在某个百分比不动。判断方法很简单:打开任务管理器看网络占用,如果一直是个位数 KB/s,基本就是被卡住了。这种情况有两个出路,一个是换网络环境再装,另一个是走离线包的路子,这个放在下一节细说。

磁盘空间方面,Ubuntu 的根文件系统默认以ext4.vhdx的形式放在C:\Users\<你的用户名>\AppData\Local\Packages\下面某个发行版专属的目录里。这个文件是稀疏文件——你分了 1TB 上限,但它不会一开始就占 1TB,而是随着实际使用增长。不过这带来一个经典的坑:文件删了,vhdx 不一定会自动缩回去。所以 C 盘最好留出至少 20GB 的余量,后面我还会讲怎么把 vhdx 挪到其他盘。

3. WSL 安装全流程实操记录

3.1 一条命令背后到底发生了什么

准备工作做完,正式安装只需要一条命令。用管理员权限打开 PowerShell(不是 CMD,CMD 在某些老版本上对参数解析有差异),执行:

wsl --install

不带参数的话,默认装 Ubuntu,且是微软认为的最新 LTS 版本。想指定版本就先看清单:

wsl --list --online

输出长这样(版本号会随时间更新,以你机器上为准):

以下是可安装的有效分发的列表: 使用“wsl --install -d <分发>”安装。 NAME FRIENDLY NAME Ubuntu Ubuntu Debian Debian GNU/Linux kali-linux Kali Linux Rolling Ubuntu-20.04 Ubuntu 20.04 LTS Ubuntu-22.04 Ubuntu 22.04 LTS Ubuntu-24.04 Ubuntu 24.04 LTS openSUSE-... openSUSE Tumbleweed

想装 22.04 就写:

wsl --install -d Ubuntu-22.04

为什么要显式指定版本?因为不同版本的 Ubuntu 差异比你想象的大。22.04 的软件源配置用的是传统的/etc/apt/sources.list单文件格式,24.04 改成了/etc/apt/sources.list.d/ubuntu.sources这种 deb822 格式,网上一大堆"换源教程"在新版本上照抄会直接报错。另外有些科学计算库对特定 LTS 的兼容性更好,选版本前最好确认一下自己的目标软件支持哪些版本。

这条命令实际干了四件事,按顺序是:启用前面说的两个可选功能、下载并安装 WSL2 内核更新包、把 WSL2 设为默认版本、拉取并安装你指定的发行版。全部完成后它会提示你重启计算机。重启这一步别偷懒,尤其是第一次装。

重启回来,Ubuntu 会自动弹出一个终端窗口,标题栏写着 Ubuntu,然后提示你创建用户名。这里有几个硬性规则要注意:用户名不能有大写字母,不能和发行版名重复(比如叫ubuntu会被拒绝),建议全小写,长度别太短。密码输入时不会有任何回显,不显示星号也不显示圆点,输完直接回车就行。这个密码就是你的sudo密码,忘了会相当麻烦,建议用你平时最熟悉的那套。

3.2 安装卡住、下载太慢的绕行方案

如果wsl --install卡在下载阶段,或者报出已禁止访问网络、超时之类的错,有三条备选路径,按推荐顺序排。

第一条,分步执行。先只启用功能和内核,把发行版安装拆到最后:

wsl --install --no-distribution

这样会先把 WSL 主体和内核装好并提示重启。重启后确认内核没问题:

wsl --update wsl --status

wsl --status会告诉你默认版本是不是 2、内核版本是多少。确认无误后,再从应用商店里搜索 Ubuntu 安装。商店的下载通道和命令行通道不完全一样,有时候一边卡另一边通。

第二条,手动装内核更新包。微软官方提供了独立的 MSI 安装包,文件名类似wsl_update_x64.msi,下载下来双击安装即可。这条路在完全不能用命令行安装的环境里特别有用。

第三条,离线分发包。Ubuntu 官方会发布.AppxBundle格式的离线包,下载到本地后用 PowerShell 安装:

Add-AppxPackage .\Ubuntu_2204.1.7.0_x64.appx

安装前记得先确认默认版本:

wsl --set-default-version 2

用离线包装完之后,第一次启动同样会走创建用户的流程。这里有个小细节:离线包安装的发行版在wsl -l -v里的名字可能和商店版不一样,比如叫Ubuntu-22.04而不是Ubuntu,后面写脚本的时候要注意区分。

还有一种情况是装完之后启动报错,提示your version of windows subsystem for linux (wsl) is too old. run the command ... to update。这个错误的意思是你机器上的 WSL 组件版本太老,和当前的发行版镜像不匹配。解决办法就一条:

wsl --update

如果这条命令本身也失败(比如网络原因),就去下载那个wsl_update_x64.msi手动装。装完再wsl --shutdown停掉所有实例,重新启动发行版。

3.3 装完先跑这几条命令确认状态

Ubuntu 第一次启动完成、能看到username@机器名:~$的提示符之后,别急着装软件,先回 Windows 侧确认几件事。

在 PowerShell 里执行:

wsl -l -v

期望输出:

NAME STATE VERSION * Ubuntu-22.04 Running 2

那个星号代表默认发行版,VERSION列必须是 2。如果显示 1,用这条命令转过来:

wsl --set-version Ubuntu-22.04 2

转换过程可能要等一两分钟,因为它要把文件系统格式转换一遍,期间别断电。

接着在 Ubuntu 里跑:

uname -a cat /etc/os-release df -h / free -h

uname -a会显示内核版本,应该能看到microsoft-standard-WSL2这样的字样,这就证明你跑在真正的 Linux 内核上。df -h /看根分区大小,默认是 1TB 上限的稀疏盘。free -h看内存,WSL2 默认会拿走宿主机内存的一半左右,这个数字后面可以用配置文件改。

3.4 把发行版挪到别的盘(可选但强烈建议)

C 盘紧张的同学,这一步值得做。WSL 没有提供直接"移动"的命令,但可以用导出再导入的方式实现。先在 PowerShell 里:

wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl\ubuntu-2204-backup.tar

导出完成会生成一个 tar 文件,大小和你当前系统的实际占用一致。导出期间 Ubuntu 必须处于停止状态,否则会报错。

接着导入到新位置:

wsl --import Ubuntu-D D:\wsl\Ubuntu-D D:\wsl\ubuntu-2204-backup.tar --version 2

三个参数分别是:新发行版的名字、新发行版存放 vhdx 的目录、源 tar 文件。导入完wsl -l -v里会多一个Ubuntu-D。

这里有个必踩的坑:用--import导入的发行版,默认登录用户会变成root,而不是你原来创建的那个用户。解决办法是在新发行版里写一个配置文件:

sudo tee /etc/wsl.conf > /dev/null <<'EOF' [user] default=你的用户名 EOF

然后在 PowerShell 里wsl --terminate Ubuntu-D再进去,用户就切回来了。确认没问题之后,把原来的发行版注销掉释放空间:

wsl --unregister Ubuntu-22.04

注意:wsl --unregister会直接删除整个发行版和里面所有数据,没有回收站,执行前务必确认导出文件可用。

4. 装完之后的必做配置

4.1 换软件源,这一步能省掉大量等待

刚装好的 Ubuntu 用的是官方源,在国内访问速度不稳定。换成公共镜像源是第一步优化。先确认自己的 Ubuntu 版本号:

lsb_release -c

输出里的代号是关键,22.04 是jammy,24.04 是noble,20.04 是focal。千万别照抄别人的代号,写错了apt update会报 404。

Ubuntu 22.04 及更早版本,编辑/etc/apt/sources.list,先把原文件备份一份:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo nano /etc/apt/sources.list

把里面的内容整体替换成(以 22.04 jammy 为例):

deb 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

Ubuntu 24.04用的是新格式,文件在/etc/apt/sources.list.d/ubuntu.sources:

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 Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

改完执行:

sudo apt update sudo apt upgrade -y

顺手把常用工具装齐,我每次必装的一套:

sudo apt install -y build-essential git curl wget vim unzip zip \ net-tools htop tree tmux ripgrep fd-find python3-pip

build-essential里含gcc、g++、make,是编译大部分源码包的基础。ripgrep和fd-find是grep和find的现代替代品,速度快一个数量级,用过就回不去了。注意 Ubuntu 里fd命令被重命名成了fdfind,想用fd这个名字可以自己加个别名。

4.2 中文环境和输入法怎么配才不折腾

先说中文显示。默认的 Ubuntu 是英文 locale,某些程序处理中文路径时会乱码。安装中文语言包:

sudo apt install -y language-pack-zh-hans fonts-noto-cjk

fonts-noto-cjk是中文字体,不装的话图形界面里中文会显示成方块。改 locale:

sudo update-locale LANG=zh_CN.UTF-8

改完wsl --shutdown再进来,locale命令应该能看到LANG=zh_CN.UTF-8。

再说输入法。这里要区分两种情况:如果你只在命令行里工作,不需要任何输入法,终端的中文输入由 Windows 侧负责。如果你想跑带图形界面的程序并在里面输入中文,就得配 fcitx5。

sudo apt install -y fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3 fcitx5-frontend-qt5

然后在~/.bashrc末尾追加环境变量:

export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx

重新打开终端,或者source ~/.bashrc,然后在图形程序里用fcitx5 -d启动输入法守护进程,托盘里会出现图标,Ctrl+空格切换。

关于搜狗输入法,我得说实话:它在 WSL 的图形环境里能装上,但依赖链比较长,字体和皮肤相关的问题也不少,纯粹为了在 WSL 里打个中文的话性价比很低。fcitx5 自带的拼音方案已经够用,词库可以后续再补。如果你确实需要搜狗的词库,那更现实的做法是把工作流搬到原生 Ubuntu 桌面上,而不是在 WSL 里死磕。

心得:WSL 的图形支持(WSLg)本质上是在 Windows 上跑一个精简的 Wayland/X 合成器,输入法这类需要深度集成桌面环境的组件,天生就比原生环境脆弱。能用命令行解决的事,尽量别开图形界面。

4.3 打开 systemd 和 SSH 服务

WSL 早期版本不跑 systemd,导致systemctl命令完全不可用,很多服务的安装脚本直接报错。现在只要在配置文件里打开就行。

创建或编辑/etc/wsl.conf:

sudo tee /etc/wsl.conf > /dev/null <<'EOF' [boot] systemd=true [interop] enabled=true appendWindowsPath=true EOF

[boot] systemd=true是核心。appendWindowsPath=true表示把 Windows 的 PATH 附加到 Linux 的 PATH 里,好处是能直接在 Ubuntu 里调用code、notepad.exe这类 Windows 程序,坏处是 PATH 会变得很长,某些脚本遍历 PATH 时会慢。我个人的取舍是保留它,因为经常要用。

改完在 PowerShell 里wsl --shutdown,重新进来验证:

systemctl --version systemctl status

第一条能输出 systemd 版本号就说明生效了。如果没生效,检查配置文件有没有拼写错误,以及 WSL 版本是不是 0.67.6 以上(更早的版本对 systemd 支持有 bug,wsl --update一下)。

接下来装 SSH 服务端:

sudo apt install -y openssh-server sudo systemctl enable --now ssh sudo systemctl status ssh

默认配置下 SSH 是禁止密码登录的,如果你要用密码登录,改/etc/ssh/sshd_config:

PasswordAuthentication yes Port 2222

改完sudo systemctl restart ssh。

SSH 连不上是高频问题,原因基本集中在三个地方。第一个是服务没起来,systemctl status ssh一看就知道。第二个是 WSL2 默认用 NAT 网络模式,它有自己的虚拟网卡和独立 IP(用ip addr看,通常是 172.x.x.x 段),宿主机之外的机器根本路由不到这个地址。想让局域网内其他设备连进来,要么配netsh interface portproxy做端口转发,要么直接用镜像网络模式:

在 Windows 用户目录下创建.wslconfig(路径是C:\Users\<你的用户名>\.wslconfig):

[wsl2] networkingMode=mirrored dnsTunneling=true firewall=true autoProxy=false

networkingMode=mirrored让 WSL 直接复用 Windows 的网络接口,IP 地址和 Windows 一致,局域网内其他机器就能直连了。这个功能需要 Windows 11 22H2 以上配合较新的 WSL 版本,老系统上不生效,改完不认的话删掉这行就回退到 NAT 模式。

第三个原因是 Windows 防火墙拦了入站连接。镜像模式下需要在 Windows 防火墙里给对应端口放行入站规则。

提示:autoProxy这一项存在一些版本兼容性问题,某些 WSL 版本上写进去会导致启动异常。如果你改完.wslconfig之后发行版起不来了,先把这行删掉再试。

4.4 打通 VS Code,让编辑器直接进 Linux

这一步是 WSL 体验提升最明显的地方。前提是 Windows 侧已经装了 VS Code,然后在扩展市场里搜WSL,装微软官方那个WSL扩展。

装完之后,在 Ubuntu 终端里进入任意项目目录,敲:

code .

第一次运行会自动在 Windows 侧拉起 VS Code,左下角状态栏会显示WSL: Ubuntu-22.04,表示当前窗口的后端是 Linux 环境。这时候你在编辑器里打开终端,出来的就是 Ubuntu 的 shell,装依赖、跑脚本全都在 Linux 侧,不用来回切窗口。

有个细节值得强调:通过这种方式打开的项目,代码最好放在 Linux 文件系统里(比如~/projects/),而不是/mnt/c/...。原因下一节细说,简单讲就是性能差距可能有十倍。

如果code .报command not found,说明 PATH 没同步。检查[interop]里的appendWindowsPath是不是true,或者在 VS Code 里按Ctrl+Shift+P,执行Shell Command: Install 'code' command in PATH。

4.5 CUDA、MuJoCo 这类重型环境的注意事项

有同学装 WSL 就是为了跑深度学习或者机器人仿真。这里有两个关键认知,踩错会浪费一整天。

第一,不要在 WSL 里装显卡驱动。Windows 侧装好 NVIDIA 的驱动就够了(版本要够新),WSL 会自动把驱动映射进来。在 Ubuntu 里执行nvidia-smi,如果能看到显卡信息,说明映射成功。这时候你去 Ubuntu 里再装一遍.run格式的驱动,大概率把环境搞崩。

然后装 CUDA Toolkit:

sudo apt install -y cuda-toolkit-12-4

具体版本号按你的框架要求来,装完后把路径加进环境变量:

export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

第二,图形化仿真程序在 WSLg 下需要额外的库。比如 MuJoCo 的 viewer 依赖 OpenGL,缺库会报GLFW相关的错。装一套基础图形库:

sudo apt install -y libgl1-mesa-dri libglfw3 libglew-dev libosmesa6-dev \ libxrandr2 libxinerama1 libxcursor1 libxi6

如果你不需要看窗口,只想在无头模式下跑仿真(服务器上跑训练脚本的常见做法),把渲染后端设成 EGL 或 OSMesa:

export MUJOCO_GL=egl

这样能绕开窗口系统,直接在显卡上渲染,速度快很多,也不会因为没有显示器而报错。

至于你说想用binwalk拆固件包、用cmake编译项目这类工作,WSL 里的体验和原生 Linux 几乎没区别,标准流程走就行。唯一要记住的还是那句话——把工作目录放在 Linux 侧。

5. 文件系统、性能与那些年踩过的坑

5.1 为什么你的项目放在 /mnt/c 下会慢十倍

这是 WSL2 最反直觉、也最容易被忽视的性能问题。

WSL2 里访问 Windows 文件是走/mnt/c/这个挂载点,底层协议是 9P,一次文件读写要经过虚拟化层、协议转换、再落到 NTFS。而访问 Linux 自己的文件系统(比如~/、/home/、/tmp/)走的是 ext4,直接落在ext4.vhdx里,速度接近原生。

差距有多大?我用同一个 Node.js 项目做过对比,npm install装依赖,放在/home/下大概 40 秒,放在/mnt/c/下要 6 分半。Git 在小文件密集的仓库上差距更夸张。Python 导入大量模块时,从/mnt/c加载也会明显变慢。

所以我的原则很明确:代码、虚拟环境、依赖缓存、编译产物,全部放 Linux 文件系统里。Windows 那边要用文件怎么办?反向访问就行。在 Windows 资源管理器地址栏输入:

\\wsl.localhost\Ubuntu-22.04\home\你的用户名

就能像浏览普通文件夹一样浏览 Linux 里的文件。老版本 Windows 上这个路径可能写成\\wsl$\Ubuntu-22.04,两个都试试。

需要把文件从 Windows 挪进 Linux,最稳的方式是在 Ubuntu 里用cp:

cp -r /mnt/c/Users/你的名字/Desktop/project ~/projects/

反过来把 Linux 里的文件交给 Windows 程序处理(比如用 Excel 打开导出的 CSV),也可以cp到/mnt/c/下。

5.2 文件权限、解压乱码、时间不同步

权限问题。在/mnt/c/下对文件执行chmod,你会发现改了没反应。因为 NTFS 没有 Linux 的权限位概念,WSL 默认用一套固定的映射规则(文件 777、目录 777),并且不记录修改。想让它记住权限变更,得在挂载时加metadata选项,在/etc/wsl.conf里加:

[automount] options = "metadata,umask=22,fmask=11"

改完wsl --shutdown重启生效。这里要提醒一句:别在 Windows 分区里乱改权限,很可能把 Windows 程序的访问搞乱,谨慎使用。

解压乱码。从 Windows 下载的中文 ZIP 包在 Linux 下解压,文件名经常变成一堆问号或者方框。原因是 ZIP 格式没有强制规定文件名编码,Windows 用 GBK,Linux 按 UTF-8 解,自然对不上。几种解法,按推荐度排:

# 方法一:让 unzip 按 GBK 处理 unzip -O cp936 中文包.zip # 方法二:用 7z,它会对编码做自动探测 sudo apt install p7zip-full 7z x 中文包.zip # 方法三:已经解压乱了,用 convmv 批量改名 sudo apt install convmv convmv -f gbk -t utf-8 -r --notest ./解压出来的目录

convmv那个--notest参数是真正执行改名,去掉它就是预览模式,建议先预览一遍确认没问题再执行。tar 包一般不会有这个问题,因为 tar 默认就用 UTF-8 存文件名。

时间不同步。Windows 和 Linux 对硬件时钟的解释不一样,Windows 认为硬件时钟存的是本地时间,Linux 认为存的是 UTC。双系统用户会看到时间来回跳,WSL 里偶尔也会出现。WSL 侧检查:

date sudo hwclock --show

如果是 WSL 内部时间跑偏(笔记本休眠唤醒后常见),在 PowerShell 里执行:

wsl --shutdown

重新启动后 WSL 会和 Windows 重新同步时间。这个操作我基本每周都会做一次,属于常规维护。

5.3 内存和磁盘的回收,别让 WSL 悄悄吃掉你的资源

WSL2 的内存回收机制有个特点:Linux 里释放的内存,不一定会立刻还给 Windows。你跑完一个吃 8GB 内存的编译任务,free -h显示已经释放了,但任务管理器里 "Vmmem" 进程还是占着 8GB。这是设计使然,不是 bug。

想让它主动还,可以在.wslconfig里配置上限和回收策略:

[wsl2] memory=12GB processors=8 swap=8GB autoMemoryReclaim=gradual

memory限制 WSL 最多用多少内存,按你机器的实际情况给,一般给总内存的一半到三分之二。processors限制 CPU 核心数,不写就是全给。swap是交换分区大小,默认是内存的 25%,跑大内存任务时适当加大能避免 OOM。autoMemoryReclaim=gradual是自动回收策略,空闲内存会逐步还给 Windows,这个选项需要 WSL 2.0 以上版本。

配置改完必须wsl --shutdown才能生效,改.wslconfig不影响正在运行的实例,很多人改了没效果就是因为没重启。

磁盘回收稍微麻烦点。删掉 Linux 里的大文件后,ext4.vhdx不会自动缩小。先确认 WSL 支持稀疏文件开关:

wsl --manage Ubuntu-22.04 --set-sparse true

这个命令把 vhdx 标记为稀疏文件,系统会自动回收未使用的块。如果版本太老不支持,就走 diskpart:

wsl --shutdown diskpart

进入 diskpart 交互界面后:

select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit

那个路径里的包名每个发行版都不一样,别照抄,去AppData\Local\Packages\下面搜ext4.vhdx找准确路径。压缩过程可能比较慢,耐心等着,中途别关窗口。

想扩大磁盘容量(默认上限虽然看着是 1TB,但实际可用会受 vhdx 大小限制),可以在 diskpart 里用expand vdisk maximum=204800(单位 MB,这里是 200GB),然后进 Linux 执行sudo resize2fs /dev/sdd,设备名用df -h确认。

6. 常见问题排查速查表

6.1 报错信息对照表

下面这张表是我这几年实际遇到过、或者帮别人排查过的典型问题,按报错特征整理。

报错/现象大概率原因处理方式
wsl --install报"无法解析服务器名称"DNS 或网络限制换网络;改用离线包安装
启动报"虚拟机平台功能未启用"可选功能没开或没重启手动 dism 启用后重启
启动报"WSL 版本太旧"内核组件与发行版不匹配wsl --update,失败则手动装内核 MSI
wsl -l -v显示 VERSION 为 1默认版本没切到 2wsl --set-version <名字> 2
输入code .提示找不到命令PATH 未同步检查[interop]配置或用 VS Code 命令面板装
局域网 SSH 连不上NAT 模式地址不可达开镜像网络模式,或配端口转发加防火墙放行
中文 ZIP 解压后文件名乱码GBK 与 UTF-8 编码冲突unzip -O cp936或7z x或convmv
任务管理器 Vmmem 占用居高不下WSL2 内存未主动归还配.wslconfig加自动回收,或wsl --shutdown
磁盘空间删了文件不释放vhdx 是稀疏文件,不自动缩wsl --manage --set-sparse true或 diskpart compact
图形程序报 GLFW/OpenGL 错误缺图形库补装 mesa、glfw 相关包,无头场景切 EGL
Ubuntu 里nvidia-smi无输出Windows 驱动过旧更新 Windows 侧驱动,别在 Linux 里装驱动
apt update报 404源里的版本代号写错lsb_release -c核对代号后修正

6.2 日常使用频率最高的命令清单

这些命令我几乎每周都会用到,建议抄进备忘录。

# Linux 侧常用 sudo apt update && sudo apt upgrade -y # 更新软件源和已装软件 df -h # 查看磁盘占用 du -sh * | sort -rh | head -20 # 找出当前目录最占空间的 20 项 free -h # 查看内存 systemctl status <服务名> # 查看服务状态 journalctl -u <服务名> -n 50 # 看服务的最近 50 行日志 tar -xzvf 包名.tar.gz # 解压 tar.gz tar -xjvf 包名.tar.bz2 # 解压 tar.bz2 ps aux | grep 关键词 # 查进程 kill -9 PID # 强杀进程 chmod +x 脚本.sh && ./脚本.sh # 加执行权限并运行
# 用户管理相关 sudo adduser 新用户名 # 创建用户(带家目录和密码设置) sudo usermod -aG sudo 用户名 # 加入 sudo 组 su - 用户名 # 切换用户 whoami && id # 确认当前身份和所属组
# Windows 侧 WSL 管理命令 wsl -l -v # 列出所有发行版及状态 wsl --shutdown # 关闭所有实例(解决大部分玄学问题) wsl --update # 更新 WSL 内核 wsl --set-default-version 2 # 设置默认版本 wsl --terminate <名字> # 只停某一个发行版 wsl --export <名字> <路径.tar> # 导出备份 wsl --import <新名字> <目录> <路径.tar> # 导入 wsl --unregister <名字> # 彻底注销(危险操作)

wsl --shutdown这条命令值得单独强调。它相当于把所有 Linux 实例彻底断电,重新启动时会重新读取.wslconfig和wsl.conf,也能解决网络、时间、内存不释放等一大类莫名其妙的问题。遇到问题先来一发,能省掉大量排查时间。

6.3 几个我踩过的坑,写下来省得你再踩

第一个坑是关于sudo apt upgrade的。刚装好系统后升级几百个包,中途如果 Ctrl+C 中断,可能留下 dpkg 锁和半装状态,之后所有 apt 操作都会报错。解决办法:

sudo dpkg --configure -a sudo apt --fix-broken install

第二条是不要在没有备份的情况下升级发行版大版本。do-release-upgrade在 WSL 里偶尔会因为 systemd 或内核模块的问题中断,最后系统起不来。真要升级,先wsl --export一份 tar 出来,出问题直接导入回去。

第三个坑关于路径。WSL 里的/mnt/c/Users/下面,Windows 用户名是区分大小写的(虽然 NTFS 不区分),但 Linux 侧会原样显示。用脚本硬编码路径时,最好先用ls /mnt/c/Users/确认一下实际的大小写。

7. 备份、迁移与长期维护的几条经验

7.1 备份这件事,越早做越好

WSL 最舒服的一点是,整个系统就是一个 tar 文件。养成习惯之后,我在做任何有风险的操作(升大版本、换源、装 CUDA)之前都会先导出一份:

wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu-$(Get-Date -Format yyyyMMdd).tar

用$(Get-Date -Format yyyyMMdd)让文件名带上日期,这个 PowerShell 的语法很好用,比手动改文件名靠谱。

备份文件的体积和你的实际占用一致,压缩率不错,一般能压到 40% 左右。定时任务这块,Windows 的任务计划程序可以调 PowerShell 脚本,设成每周跑一次,导出到移动硬盘或者网络存储都行。

想恢复到另一台机器,把 tar 复制过去,先在那台机器上装好 WSL 主体(wsl --install --no-distribution),然后wsl --import导入即可。这也是我换电脑时最省时间的做法——新机器上不重装任何环境,直接恢复一份镜像,几分钟就能继续干活。

7.2 一套我用了两年的日常维护节奏

最后分享几个我长期养成的习惯,没什么技术含量,但确实减少了很多麻烦。

每周花两分钟做三件事:sudo apt update && sudo apt upgrade -y保持系统更新,wsl --shutdown让内存和配置重载一遍,du -sh ~/* | sort -rh | head看看家目录里有没有堆积的临时文件和大模型权重。这三个动作能解决 90% 的"用着用着变慢"问题。

项目组织上,我在~/projects/下按语言分目录,每个项目一个虚拟环境(Python 用 venv,Node 用 nvm 管理多版本),依赖缓存统一放在~/.cache/里。这样清理的时候直接删缓存目录就行,不会误伤项目代码。

还有一个习惯是把常用的长命令写成 alias,放在~/.bash_aliases里。比如alias ll='ls -alhF'、alias gs='git status'、alias ports='ss -tulnp'。这些看起来是小打小闹,但每次省下的几秒钟,一年下来相当可观。

WSL 这个工具最让人舒服的地方在于,它让你不用在"用 Windows 办公"和"用 Linux 干活"之间做选择。装一次可能花你四十分钟,但这四十分钟换来的是一个随时能wsl进去、环境和你服务器保持一致、文件还能互相拖的 Linux 环境。真正需要花心思的从来不是那条安装命令,而是搞清楚资源放在哪、配置写成什么样、出了问题往哪儿查——这三件事想明白了,剩下的都是熟练度问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询