WSL2常用命令速查:安装、文件互访、迁移与systemd实践
WSL 用久了会发现一个挺有意思的现象同事来问的问题里装不上的其实不到三成剩下七成都卡在「这条操作对应的命令到底叫什么」上。我自己的 WSL 常用命令清单从最初的一张便签滚到现在按场景分了五大类每次换机器或者帮人配环境直接照着敲就行。这份清单主要解决三个事一是把高频操作压成一行命令二是把踩过的坑标出来免得重复掉进去三是让 Windows 和 Linux 两边的文件、网络、工具链能顺畅接上。不管你是刚在 Windows 10 或 Windows 11 上装完 Ubuntu 22.04还是已经把 WSL2 当主力生产力环境用了半年下面这些内容应该都能捞到几条能直接用的东西。1. 先想清楚命令为什么要这样分类1.1 WSL1 和 WSL2 的差别决定了命令的适用边界WSL2 底层是一台跑在 Hyper-V 轻量虚拟机里的真 Linux 内核WSL1 则是把 Linux 系统调用翻译成 Windows 调用。这个差别直接体现在命令行为上WSL1 里访问/mnt/c和访问本地目录速度差不多因为压根没有跨虚拟机的文件系统转换WSL2 里跨/mnt/c读写会走 9P 协议小文件多的时候慢得明显。所以我在 WSL2 下有一条硬规矩任何 git 仓库、node_modules、Python 虚拟环境一律放在 Linux 侧的~/下面绝不放在/mnt/c或者/mnt/d的项目目录里。这条规矩不是洁癖实测跑npm install一个中等规模前端项目放在/mnt/d下要三四分钟放在~/projects下四十秒左右差距就是这么直接。判断自己当前是哪个版本用的是这条命令wsl --list --verbose # 简写 wsl -l -v输出的VERSION那一列是 1 还是 2 一目了然。如果某个发行版还是 1可以原地升级wsl --set-version Ubuntu-22.04 2这个转换过程会花几分钟取决于发行版里的文件数量中途别关窗口。转完之后原来的发行版内容都在只是被搬进了 ext4 虚拟磁盘文件里。1.2 命令分层的思路Windows 侧和 Linux 侧别混着记刚上手最容易混的一点是wsl开头的命令是 Windows 侧的得在 PowerShell 或者 CMD 里敲ls、cd、systemctl这些是 Linux 发行版内部的。很多人习惯在 WSL 终端里敲wsl --shutdown结果报command not found就是因为串了层。我的记忆办法是看「这个操作管的是哪一层」。管发行版整体安装、卸载、导入、导出、关机的走 Windows 侧wsl.exe管发行版内部文件、进程、服务、包的走 Linux 侧常规命令管 Windows 和 Linux 之间互通的路径转换、剪贴板、调用 exe两边都可以但通常有更顺手的一边。按这个思路我把日常用到的命令分成四大块安装与初始化、日常启停与状态、文件系统互访、备份迁移与集成。后面每个大块单独讲命令都配上实际用到的场景和参数解释。1.3 一份能贴在显示器边上的速查表先把最常用的十几条列出来方便直接抄目的命令执行位置查看已安装发行版与版本wsl -l -vWindows查看可在线安装的发行版wsl -l -oWindows安装默认发行版wsl --installWindows安装指定发行版wsl --install -d Ubuntu-22.04Windows关闭全部发行版wsl --shutdownWindows关闭单个发行版wsl -t Ubuntu-22.04Windows更新 WSL 内核wsl --updateWindows查看 WSL 状态与内核版本wsl --status/wsl --versionWindows从 Windows 进入某发行版wsl -d Ubuntu-22.04Windows以指定用户进入wsl -d Ubuntu-22.04 -u rootWindows在发行版内执行单条命令wsl -d Ubuntu-22.04 -- ls -al ~WindowsWindows 路径转 Linux 路径wslpath -u D:\code两边都行Linux 路径转 Windows 路径wslpath -w ~/projects两边都行设置默认发行版wsl --set-default Ubuntu-22.04Windows设置默认版本wsl --set-default-version 2Windows这张表不需要背wsl --help随时能看到全量参数。真正要记住的是思路要动发行版本身就用wsl前缀要动里面的东西就正常敲 Linux 命令。2. 安装与初始化让 wsl --install 不再卡住2.1 wsl --install 背后到底做了什么在较新的 Windows 10 和 Windows 11 上wsl --install这一条命令其实干了四件事开启「适用于 Linux 的 Windows 子系统」这个可选功能、开启虚拟机平台功能、下载安装 WSL 内核更新包、从商店拉一个默认发行版现在是 Ubuntu。正因为串了这么多步骤任何一步网络不通都会表现为「卡住不动」。几个实用参数值得单独拎出来# 只装 WSL 本身不装任何发行版 wsl --install --no-distribution # 指定发行版并且装完不自动进入 wsl --install -d Ubuntu-22.04 --no-launch # 强制走网络下载内核更新包而不是等系统组件更新 wsl --install --web-download--web-download这个参数在不少环境下是救命稻草。系统自带的组件更新通道有时候会长时间没响应强制走网络下载反而更快更稳。安装完记得重启一次功能开关生效需要重启系统这一步省不掉。2.2 安装速度慢的几种破局方式wsl --install慢一般慢在两段一是内核更新包下载二是发行版镜像从商店拉取。第一段用--web-download通常能改善第二段如果迟迟不动我会直接换思路走「离线包 导入」这条路。具体做法是拿到发行版的 tar 包比如 Ubuntu 22.04 的 rootfs 压缩包然后用导入命令直接建一个发行版# 先建一个空目录作为新发行版的存放位置 mkdir D:\wsl\Ubuntu-22.04 # 从 tar 包导入目标目录放最后 wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\downloads\ubuntu-22.04-rootfs.tar --version 2导入这条路有个副作用必须提前说导入后的默认用户是root而不是安装时让你创建的那个普通用户。很多人导入完发现终端提示符变成#以为是装坏了其实只是没配用户。2.3 导入之后必须补的两步配置第一步是建用户并设密码# 在导入的发行版里执行 adduser yourname usermod -aG sudo yourname第二步是写/etc/wsl.conf告诉 WSL 默认用哪个用户登录# /etc/wsl.conf [user] defaultyourname [automount] enabledtrue root/mnt/ optionsmetadata,umask22,fmask11 [interop] enabledtrue appendWindowsPathtrue写完保存回到 PowerShell 执行一次wsl --shutdown再进来身份就对了。metadata这个选项建议加上它让 Linux 侧能正确识别文件权限位否则在/mnt/c下执行chmod x会毫无反应脚本没法跑。appendWindowsPath控制的是 Linux 的PATH里要不要塞进 Windows 的路径。默认是true好处是能在 WSL 里直接敲code、explorer.exe坏处是如果 Windows 的PATH特别长Linux 下which之类命令会变慢。我个人倾向保留true因为便利性收益更大。2.4 装完先跑一遍体检命令新装好的环境我习惯跑这几条确认状态# 系统信息 uname -a lsb_release -a # 内核是不是微软定制版 cat /proc/version # 内存和 CPU 是否按配置生效 free -h nproc # 网络是否通 ping -c 3 8.8.8.8如果free -h显示的内存和你.wslconfig里配的对不上通常是配置没生效执行wsl --shutdown完全重启一次即可。.wslconfig这个文件放在 Windows 用户目录下比如C:\Users\yourname\.wslconfig格式是这样的# C:\Users\yourname\.wslconfig [wsl2] memory8GB processors4 swap4GB localhostForwardingtruememory给多少合适取决于你物理内存。16G 的机器给 6 到 8G 比较舒服32G 的给 12 到 16G。别把物理内存全给出去Windows 本身还要用。swap给 2 到 4G 就够跑编译任务时能顶一下内存峰值。3. 日常高频命令启停、切换与状态查询3.1 发行版生命周期命令的完整对照日常打交道最多的就是这几条我把它们整理在一起顺便标注容易记混的地方操作命令说明列出已安装wsl -l -v-v能看到版本和运行状态列出可安装wsl -l -o只显示在线可装的发行版进入默认发行版wsl等价于wsl ~进入指定发行版wsl -d Ubuntu-22.04-d后面跟发行版名称以指定用户进入wsl -d Ubuntu-22.04 -u root排查权限问题时常用回到用户主目录wsl ~避免默认落在 Windows 目录终止单个发行版wsl -t Ubuntu-22.04终止后状态变为 Stopped终止全部wsl --shutdown回收 vmmem 内存的常用手段注销并删除发行版wsl --unregister Ubuntu-22.04数据会一起没操作前先导出设置默认发行版wsl --set-default Ubuntu-22.04之后直接敲wsl进的就是它wsl --unregister这条我要多说一句它不只是「卸载」而是把整个发行版的虚拟磁盘一起删掉里面的代码、依赖、数据库全没。真要清理先导出备份确认没问题再注销。3.2 跨系统执行命令的实用场景wsl后面跟--可以直接在发行版里执行一条命令并返回结果不进入交互式终端。这个特性在脚本里非常好用# 在 Windows 侧查 WSL 里的磁盘占用 wsl -d Ubuntu-22.04 -- df -h # 直接从 Windows 侧跑一个构建 wsl -d Ubuntu-22.04 -- bash -lc cd ~/projects/app npm run build # 把 Windows 上的文件拷进 WSL 再处理 wsl -d Ubuntu-22.04 -- cp /mnt/d/data/input.csv ~/work/反过来在 WSL 里调用 Windows 程序也是通的前提是appendWindowsPath没关# 打开资源管理器并定位到当前 Linux 目录 explorer.exe . # 用 Windows 的记事本打开一个文件 notepad.exe ~/notes/todo.txt # 把文本送到 Windows 剪贴板 cat ~/.ssh/id_ed25519.pub | clip.exe最后那条把公钥塞进剪贴板是我觉得最省事的一个小技巧。以前总是cat出来选中复制自从知道clip.exe之后直接粘贴到网页或者工单系统里就完事。3.3 状态、日志与版本排查遇到行为异常先看状态和版本wsl --status wsl --versionwsl --status会告诉你默认发行版、默认版本、内核版本。wsl --version是较新版本才有的输出更详细包括 WSLg 版本。如果看到类似「你当前 WSL 版本过旧」的提示直接更新wsl --update wsl --update --web-download更新完仍然提示版本问题可以试试回滚到商店版本wsl --update --rollback3.4 关机之后内存为什么不立刻降下来在任务管理器里会看到一个叫vmmem或者Vmmem WSL的进程占着不少内存。这是因为 WSL2 的虚拟机在后台保留了一段时间。想立刻回收就执行wsl --shutdown注意这会把所有发行版都关掉正在跑的编译、服务、数据库连接都会断。更温和的做法是只关不用的那个发行版wsl -t Ubuntu-22.04我一般的习惯是切到别的项目之前把上一个项目的发行版单独终止既回收内存又不影响其他环境。如果长期占用偏高可以在.wslconfig里设memory上限另一个思路是开自动内存回收较新版本支持[wsl2] memory8GB autoMemoryReclaimgradual这个选项让 WSL 在空闲一段时间后主动把内存还给 Windows对笔记本续航有实际帮助。4. 文件系统互访路径映射是效率的关键4.1 从 Windows 访问 Linux 文件的两种写法浏览器地址栏或者资源管理器里输入这两个路径之一\\wsl$\Ubuntu-22.04\home\yourname \\wsl.localhost\Ubuntu-22.04\home\yourname两者的区别在于\\wsl$是较老的写法在某些网络环境下会被拦住\\wsl.localhost是新推荐写法兼容性更好。如果\\wsl$打不开换成后一个基本就好了。顺手可以把常用目录映射成网络驱动器之后在 VS Code 里打开更方便net use Z: \\wsl.localhost\Ubuntu-22.04\home\yourname需要删掉映射就用net use Z: /delete。4.2 从 Linux 访问 Windows 文件与 wslpath 的妙用Windows 的盘符在 WSL 里挂在/mnt下面C 盘是/mnt/cD 盘是/mnt/d以此类推。手动拼路径容易出错特别是遇到反斜杠和空格这时候wslpath就派上用场了# Windows 路径转 Linux 路径 wslpath -u D:\code\my project # 输出/mnt/d/code/my project # Linux 路径转 Windows 路径 wslpath -w ~/projects/app # 输出\\wsl.localhost\Ubuntu-22.04\home\yourname\projects\app # 直接拿到 Windows 风格的绝对路径便于贴到其他程序里 wslpath -w -a ./dist-a参数是把相对路径转成绝对路径。这个小功能在写脚本时特别有用比如要把构建产物交给一个 Windows 程序处理路径格式不对就会报错用wslpath转一下基本不会出问题。4.3 项目目录该放哪一条经验换来的性能差距前面提过一次这里展开说。WSL2 访问/mnt/*走的是网络文件协议元数据操作stat、open、close开销很大。前端项目node_modules动辄几万个文件放在/mnt/d下npm install和热更新都会明显变慢。我的做法是在 Linux 侧建一个统一的工作目录mkdir -p ~/work然后 Windows 侧通过\\wsl.localhost\Ubuntu-22.04\home\yourname\work访问需要拖文件的时候直接开这个路径。反过来如果有些数据必须留在 Windows 盘就只放源数据处理完的中间产物写到 Linux 侧。注意把 git 仓库放在/mnt/c下还有一个隐性坑行尾符和文件权限经常被 Windows 侧程序改来改去。git status动不动就显示一堆修改实际上是权限位变动。把仓库移到 Linux 侧能根治这类问题。4.4 文件传输的几种命令组合小文件直接cpcp /mnt/d/data/config.json ~/work/大目录用rsync更可靠能续传也能看进度rsync -avh --progress /mnt/d/dataset/ ~/work/dataset/从 Linux 往外拷也一样方向反过来即可。如果数据量大且只做一次性迁移先在 Windows 侧把目录压缩成 tar再在 WSL 里解压速度会快不少tar -xf /mnt/d/archive/data.tar.gz -C ~/work/原因还是那一条小文件的跨系统读写代价高打包成一个文件之后跨系统只走一次大文件传输效率天差地别。5. 备份、迁移与磁盘空间管理5.1 导出与导入换机器最稳的方案wsl --export会把整个发行版打包成一个 tar 文件包含系统、用户目录、已装的软件。换电脑时把 tar 拷过去导入环境几乎原样恢复# 导出路径自己定 wsl --export Ubuntu-22.04 D:\backup\ubuntu-2204-20250101.tar # 想压缩体积可以加 --vhd导出成 vhdx 格式 wsl --export Ubuntu-22.04 D:\backup\ubuntu-2204.vhdx --vhd导出时间取决于发行版大小几十 G 的话喝杯咖啡的功夫。导入前先确认目标目录所在磁盘有足够空间导入是解包展开占用的空间和导出文件大小不是一回事。导入命令前面提过这里补两个细节。一是导入时如果同名发行版已存在会直接报错得先注销或者改个名字二是导入后的发行版默认挂在root下记得按 2.3 节的步骤配/etc/wsl.conf。5.2 迁移到非系统盘的完整步骤C 盘空间紧张是 WSL 用户的常见困扰把 ext4 虚拟磁盘搬到 D 盘是标准解法。我用得最顺的流程是「导出 导入 注销」全程不用碰底层的 vhdx 文件# 1. 先关掉所有 WSL wsl --shutdown # 2. 导出到目标盘 wsl --export Ubuntu-22.04 D:\wsl\ubuntu-backup.tar # 3. 注销原发行版 wsl --unregister Ubuntu-22.04 # 4. 在新的位置导入 mkdir D:\wsl\Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl\ubuntu-backup.tar --version 2 # 5. 恢复默认用户配置后重启 wsl --shutdown第 5 步别忘了注销再导入之后/etc/wsl.conf里的默认用户配置还在因为它在系统里所以通常不需要重新写。但如果导入的是别人给的 tar 包那就得自己配。5.3 虚拟磁盘瘦身删了文件为什么空间没回来WSL2 的磁盘是一个只增不减的 vhdx 文件。你在里面删了 20G 的东西Windows 侧的 vhdx 文件大小纹丝不动。这不是 bug是虚拟磁盘的设计。较新版本的 WSL 支持稀疏磁盘可以自动回收wsl --manage Ubuntu-22.04 --set-sparse true如果没有这个参数就手动压缩# 关闭 WSL wsl --shutdown # 打开 diskpart diskpart进入交互后依次执行select vdisk fileD:\wsl\Ubuntu-22.04\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exitcompact vdisk这步的时间取决于磁盘大小和碎片程度几十 G 的话可能要十几分钟。压缩前建议先导出备份虽然这个操作本身风险不高但涉及底层磁盘文件留个后路总是好的。5.4 注销和卸载的区别值得说清楚wsl --unregister注销的是发行版虚拟磁盘文件会一并删除。而「卸载 WSL」在 Windows 的「启用或关闭 Windows 功能」里关掉那个可选功能是把整个子系统关掉所有发行版的注册信息还在重新开启功能后能继续用。如果你只是想让某个发行版不再出现在wsl -l列表里用--unregister如果是彻底不用 WSL 了先备份再用系统功能关闭。顺序弄反了会比较麻烦。6. 图形界面、GPU 与容器集成命令6.1 图形程序能直接跑靠的是 WSLgWindows 11 以及较新的 Windows 10 上WSL 内置了 WSLg图形程序开箱可用。验证方法很简单# 装一个小工具试试 sudo apt update sudo apt install -y x11-apps xeyes如果弹出一个小眼睛窗口说明图形链路通了。环境变量里DISPLAY一般不需要手动设WSLg 会自己注入。这个能力带来的便利是一些只有图形界面的工具比如某些调试器、数据库客户端、图像处理软件可以直接装在 WSL 里跑不用在 Windows 上再装一份环境更统一。6.2 GPU 直通的检查命令想在 WSL 里做深度学习前提是 Windows 侧装好显卡驱动注意是 Windows 版驱动不要在 WSL 里装 Linux 显示驱动。装完后WSL 里应该能直接用nvidia-smi这条命令能输出显卡型号、驱动版本、显存占用说明直通正常。如果提示找不到命令先确认驱动装没装再确认 WSL 是不是最新wsl --update路径上有个细节WSL 会把宿主机的驱动库挂到/usr/lib/wsl/lib这个目录通常已经加进动态链接库搜索路径了。手动检查可以看ls /usr/lib/wsl/lib echo $LD_LIBRARY_PATH接下来装 CUDA 工具链选 WSL 专用的版本就行。装完用nvcc --version验证。跑训练之前建议先用一个小张量试一下确认能正常调用显卡避免跑了几小时才发现一直在用 CPU。6.3 Docker 集成的排查思路很多人是在 WSL 里用 Docker Desktop 的 WSL 后端报错最典型的一种是启动时提示连不上远程计算机或者引擎起不来。排查顺序我一般这么走先在 PowerShell 里确认 WSL 本身正常wsl -l -v wsl --status如果列表能正常输出、发行版状态正常那问题多半在 Docker Desktop 那边。可以做的事包括确认 Docker Desktop 的设置里「使用基于 WSL 2 的引擎」已勾选并把要用的发行版加进集成列表然后完全退出 Docker Desktop 再重开还不行就重置一下 Docker 的 WSL 数据。如果反过来想在发行版里直接用docker命令而不经过桌面版也可以装发行版原生的 Docker 引擎用systemctl管理前提是发行版启用了 systemd。6.4 systemd 的启用与常用服务命令新版本 WSL 支持 systemd。在/etc/wsl.conf里加一行[boot] systemdtrue然后在 PowerShell 执行wsl --shutdown重新进入后systemctl status能正常输出就说明 systemd 起来了。之后systemctl start/stop/enable这些常规操作都能用装 MySQL、Redis、Nginx 之类的服务就顺理成章了。统一把服务装进 WSL 之后开机不用等它们启动需要时wsl进来systemctl start一下用完wsl --shutdown一起关掉这种按需启动的方式对笔记本很友好。7. 开发环境联调与终端体验7.1 VS Code 接 WSL 的正确姿势在 WSL 的项目目录下敲code .VS Code 会以远程模式打开当前目录终端、调试器、扩展都在 Linux 侧运行文件读写走的是 Linux 文件系统前面说的性能问题自然就绕开了。第一次用需要装 Remote 开发相关的扩展装完一次就行。如果code命令不存在通常是appendWindowsPath被关了或者 VS Code 装在非默认位置。可以手动在 Linux 的~/.bashrc里加个别名指向code的命令行脚本路径一般在/mnt/c/Users/你的用户名/AppData/Local/Programs/Microsoft VS Code/bin/code。Windows 侧的 VS Code 窗口和 WSL 侧的远程窗口是两个概念看到窗口标题里写着远程主机名就说明连对了。7.2 终端字体与显示效果的调优想让 WSL 终端接近 macOS 那种清爽感主要调三处字体、行高、配色。字体选等宽且带编程连字的比如 Cascadia Code、JetBrains Mono、Fira CodeWindows Terminal 的settings.json里对应字段是profiles: { defaults: { font: { face: JetBrains Mono, size: 11, weight: normal }, opacity: 95, padding: 8, 8, 8, 8 } }face换字体size控制字号opacity做轻微透明能让层次更舒服padding是留白。行距在 Windows Terminal 里没有直接参数靠字体和字号搭配来调。配色方面主题里选一个低饱和的配色方案长时间看眼睛不容易累。另外建议把光标形状设成竖线并且开启闪烁配cursorShape字段即可。7.3 WSL 里必备的 Linux 命令清单既然 WSL 里跑的是真 Linux常规命令就是基本功。我按使用频率列一批都是日常绕不开的文件与目录ls -alh # 带权限、大小、隐藏文件 cd - # 回到上一个目录 du -sh * # 看每个子目录占用 find . -name *.log -size 100M # 找大日志 tree -L 2 # 两层的目录树文本处理grep -rn TODO . --include*.py sed -i s/old/new/g config.ini awk -F, {print $1, $3} data.csv | head sort -k2 -nr access.log | head -20进程与网络ps aux | grep node top -o %MEM kill -9 pid ss -tulnp # 看监听端口比 netstat 更快 curl -I https://example.com打包与传输tar -czvf archive.tar.gz ./dir tar -xzvf archive.tar.gz -C /tmp rsync -avh --progress src/ userhost:/dst/这些命令在 WSL 里的行为和标准 Linux 完全一致学一次通用。真正需要额外注意的是路径涉及/mnt的操作都会慢一些能用 Linux 侧路径就别用跨系统路径。7.4 和 git、docker、k8s 等工具的衔接git装在 Linux 侧配置一次全局信息git config --global user.name yourname git config --global user.email youexample.com git config --global core.autocrlf inputcore.autocrlf input这行值得单独配能避免行尾符被反复改写。如果要在 WSL 里用 Windows 侧的凭据可以配合credential.helper指向 Windows 的凭据管理器省去重复输入。kubectl和docker都是命令行工具装在 Linux 侧体验最好配置文件和上下文都存在~/.kube和~/.docker下跟着发行版一起走换机器导出导入就完事。8. 常见问题排查速查表8.1 报错清单与逐条处理报错或现象常见原因处理办法提示 WSL 版本过旧内核未更新wsl --update必要时加--web-download安装发行版卡住不动商店通道不通改用离线 tar 包wsl --import导入后提示符是#默认用户为 root写/etc/wsl.conf配[user] default打不开\\wsl$旧路径在新环境受限换成\\wsl.localhost\发行版名chmod x无效挂载未开 metadata/etc/wsl.conf的 automount 加metadata服务无法用 systemctl未启用 systemd[boot] systemdtrue后wsl --shutdownvmmem 内存一直很高虚拟机未及时回收wsl --shutdown或配autoMemoryReclaim删文件后磁盘不释放vhdx 只增不减开启稀疏磁盘或 diskpart 压缩网络时通时断DNS 或转发配置问题检查resolv.conf与localhostForwarding8.2 网络与 DNS 类问题的排查顺序WSL2 的网络是 NAT 模式Linux 侧有一套自己的 DNS 配置。遇到解析异常先看/etc/resolv.confcat /etc/resolv.conf默认情况下这个文件由 WSL 自动生成会指向虚拟网关。如果发现解析经常失败可以关掉自动生成改为手动配# /etc/wsl.conf [network] generateResolvConffalse然后在/etc/resolv.conf里写自己需要的 DNS 地址并把文件设为不可变防止被覆盖sudo chattr i /etc/resolv.conf较新版本的 WSL 支持镜像网络模式在.wslconfig里配networkingModemirrored让 Linux 侧和 Windows 侧共享网络栈localhost转发和局域网访问都会更顺。这个模式对 Windows 版本有要求太旧的版本不支持配了不生效就先升级。服务端口映射也是常见需求。默认情况下Linux 侧监听的端口 Windows 侧可以通过localhost访问如果访问不到先确认服务是监听在0.0.0.0还是127.0.0.1。监听在127.0.0.1时某些转发场景会失败改成0.0.0.0通常能解决。8.3 权限与性能类问题的处理心得权限问题很大一部分来自/mnt下的挂载选项。除了前面说的metadataumask和fmask也会影响文件权限表现。默认配置下所有文件看起来都是 777实际上 Windows 侧并没有这个概念所以别指望在这上面调权限。Linux 侧的文件就正常了chmod、chown都按标准行为走。所以我一直建议需要控制权限的东西放 Linux 侧需要和 Windows 程序共享的东西放/mnt两边各司其职。性能方面有几条实测有效的做法。一是把经常编译的项目放 Linux 侧二是关掉不必要的 Windows 路径注入如果appendWindowsPath造成which卡顿三是给.wslconfig里的内存和 CPU 设一个合理上限别让它把整机资源吃满四是定期清理 vhdx 的空洞磁盘 IO 会明显变好。8.4 我自己踩过的几个坑第一个坑是导出时没关 WSL。导出过程中如果发行版还在运行tar 包有可能不完整导入后出现奇怪的损坏。后来我养成了固定动作导出前先wsl --shutdown。第二个坑是在/mnt/c下直接git clone。前面说过性能问题实际遇到过更麻烦的情形Windows 侧的安全软件扫描目录时锁住文件导致 git 操作随机报错排查了半天才发现原因。换到 Linux 侧之后再没出现过。第三个坑是忘记配置默认用户导入的发行版一直用 root 写文件结果~/.ssh之类目录的属主全变成 root普通用户下无法读取。修复办法是回到 root 身份把属主改回来chown -R yourname:yourname /home/yourname第四个坑是磁盘空间。有次编译产生了几十 G 的中间产物删完之后 C 盘空间没回来一度以为系统出问题。了解 vhdx 只增不减之后做了压缩操作空间立刻回来。从那次起我把 WSL 的磁盘目录放在数据盘并且在.wslconfig里限制了内存避免再出现这种情况。真要把这套东西用顺我的体会是把命令分成「管发行版」和「管发行版内部」两类来记把文件分成「Linux 侧」和「Windows 侧」两类来放剩下的就都是熟练度问题。上面这些命令不需要一次全记住遇到具体场景回来翻对应那一节就行。