Windows11 WSL2 安装 Ubuntu 全流程与配置避坑指南

发布时间:2026/9/29 1:16:37
Windows11 WSL2 安装 Ubuntu 全流程与配置避坑指南 我前前后后在四台机器上装过 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默认就是 WSL2wsl --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。如果想用networkingModemirrored后面会讲这个对解决 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 ModeAMD 平台之类的选项打开它。这项不打开WSL2 会在启动时报请确保虚拟机平台和 Linux 子系统功能已启用之类的错而你明明已经启用了。再补一条命令用管理员权限的 PowerShell 跑systeminfo往下翻到最底部的Hyper-V 要求正常情况下应该看到四项全是是。如果固件中已启用虚拟化那一项是否那就回到 BIOS 去解决。2.2 两个可选功能到底要不要手动开wsl --install这条命令会自动帮你启用两个 Windows 可选功能Microsoft-Windows-Subsystem-LinuxLinux 子系统本体和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不是 CMDCMD 在某些老版本上对参数解析有差异执行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 --statuswsl --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 -huname -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 是jammy24.04 是noble20.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 multiverseUbuntu 24.04用的是新格式文件在/etc/apt/sources.list.d/ubuntu.sourcesTypes: 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-pipbuild-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-cjkfonts-noto-cjk是中文字体不装的话图形界面里中文会显示成方块。改 localesudo update-locale LANGzh_CN.UTF-8改完wsl --shutdown再进来locale命令应该能看到LANGzh_CN.UTF-8。再说输入法。这里要区分两种情况如果你只在命令行里工作不需要任何输入法终端的中文输入由 Windows 侧负责。如果你想跑带图形界面的程序并在里面输入中文就得配 fcitx5。sudo apt install -y fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3 fcitx5-frontend-qt5然后在~/.bashrc末尾追加环境变量export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx重新打开终端或者source ~/.bashrc然后在图形程序里用fcitx5 -d启动输入法守护进程托盘里会出现图标Ctrl空格切换。关于搜狗输入法我得说实话它在 WSL 的图形环境里能装上但依赖链比较长字体和皮肤相关的问题也不少纯粹为了在 WSL 里打个中文的话性价比很低。fcitx5 自带的拼音方案已经够用词库可以后续再补。如果你确实需要搜狗的词库那更现实的做法是把工作流搬到原生 Ubuntu 桌面上而不是在 WSL 里死磕。心得WSL 的图形支持WSLg本质上是在 Windows 上跑一个精简的 Wayland/X 合成器输入法这类需要深度集成桌面环境的组件天生就比原生环境脆弱。能用命令行解决的事尽量别开图形界面。4.3 打开 systemd 和 SSH 服务WSL 早期版本不跑 systemd导致systemctl命令完全不可用很多服务的安装脚本直接报错。现在只要在配置文件里打开就行。创建或编辑/etc/wsl.confsudo tee /etc/wsl.conf /dev/null EOF [boot] systemdtrue [interop] enabledtrue appendWindowsPathtrue EOF[boot] systemdtrue是核心。appendWindowsPathtrue表示把 Windows 的 PATH 附加到 Linux 的 PATH 里好处是能直接在 Ubuntu 里调用code、notepad.exe这类 Windows 程序坏处是 PATH 会变得很长某些脚本遍历 PATH 时会慢。我个人的取舍是保留它因为经常要用。改完在 PowerShell 里wsl --shutdown重新进来验证systemctl --version systemctl status第一条能输出 systemd 版本号就说明生效了。如果没生效检查配置文件有没有拼写错误以及 WSL 版本是不是 0.67.6 以上更早的版本对 systemd 支持有 bugwsl --update一下。接下来装 SSH 服务端sudo apt install -y openssh-server sudo systemctl enable --now ssh sudo systemctl status ssh默认配置下 SSH 是禁止密码登录的如果你要用密码登录改/etc/ssh/sshd_configPasswordAuthentication 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] networkingModemirrored dnsTunnelingtrue firewalltrue autoProxyfalsenetworkingModemirrored让 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 里按CtrlShiftP执行Shell Command: Install code command in PATH。4.5 CUDA、MuJoCo 这类重型环境的注意事项有同学装 WSL 就是为了跑深度学习或者机器人仿真。这里有两个关键认知踩错会浪费一整天。第一不要在 WSL 里装显卡驱动。Windows 侧装好 NVIDIA 的驱动就够了版本要够新WSL 会自动把驱动映射进来。在 Ubuntu 里执行nvidia-smi如果能看到显卡信息说明映射成功。这时候你去 Ubuntu 里再装一遍.run格式的驱动大概率把环境搞崩。然后装 CUDA Toolkitsudo 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 或 OSMesaexport MUJOCO_GLegl这样能绕开窗口系统直接在显卡上渲染速度快很多也不会因为没有显示器而报错。至于你说想用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 里用cpcp -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,umask22,fmask11改完wsl --shutdown重启生效。这里要提醒一句别在 Windows 分区里乱改权限很可能把 Windows 程序的访问搞乱谨慎使用。解压乱码。从 Windows 下载的中文 ZIP 包在 Linux 下解压文件名经常变成一堆问号或者方框。原因是 ZIP 格式没有强制规定文件名编码Windows 用 GBKLinux 按 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] memory12GB processors8 swap8GB autoMemoryReclaimgradualmemory限制 WSL 最多用多少内存按你机器的实际情况给一般给总内存的一半到三分之二。processors限制 CPU 核心数不写就是全给。swap是交换分区大小默认是内存的 25%跑大内存任务时适当加大能避免 OOM。autoMemoryReclaimgradual是自动回收策略空闲内存会逐步还给 Windows这个选项需要 WSL 2.0 以上版本。配置改完必须wsl --shutdown才能生效改.wslconfig不影响正在运行的实例很多人改了没效果就是因为没重启。磁盘回收稍微麻烦点。删掉 Linux 里的大文件后ext4.vhdx不会自动缩小。先确认 WSL 支持稀疏文件开关wsl --manage Ubuntu-22.04 --set-sparse true这个命令把 vhdx 标记为稀疏文件系统会自动回收未使用的块。如果版本太老不支持就走 diskpartwsl --shutdown diskpart进入 diskpart 交互界面后select vdisk fileC:\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 maximum204800单位 MB这里是 200GB然后进 Linux 执行sudo resize2fs /dev/sdd设备名用df -h确认。6. 常见问题排查速查表6.1 报错信息对照表下面这张表是我这几年实际遇到过、或者帮别人排查过的典型问题按报错特征整理。报错/现象大概率原因处理方式wsl --install报无法解析服务器名称DNS 或网络限制换网络改用离线包安装启动报虚拟机平台功能未启用可选功能没开或没重启手动 dism 启用后重启启动报WSL 版本太旧内核组件与发行版不匹配wsl --update失败则手动装内核 MSIwsl -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 相关包无头场景切 EGLUbuntu 里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的。刚装好系统后升级几百个包中途如果 CtrlC 中断可能留下 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 用 venvNode 用 nvm 管理多版本依赖缓存统一放在~/.cache/里。这样清理的时候直接删缓存目录就行不会误伤项目代码。还有一个习惯是把常用的长命令写成 alias放在~/.bash_aliases里。比如alias llls -alhF、alias gsgit status、alias portsss -tulnp。这些看起来是小打小闹但每次省下的几秒钟一年下来相当可观。WSL 这个工具最让人舒服的地方在于它让你不用在用 Windows 办公和用 Linux 干活之间做选择。装一次可能花你四十分钟但这四十分钟换来的是一个随时能wsl进去、环境和你服务器保持一致、文件还能互相拖的 Linux 环境。真正需要花心思的从来不是那条安装命令而是搞清楚资源放在哪、配置写成什么样、出了问题往哪儿查——这三件事想明白了剩下的都是熟练度问题。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询