
刚接触 WSL 的人十个里有八个会跟我当年一样在 Windows 命令行里敲了个wsl --install看到一堆输出飘过去然后一脸懵——这到底装到哪去了怎么进 Linux怎么访问我 D 盘里的文件为什么wsl命令和Linux命令总有一种割裂感这篇文章就是要把 WSL 的命令体系彻底讲透从安装、路径转换、开发环境搭建到发行版迁移、网络排查、常见报错全部用“命令 实操经验”的方式捋一遍。适合两类人一是 Windows 下做开发、想有一套顺手 Linux 环境的朋友二是已经装了 WSL 但遇到各种奇怪问题、不知道怎么排查的老用户。我尽量按实际使用频率来排布内容你会看到哪些命令值得背下来哪些只需收藏备用。1. 安装与初始化从零开始把 WSL 装到顺手1.1 安装命令与 WSL 1 / WSL 2 的选择逻辑先说最基础的。Win10 较新版本和 Win11 都支持一条命令直接装wsl --install这条命令做完的事其实不少启用 Windows 的“适用于 Linux 的 Windows 子系统”可选功能、启用虚拟机平台、下载并安装默认发行版通常是 Ubuntu然后提示你重启。装完重启后首次进入需要创建 Linux 用户名和密码。还有一个很多人会碰到的变体wsl --install --web-download--web-download的意思是从网络直接下载发行版而不是用 Windows 商店的安装通道。某些离线环境或商店组件有问题时这条命令能救急但它对网络质量要求更高我曾经在没加这个参数卡住后加上它反而顺利装完了后来才明白是商店通道本身出问题了。如果你发现wsl --install长时间卡住不动多半就是下载源的问题后面第 5 章我再细说排查思路。装完之后强烈建议先确认两件事wsl --version # 查看 WSL 程序自身版本WSL 2.0 会显示详细版本号 wsl -l -v # 列出已安装发行版及当前 WSL 版本wsl -l -v输出里会看到你安装的发行版名字以及VERSION列是 1 还是 2。WSL 2 基于真正的轻量虚拟机文件系统性能和 Docker 兼容性都大幅领先除非硬件太老不支持虚拟化否则一律用 2。注意不要在不知道-l -v含义时乱加参数。wsl -l -v等价于wsl --list --verbose而wsl -l -o是查看在线可装发行版列表。这几个简写经常有人记混。查看在线发行版列表用wsl --list --online这里会列出 Ubuntu、Debian、Kali、openSUSE 等。安装指定发行版就是wsl --install -d Debian我在一台老笔记本上装过 Debian 13当时还在测试期步骤跟 Ubuntu 几乎一样wsl --install -d Debian然后进系统改软件源、装开发工具没有遇到额外阻碍。Debian 的资源占用比 Ubuntu 更小如果你只是需要基础 Linux 环境可以试试它。1.2 把系统装到 D 盘迁移发行版与默认路径设置wsl --install默认把虚拟磁盘放到 C 盘用户目录下路径类似C:\Users\你的用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx这个文件就是整个 Linux 系统的“硬盘”几十 GB 很正常。C 盘紧张的人迟早会遇到“WSL 挤爆系统盘”的问题。官方支持的迁移方式是导入导出不是直接剪贴文件# 1. 先关闭所有 WSL 分发版 wsl --shutdown # 2. 导出当前发行版为 tar 文件 wsl --export Ubuntu D:\wsl_backup\ubuntu.tar # 3. 注销原发行版会删除原系统但 tar 已保存 wsl --unregister Ubuntu # 4. 导入到新位置 wsl --import Ubuntu D:\WSL\Ubuntu D:\wsl_backup\ubuntu.tar --version 2打包解包的过程可能持续十几分钟tar 文件体积等同于已用空间。等导入完成后再执行wsl就能进入系统了。这里有个坑用--import导入的发行版默认登录用户是 root而不是你原来的账户。补救方法是进出 WSL 后执行# 在 WSL 里进入系统后 sudo nano /etc/wsl.conf在文件中写入[user] default你的用户名然后wsl --shutdown再重进用户名就对了。这个配置文件还能设置挂载参数、系统初始化命令等后面章节会用到。如果你没有迁移需求只是想让以后新装的发行版都放 D 盘那没有全局设置项只能按“导出-注销-导入”这条路走。所以最省事的做法其实是第一次安装前就预估好空间C 盘紧张就直接用wsl --import方案或者干脆先清理 C 盘。网上流行的“改环境变量”办法实测并不对所有 Windows 版本生效别浪费时间。2. 日常高频命令文件、路径与磁盘操作必知必会2.1 路径互转wslpath 与 /mnt 挂载机制Windows 和 Linux 的路径体系完全不同。在 WSL 里Windows 的各个盘符会被挂载到/mnt目录下C:\ → /mnt/c/ D:\ → /mnt/d/也就是说你在 WSL 里想读取 D 盘某个文件夹直接cd /mnt/d/项目文件夹就行。反过来在 Windows 的 cmd 或 PowerShell 里要看 Linux 内部路径可以这样进wsl cd ~ wsl pwd不过更常用的是把 WSL 里当前目录直接映射到 Windows 文件资源管理器explorer.exe .这个命令会在 Windows 资源管理器里打开当前 Linux 目录注意它实际访问的是\\wsl$\Ubuntu\home\用户名\...这个网络路径。喜欢用文件管理器拖拽文件的人这条命令可以帮大忙。真正的“路径转换神器”是wslpathwslpath C:\Users\abc\test.txt # 输出 /mnt/c/Users/abc/test.txt wslpath -w /home/abc/test.txt # 输出 C:\Users\abc\AppData\Local\... 这类 UNC 路径-w表示转成 Windows 路径-m表示以/分隔的 Windows 路径。写脚本时如果你需要把 WSL 里的文件路径传给 Windows 程序先wslpath -w一下避免手滑填错。2.2 在 WSL 中访问 Windows 磁盘与文件权限那些事访问/mnt/c和/mnt/d时很多新手会发现 Linux 文件权限显示成drwxrwxrwx甚至chmod 777都不生效。这是 WSL 的 DrvFs 文件系统挂载特性导致的——它默认把 Windows 文件系统的权限映射成了“所有人可读写”因为 Windows 本身没有 Linux 那套权限模型。想调整挂载行为在/etc/wsl.conf里加[automount] enabled true options metadata,umask22,fmask11加了metadata之后WSL 会把 Linux 权限记录在 Windows 文件系统的扩展属性里chmod和chown就能在 /mnt 下使用了。我做 Node 项目时经常因为node_modules权限问题崩溃加了这个配置之后少了很多怪毛病。还有一个非常实用的场景Windows 下解压 tar.gz 包经常不顺手其实可以直接在 WSL 里操作 Windows 文件# 在 WSL 中先切到 /mnt/d 下的目录 cd /mnt/d/downloads tar -xzf 某压缩包.tar.gz因为 WSL 的 tar 命令处理符号链接、权限比 Windows 自带解压工具靠谱得多。热词里有人问“Windows 怎么用命令解压 tar”答案其实就是“进 WSL 用 tar”没有比这更高效的方式了。注意给/mnt/c里的项目跑npm install或pip install跨文件系统的 IO 会比较慢而且偶发文件锁问题。正式开发项目尽量放在 Linux 原生路径~/下别放在 /mnt 下跑大任务。2.3 从 Windows 命令行调用 WSL 单条命令除了进入交互式 Shellwsl命令可以直接执行单条 Linux 命令这个技巧在写自动化脚本时非常实用wsl ls -la /home wsl sudo apt update wsl python3 /home/user/test.py甚至可以把 Windows 环境变量传进去wsl -e sh -c echo $env:USERNAME在写 Windows 批处理时需要 grep 或 awk 处理文本我也会直接调 WSLwsl grep error C:\logs\app.log注意这里传入的是 Windows 路径WSL 会自动转换但转换逻辑偶尔不如wslpath可控复杂路径建议先手动转好。3. 开发环境搭建VS Code、Docker、CUDA 与 PyTorch 实战3.1 在 VS Code 中使用 WSL不只是“打开远程”VS Code 官方对 WSL 的支持已经到了“无感”的程度。装好 [WSL] 扩展后在 WSL 终端里敲code .它会自动启动 VS Code并连接到你当前的 WSL 发行版。左下角会显示一个类似 “WSL: Ubuntu” 的标记代表整个编辑器、终端、调试器都跑在 Linux 环境里。Windows 桌面上的文件拖不进 WSL 项目目录直接右键文件夹“在 WSL 中打开”也行。在 VS Code 里配好远程开发环境后最爽的是 Python 环境隔离你在 WSL Ubuntu 里创建 venv 或 conda 环境VS Code 会自动检测到解释器CtrlShiftP里选 “Python: Select Interpreter” 就能看到。默认的终端也直接是 Linux Bash不用再开独立的 WSL 窗口。这个工作流我现在每天都用Windows 写前端、WSL 跑后端服务同一编辑器里无缝切换。一个小技巧如果你在 Windows 侧装了 VS Code又在 WSL 里装了 code CLI注意两个code命令有冲突。默认情况下拿到 WSL 里那个code才是对应远端入口。如果你发现code .打开的是 Windows 版本试着在 Windows 里执行wsl -e code .或者在 WSL 里重装一次 VS Code Server 组件。3.2 用 Docker 的完整姿势Docker Desktop 与 WSL 2 联动热词里有 “docker 更新后运行不了 wsl”、“windows docker desktop wsl”。这类问题非常典型。先说正确架构Docker Desktop 在 Windows 上不再用 Hyper-V 虚拟机而是直接基于 WSL 2 作为后端也就是 Docker Desktop 设置里的 “Use WSL 2 based engine” 选项。联动成功时WSL 内的docker命令直接指向 Docker Desktop 的引擎可以做到docker ps docker compose up -d跟原生 Linux 体验一致。问题往往出现在 Docker Desktop 更新之后它会重建自己的 WSL 发行版通常是docker-desktop和docker-desktop-data如果旧发行版被锁住或损坏就会出现 WSL 报错、Docker 起不来。排查命令wsl -l -v # 看 docker-desktop 发行版状态 wsl --shutdown # 冷重启所有发行版然后再启动 Docker Desktop一般能恢复。如果还不行去 Docker Desktop 设置里找到 “Troubleshoot”点 “Clean / Purge data” 可以重置后端但会清掉镜像和容器刷之前先docker save导出需要保留的镜像。WSL 内直接安装 Docker Engine 也能用不装 Docker Desktop但容器端口映射、与 Windows 宿主机的共享网络配置起来比 Docker Desktop 麻烦不少。我的实测经验是日常开发优先 Docker Desktop 联动生产部署再按 Linux 原生方式学 Docker 命令不迟。涉及 containerd 时docker run命令其实是在调用 containerd 来创建容器。如果你偶尔看到Failed to connect to containerd报错十有八九是 Docker 后端没起来按上面说的先wsl --shutdown再启动 Docker Desktop。3.3 WSL 2 里装 CUDA 与 PyTorch一次配好就吃灰的稳定方案WSL 2 支持 NVIDIA GPU 直通这是深度学习能在 Windows 下流畅跑起来的核心。不过很多人第一次装就被坑了——在 WSL 里装 CUDA其实你不需要在 WSL 里安装完整的 NVIDIA 驱动驱动。正确流程分两步第一步Windows 侧安装 NVIDIA 驱动。注意要选支持 WSL 的版本GeForce Game Ready 或 Studio 驱动都带 WSL 支持。只要 Windows 侧驱动装好了nvidia-smi在 WSL 里可以直接运行看到的就是 GPU 信息。第二步在 WSL Ubuntu 里安装 CUDA Toolkit。官方推荐用runfile或 apt 源安装。apt 方式大致是wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt update sudo apt install cuda装完以后重启终端nvcc --version能看到版本就说明 CUDA 编译器就位了。接下来建 PyTorch 环境# 创建虚拟环境 python3 -m venv ~/pytorch_env source ~/pytorch_env/bin/activate # 安装 PyTorch以 CUDA 12.1 为例 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121验证是否真的能调 GPUpython -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))输出True和显卡型号就是成功了。这里有几个专属于 WSL 的注意点WSL 里的 CUDA 版本优先级是“Windows 驱动支持的 CUDA 版本”不一定要装最新版。你 Windows 驱动是最新的那 CUDA 基本都能跑但 PyTorch 编译版本要匹配。nvidia-smi显示的是驱动版本和 CUDA 驱动版本不代表你已经装了 CUDA Toolkit。nvcc才是 Toolkit 的标志两者很容易混淆。如果你在 WSL 里报CUDA error: no kernel image is available多半是 PyTorch 的 CUDA 版本和驱动不匹配换一个 cu 版本的安装命令试试。这套环境我配一次之后基本就不用再动Windows 驱动更新也不会影响 WSL 里的 CUDA除非你的 PyTorch 需要更高版本。4. Linux 基础命令速查git、vim、shell 里高频用到的那点事4.1 Git 命令高频操作流WSL 里最常用的工具大概就是git。装好后的第一件事是设置身份git config --global user.name 你的名字 git config --global user.email 你的邮箱日常提交流程我基本固定为git status # 先看修改 git diff # 再确认改动内容 git add . # 加入暂存区new files / modified git commit -m 描述 git push # 推送远程分支操作里我用得最多的是git switch -c 新分支 git merge 目标分支注意git switch比旧版的git checkout -b更直观新项目建议统一用switch少一层含义。很多人卡在“撤销”上记住三个场景git restore 文件 # 撤销工作区修改 git restore --staged 文件 # 把已暂存的内容退回工作区 git reset --hard HEAD # 丢弃所有未提交修改慎用最后一条是“悔不当初”级命令会在没有提示的情况下删掉你的工作区修改我现在都会再三确认git status干净才会用。4.2 Vim 命令新人突破“不会退出”的怪圈WSL 里默认编辑器多半是 nano 或 vim。热词里单独出现“vim命令”说明新手受困很深。Vim 的核心就一句话普通模式、插入模式、命令模式三态切换。打开文件vim 文件名进入插入模式按i此时可以正常打字退回普通模式按Esc保存退出普通模式下输入:wq回车不保存退出普通模式下输入:q!回车文件内查找替换:/password # 向下搜索 password :%s/old/new/g # 全局替换 old 为 new行号显示和格式化:set number ggG # 自动缩进整个文件真实使用时我建议新手直接把Esc键映射成jj或者Ctrl[因为一直按 Esc 手很酸。在 WSL 里vim 配置放到~/.vimrc我自己的基础配置就三行set number set tabstop4 set expandtab这样做的好处是无论你之后开发什么语言缩进都不会乱。Vim 入门不需要背命令大全先能编辑、保存、退出、搜索剩下的等你真觉得卡手再查。4.3 Shell 命令里容易被忽略的进阶细节热词里出现了一串 shell 相关词条history、shift、数组切片、并行执行命令。这些恰好是写脚本的高频需求我逐个说。history命令看执行记录history # 全部历史 history | grep docker # 搜索历史里的 docker 命令 !123 # 重新执行历史第 123 条 !! # 重新执行上一条命令shift用于脚本参数左移。写一个批量处理脚本时#!/bin/bash while [ $# -gt 0 ]; do echo 处理参数: $1 shift done每次shift$2变$1$#减一。适合处理-n 10 -f file这类参数串。数组切片是 Bash 的一个冷门但高效功能arr(a b c d e) echo ${arr[]:1:3} # 从第 2 个元素开始取 3 个b c d并行执行 Linux 命令最简单的写法command1 command2 wait把命令放到后台wait等所有后台任务结束。批量压缩多个文件夹时这个技巧能节省大量等待时间。热词里还提到“linux删除文件夹命令”基础到不行但也经常有人问rm -rf 目录名 # 强制递归删除 rm -i 目录名 # 逐个提示确认更安全我记得有一年在生产服务器上一个手滑rm -rf /至今心有余悸。WSL 里也一样rm -rf慎用尤其是在/mnt/c下操作一旦删错回收站可帮不了你。5. WSL 高级管理命令与问题排查实录5.1 发行版的导入导出、启动停止与彻底卸载前面说过导出导入是迁移系统的核心方案。这里我再补几个重要的生命周期命令wsl --shutdown # 关闭所有发行版相当于把虚拟机断电 wsl --terminate Ubuntu # 关闭特定发行版 wsl -d Ubuntu # 直接进入指定发行版 wsl --unregister Ubuntu # 彻底注销发行版删除数据wsl --terminate在发行版卡死时非常有用。有一次我跑了个内存爆炸的 Python 脚本整个 WSL 假死Windows 里其他程序都正常。我一开始找任务管理器重新开 Mintty 窗口没用后来才想起命令行敲wsl --terminate Ubuntu几秒后重新进入就恢复了。这比重启电脑或关闭 Docker Desktop 高效得多。Windows 开机自启 WSL 里的服务可以在任务计划程序里设置或直接把命令放在.bashrc。我在.bashrc里加了启动 Docker 或数据库服务的判断逻辑但更推荐用systemd。新版 WSL 2 已经默认支持 systemd启用方式是在/etc/wsl.conf里写[boot] systemdtrue然后wsl --shutdown再启动systemctl status就能看到 Service 管理起来了。我目前用 systemd 管理 SSH 服务和定时任务比裸写crontab与nohup规范不少。5.2 网络与 DNS 问题排查能不能上网、为什么慢WSL 网络问题最常见的就是“apt update 很慢”和“git clone 卡住”。先说结论多数慢的问题不是 WSL 的问题而是默认软件源在国外。解决 apt 慢的标准做法是更换软件源镜像sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|http://archive.ubuntu.com/ubuntu|http://mirrors.aliyun.com/ubuntu|g /etc/apt/sources.list sudo apt update不同发行版源格式略有差异Debian 还需要再版配置。改完源之后再apt update基本秒级。pip 下载慢同样可以通过镜像解决pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple还有一类网络问题是 WSL 里无法访问局域网或者 Windows 防火墙拦截。检查顺序ping 网关 # 看基础连通性 ip addr # 看 WSL 网卡地址 curl -v https://example.com # 看出口是否通如果从 Windows 侧访问 WSL 里的服务连不上先确认你监听的地址是0.0.0.0而不是127.0.0.1。WSL 2 是 NAT 网络Windows 访问 WSL 服务通常需要手动端口转发配置起来略麻烦。常见做法是netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress127.0.0.1WSL 每次重启 IP 可能变化通过localhost访问是最省心的方式。WSL 2 在较新版本中默认支持 localhost 回环所以大多数开发场景不用管端口转发这回事。5.3 高频报错与解决安装慢、命令找不到、弹窗闪退最后整理一份我实测过的常见问题表按出现频率排现象常见原因解决方法wsl --install卡住或失败商店组件异常 / 下载源缓慢用wsl --install --web-download重试检查网络后重启再试启动 WSL 报“启动分发失败”虚拟化未开启 / 发行版文件损坏BIOS 开启虚拟化wsl --shutdown后重开必要时重新导入WSL 内command not found软件包确实没装sudo apt install 对应包名比如sudo apt install rpmwsl命令显示“不是内部或外部命令”系统版本过旧或未启用 WSL 功能确认 Windows 版本号启用“适用于 Linux 的 Windows 子系统”可选功能Docker Desktop 启动后 WSL 崩Docker 后端发行版损坏wsl --shutdown再启动 Docker Desktop无效则重置 Docker 数据WSL 内nvidia-smi不存在驱动问题在 Windows 侧更新 NVIDIA 驱动确认 WSL 里能看到/dev/nvidia*设备“找不到 rpm 命令”这个问题我在 Debian/Ubuntu 系里碰到很多次原因是 rpm 文件格式和安装包管理工具属于 RedHat 系Ubuntu 系里默认不装。如果你需要装.rpm包要么加装rpm工具转成.deb用alien要么直接用.deb包。我也不知道为什么总有人想用 Ubuntu 装 rpm大概是被某个只提供 rpm 包的工具坑的吧。热词里“windows弹窗提示命令”和“脚本闪退”也常被问到。脚本闪退多半是因为批处理执行到一半遇到语法错误或者崩溃排查思路是在 cmd / PowerShell 里加暂停cmd /k 你的脚本.cmd或者用pause让窗口不立刻关闭先看报了错再处理。我是建议写脚本时尽量用 PowerShell 或 Bash 而非纯 cmd至少报错信息能看懂点。“麒麟V10命令重启后为什么网卡不启动”这类问题如果你用的是国产 Linux 发行版在 WSL 里或物理机里本质是网络服务未启用或 NetworkManager 配置异常可以依次检查systemctl status NetworkManager ip a sudo systemctl restart NetworkManager如果在 WSL 里遇到这个多半是虚拟网卡启动顺序问题把[network]相关配置写进/etc/wsl.conf或找个稳定的服务自启手段就好。不过说实话在 WSL 内部不建议过度折腾网卡配置底层网络归 Windows 管。还有一类偏门的排查需求比如用 binwalk 做固件分析sudo apt install binwalk binwalk 固件.bin在 WSL 里跑 binwalk 是可行的如果你的固件分析需要处理大量二进制内容记得先检查是否有足够内存并且把工具链版本装到 Python3 环境里。一些安全测试工具比如 sqlmap、arpspoof也有人问怎么在 WSL 里用。核心提示是这些工具只应在你拥有授权的设备和网络环境里测试比如自己搭的靶机或 CTF 平台。安装方式同样是apt install但分发版里的版本往往不够新需要从源码拉 GitHub 仓库编译这正好用得上前面说的 git 命令。给新手一点建议先用 Docker 容器跑这类工具能少踩很多依赖坑容器删了又不留垃圾。最后单独说说“telnet 命令怎么用”。老牌网络排查工具 telnet 由于默认不安装在 WSL 里先sudo apt install telnet然后telnet 192.168.1.1 23更多时候是拿它测端口通不通比如telnet example.com 443能进入黑屏光标状态就说明 TCP 端口可达。我一般用nc -vz example.com 443代替 telnet因为脚本友好度更高而且 WSL 里自带 netcat 的概率大一些。结合这些年在 WSL 里进进出出的经验我的总体建议是不要试图在 WSL 里复刻一台完整的生产 Linux 服务器它就是你在 Windows 桌面下的“开发环境副驾驶”。安装命令、路径转换、开发环境三大块是高频刚需建议练熟发行版迁移、systemd、网络排查属于“会用一次就值回时间”的中频技能收藏这篇够了。如果你以后换电脑别忘了用wsl --export和wsl --import把整套环境搬走那才是 WSL 最香的长线收益。