第一次接触Linux的时候,我大概和大多数人一样:先想到装个双系统,折腾半天开机引导出问题;后来退而求其次用虚拟机,内存被吃光,风扇吼得像飞机起飞;干脆去搞一台云服务器,命令是好学了,可本地文件来回同步又是新的麻烦。直到后面换了思路,直接在 Windows 下面用 WSL2 搭建 Linux 学习环境,一套系统同时满足日常办公和 Linux 开发需求,这才算真正把环境问题解决了。这篇文章我打算把整个 WSL2 安装与 Linux 环境搭建过程完整梳理一遍,从准备工作、安装步骤、初始化配置,到 Python 开发环境、VSCode 远程开发和常见问题排查都会讲到。无论你是刚接触 Linux 的小白,还是想把开发环境从虚拟机迁到 WSL2 的老手,这篇应该都能提供一个可直接照做的参考。
1. 为什么偏偏是 WSL2:Windows 下学 Linux 的环境痛点
1.1 传统方案的痛:虚拟机、双系统、云主机各有各的坑
我见过很多同事学 Linux 的第一反应就是装 VMware 或者 VirtualBox,然后下载一个 Ubuntu 镜像老老实实安装。虚拟机方案最大的问题是资源损耗,Windows 本身吃内存,Linux 虚拟机又要再分 4GB 甚至 8GB,开个 IDE 加上浏览器,16GB 内存的机器直接见底。另外虚拟机里操作有延迟感,文件共享配置也麻烦,用起来更像是在“参观动物园”而不是真正在“养动物”。
双系统方案就更极端了,虽然性能是原生的,但想从 Windows 切到 Linux 必须先重启,等 30 秒再进系统,日常使用基本不可能做到。而且双系统的引导配置一旦出错,轻则 grub 界面卡住,重则连 Windows 都进不去,我当年就吃过这个亏。云服务器方案性价比倒还行,但网络延迟、文件传输、编辑器同步这些问题始终存在,对于本地开发和学习来说,总隔了一层。
1.2 WSL1 和 WSL2 到底差在哪
WSL 第一代出来的时候,大家一度很兴奋,但很快发现问题不少。WSL1 其实是一个翻译层,把 Linux 系统调用翻译成 Windows 的系统调用,好处是启动迅速、文件访问快,坏处是有些底层功能不支持,比如很多依赖 Docker、GPU 计算、iptables 的程序根本跑不起来,内核模块更是想都别想。
WSL2 则是完全换了个思路:它用真正的 Linux 内核跑在微软定制的轻量级虚拟机里。注意这里不是传统的 VirtualBox 那类全功能虚拟机,WSL2 的虚拟机与 Windows 系统共享内核管理,启动速度非常快,内存也可以动态回收,绝大多数 Linux 应用装上就能跑,Docker、PyTorch、CUDA 都不在话下。我自己从 WSL1 切到 WSL2 之后,最大的体会就是“突然之间也不用再纠结什么兼容性问题了”。
1.3 WSL2 适合谁,不适合谁
如果你主要是学基础命令、写 shell 脚本、运行 Python/Node 项目、跑 Docker,那 WSL2 非常适合。但如果你需要做内核模块开发、要自己修改 Linux 内核代码然后启动,或者必须依赖某些 USB 设备的强实时功能,那我还是建议老老实实上虚拟机或者实体机。WSL2 的定位是“开发环境”,不是“完整的生产 Linux 主机”,认清楚这一点,后面使用心态会稳很多。
2. 安装前的检查与准备:先确认几个条件,别急着敲命令
2.1 系统版本要求
WSL2 对 Windows 版本有明确要求。Windows 11 全版本都支持;Windows 10 需要 1903 或 1909 版本,且必须已经安装了 2020 年 5 月之后的更新补丁。Windows 10 2004 及以上版本当然也是没有问题的。如果你机器上还是 Windows 10 1809 这类老版本,我建议先把 Windows 更新补丁打全,或者直接升级到 Windows 11,不然装到一半卡住会很尴尬。
检查系统版本的方法很简单:按 Win + R,输入winver,回车就能看到一个关于 Windows 的弹窗,版本号一目了然。要是版本低于要求,先在“设置 - 更新和安全 - Windows 更新”里把系统升上去再继续。
2.2 打开 CPU 虚拟化
WSL2 毕竟是跑轻量虚拟机,所以 CPU 虚拟化技术必须开启。一般 Intel 平台叫 Intel VT-x,AMD 平台叫 SVM。开机时按 Del 或 F2 进 BIOS,在 Advanced 或者 Processor 相关选项里找到 Virtualization Technology 或 SVM Mode,改成 Enabled,保存退出即可。如果这一步没开,装好后启动 WSL2 大概率会报WSL_E_INSTALL_VM_FAILED之类的错误,提前检查能省下不少排查时间。
有些品牌机默认可能已经开启了虚拟化,你可以打开任务管理器,切到“性能”标签,看右下角“虚拟化”这一项是不是显示“已启用”。如果是“已禁用”,就必须进 BIOS 手动开。
2.3 开启 Windows 的“适用于 Linux 的 Windows 子系统”功能
这一步在较新的 Windows 版本里通常会被wsl --install命令自动处理,但为了稳妥,我还是建议手动确认一下。打开“控制面板 - 程序 - 启用或关闭 Windows 功能”,勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个选项,然后按提示重启。以后如果你要用 Docker Desktop,这个“虚拟机平台”也是必需的,提前开好没有坏处。
2.4 顺手装一个 Windows Terminal
WSL2 的命令行体验高度依赖终端工具,老式的 conhost 窗口在字体渲染、窗口缩放、复制粘贴上都挺别扭。我建议直接从微软商店安装 Windows Terminal,它支持多标签页、自定义配色、快捷键,对日常操作和以后同时开多个 SSH 会话都非常友好。安装完成以后,可以在 Windows Terminal 的设置里把默认终端改成 WSL 发行版,这样每次打开终端就直接进入 Linux 环境,少一层切换的功夫。
3. WSL2 安装完整步骤:从一条命令到进入 Linux 系统
3.1 最简单的安装方式:wsl --install
如果你用的是 Windows 11 或者较新的 Windows 10,安装 WSL2 现在非常简单,管理员身份打开 PowerShell 或 Windows Terminal,直接输:
wsl --install这条命令会自动做几件事:启用 WSL 功能、启用虚拟机平台、下载并安装最新的 WSL2 内核、默认安装 Ubuntu 发行版。整个过程基本不需要额外干预,装完以后重启电脑,系统会自动弹出 Ubuntu 初始化窗口,让你设置用户名和密码。
需要注意,wsl --install默认安装的发行版是 Ubuntu,这是我最推荐新手使用的 Linux 发行版,原因有几点:文档资料最多、包管理器 apt 使用简单、社区遇到问题搜一下基本都有答案。如果你有特殊需求,比如想用 Fedora、Debian、openSUSE、Kali,可以在安装之前先执行wsl --list --online查看当前支持的发行版列表,然后用wsl --install -d 发行版名指定安装。
3.2 确认并切换 WSL 默认版本
安装完成后,建议先执行一下wsl --version确认 WSL 相关组件都是最新的。如果输出的版本号不是特别新,可以用wsl --update手动升级内核。这一步很重要,因为 WSL2 的很多新功能都是随内核更新发布的,比如镜像网络模式的支持、systemd 的支持等。
然后确认当前发行版运行在 WSL2 上:
wsl --list --verbose看到VERSION那一列是 2 就说明没问题。如果显示的是 1,执行下面这条命令把默认版本设为 2:
wsl --set-default-version 2也可以针对单个发行版单独设置:
wsl --set-version Ubuntu 23.3 设置登录用户与 root 密码
第一次启动发行版的时候,Ubuntu 会要求你设置一个用户名和密码。这里有个细节容易被忽略:你在 Ubuntu 里设置的这个用户虽然默认有 sudo 权限,但密码和 Windows 账号密码没有任何关系。也就是说,以后你每次进入 WSL2,如果不加限制,它会自动以你创建的这个用户身份登录,不需要重复输入密码。但是执行 sudo 命令的时候会要求输入用户密码,所以密码别设得太随意。
如果你和我一样装了 Ubuntu 之后发现忘记设置的密码是什么,可以在 PowerShell 里进入默认 root 用户:
wsl -u root然后执行passwd 用户名来重置密码。
3.4 验证安装是否成功
进入系统以后,先跑几条命令感受一下:
uname -a cat /etc/os-release ip addr看到Linux ... microsoft-standard-WSL2这类内核标识,说明你的环境确实是 WSL2 内核。/etc/os-release会显示发行版名称和版本号。ip addr能看到 eth0 网卡信息,记得记住这个 IP,后面配置服务、互相访问的时候会用到。
4. 第一次进入系统的初始化:换源、更新、装基础工具
4.1 配置国内 apt 源,别让网络拖慢你
WSL2 的 Ubuntu 默认使用官方的 apt 源,在国内下载软件包有时候会很慢,几十 KB/s 的速度让人崩溃。我每次装完系统第一件事就是换源。这里推荐阿里云或者清华大学的镜像源,以清华源为例:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list sudo apt update注意,不同版本的 Ubuntu 源文件格式可能有细微差别,如果你发现 sed 替换生效不了,就直接打开/etc/apt/sources.list手动改,或者去清华大学镜像站首页复制对应版本的完整源内容覆盖进去。
4.2 更新系统并安装常用软件包
更新源之后,执行一次全量升级:
sudo apt update sudo apt upgrade -y这个过程会比较长,但建议不要跳过。升级完成后,安装一些非常基础的工具,包括构建工具和网络工具:
sudo apt install -y build-essential curl wget git vim net-tools openssh-server ca-certificatesbuild-essential包含了 gcc、g++、make 等编译必备工具,以后编译 Python 扩展、装一些需要源码编译的软件都会依赖它。net-tools提供 ifconfig 等命令,方便你查看 IP。openssh-server是为了以后从 Windows 侧用 SSH 连接 WSL2 准备的,虽然 VSCode 有更便捷的方式,但 SSH 本身作为 Linux 学习的一部分还是值得装上的。
4.3 配置 systemd(可选但推荐)
WSL2 新版内核已经原生支持 systemd,但默认可能没有开启。如果以后要跑 Docker、SSHD、MySQL 这类服务,systemd 能带来很多便利,不用手动敲一堆启动命令。你可以在 WSL2 里编辑/etc/wsl.conf:
[boot] systemd=true然后在 Windows 的 PowerShell 里执行wsl --shutdown重启 WSL,再次进入系统后执行systemctl list-units --type=service验证,能看到一堆 already active 的服务说明 systemd 已经生效。如果你使用的 WSL 版本比较老,不支持 systemd,那么后续服务的启动方式就要改成手动后台启动,这样也不会妨碍使用,只是操作上稍微繁琐一些。
4.4 学会这几个 Linux 命令再开始
环境搭好之后,我强烈建议你先把下面这几类命令刻意练熟。不用背太多,但常用的一定要有肌肉记忆:
- 文件操作:
ls、cd、cp、mv、rm、mkdir、find、grep - 权限相关:
chmod、chown、sudo、su - 进程管理:
ps、top、htop、kill、systemctl - 网络相关:
ip addr、ping、curl、wget、ss、netstat
每天配合 Ctrl + R 搜索历史命令,以及man命令查文档,基本上两周就能养成在终端里工作的习惯。我之前在培训的时候见过不少人的误区,就是一上来就折腾 zsh、tmux、vim 插件这种“装修工程”,结果基础命令没掌握,环境越搞越乱。我的建议是先用默认终端和 vim,跑顺一套基础流程再慢慢锦上添花。
5. Windows 与 WSL2 的互操作:文件、网络、剪贴板
5.1 文件系统跨平台访问,互不隔离
WSL2 的根目录在 Windows 侧看起来很特殊,你可以在 Windows 资源管理器地址栏输入\\wsl$\直接访问 Linux 的文件系统。反过来,Windows 的所有盘符会被自动挂载到 WSL2 的/mnt/c、/mnt/d等位置。这套机制最大的好处是我可以继续用 Windows 上的浏览器、IDE、截图工具处理东西,同时又能在 Linux 环境里做开发。
但这里有一个性能陷阱必须提醒:如果你频繁在 Windows 侧访问 Linux 文件的场景比较简单,比如只是打开个配置文件,那没问题。但如果你要在 Linux 环境里编译大型项目、跑数据库,却把代码放在 /mnt/c 下而不是 Linux 文件系统里,速度会明显变慢。这是因为跨文件系统属于 9P 协议转发,IO 开销比较大。我一般会把项目代码放在 WSL2 的~/projects目录下,需要和 Windows 交换数据时再用文件管理器或cp来批量拷贝。
5.2 网络服务互通与固定 IP 问题
WSL2 使用的是 NAT 网络模式,它有自己的虚拟网卡和 IP 地址。Windows 侧可以通过这个 IP 直接访问 WSL2 里的服务,比如你在 WSL2 里启动了 Flask 或者 Jupyter Notebook,浏览器可以直接访问http://localhost:端口号,这是微软做的 localhost 转发机制,体验很好。
不过 WSL2 的 IP 地址会随着重启变化,所以如果你在 Windows 侧配置了某个服务依赖固定 IP,可能会失效。解决方案有两种:要么每次启动动态获取然后自动更新配置,要么直接用 localhost 转发而不是 IP。如果你用 Docker Desktop,它还会额外占用一些网络资源,这些在新版本的 WSL2 里大都自动处理好了,一般不需要手动干预。
5.3 剪贴板、文本和图片复制
WSL2 已经支持剪贴板互通。在终端里选中文本,按 Ctrl + C,到 Windows 应用里 Ctrl + V 就能粘贴出来。反向操作也一样,Windows 复制的内容可以直接粘贴到终端里。这个功能虽然简单,但实际使用频率非常高。我第一次用的时候还没有这个能力,经常要在终端和文本编辑器之间反复折腾,现在舒服多了。
需要注意的是,Windows Terminal 默认的 Ctrl + C/V 对应终端的复制粘贴,而 Linux 常见的 Ctrl + Shift + C/V 在某些配置下未必绑定。自己在 Windows Terminal 的设置里把快捷键调成习惯的样式,效率会更高。
5.4 在 WSL2 里直接调用 Windows 程序
这是很多人不知道的隐藏技巧:WSL2 会把自己放在 PATH 里的 Windows 可执行文件也暴露给 Linux 侧。也就是说,你可以在 WSL2 终端里直接输入notepad.exe打开记事本编辑文件,输入explorer.exe .打开当前目录的 Windows 资源管理器。
比如我在 WSL2 里想要快速查看某个配置文件,直接:
notepad.exe ~/.bashrc这种跨进程调用偶尔会有一些小坑,比如从 WSL2 启动 Windows 的 GUI 程序时环境变量传递不完全,但一般使用完全足够了。真要追求无缝体验,后面可以配合 VSCode 的 Remote 开发达到更理想的状态。
6. 搭建 Python 开发环境:从版本管理到 PyTorch
6.1 先装 Python 还是直接上 Conda
Linux 学习环境里,Python 几乎是绕不开的。Ubuntu 系统本身可能自带 Python 3,但你最好别直接拿系统 Python 去做开发,因为系统包管理器依赖它,你乱装包很可能把系统搞挂。我的建议是使用虚拟环境,把项目之间的依赖隔离开。
两种路径供选择:如果你项目比较轻量,直接使用 Python 自带的venv就足够。如果你要经常做数据分析、跑深度学习,建议安装 Miniconda,用 conda 管理环境更省心。Miniconda 的安装方式很简单,从官网下载脚本,然后执行:
bash Miniconda3-latest-Linux-x86_64.sh下载之前注意一下清华源,国内直接用官网链接可能慢到怀疑人生。Miniconda 安装完以后,建议顺手把 conda 的默认源也换成清华镜像,环境创建速度会快很多。
6.2 创建独立的 Python 开发环境
我以一个常见的“数据分析 + AI 入门”场景为例。创建环境并激活:
conda create -n ml python=3.10 conda activate ml在这个环境里安装常见的科学计算包:
pip install numpy pandas matplotlib scikit-learn如果你后续要跑深度学习,安装 CPU 版本的 PyTorch 可以先用:
pip install torch torchvision torchaudio如果是 NVIDIA 显卡用户,想利用 GPU 加速,需要先在 Windows 侧安装好 NVIDIA 驱动,然后在 WSL2 里安装 CUDA 工具包和 PyTorch 的 GPU 版本。微软官方文档专门有一篇讲 WSL2 里的 CUDA 支持,直接搜“WSL2 CUDA”就能找到官方步骤。这里有个常见的疑问:“WSL2 里英伟达驱动生效吗?”结论是可以生效,Windows 侧的驱动会通过 WSL2 的内核传递给 Linux 环境,你在 WSL2 里执行nvidia-smi能看到显卡信息就说明一切正常。
6.3 写个简单脚本验证环境
为了确保环境没问题,新建一个 Python 文件测试:
import sys import numpy as np print(sys.version) print(np.__version__) print(np.random.rand(3, 3))在终端里用python test.py运行,看到输出就说明环境正常了。我的个人习惯是每次新装环境都用这种几十行的小脚本先跑通再开始做正事,别等到项目写到一半才发现环境缺库,排查成本会翻很多。
6.4 关于 Jupyter Notebook 与远程访问
在 WSL2 里启动 Jupyter Notebook 是一件很爽的事情:
pip install jupyter jupyter notebook --no-browser --port=8888然后在 Windows 浏览器里访问http://localhost:8888,输入 token 就能用。注意 token 在终端启动日志里可以看到。如果你在 WSL2 里跑的是各种服务器程序,只要监听的端口和 Windows 侧不冲突,localhost 转发通常都能用。
7. 用 VSCode 开发 WSL2 项目:远程开发工作流
7.1 VSCode + WSL 扩展
如果只是用终端敲命令,很多图形化调试工作还是不方便。我的主力开发姿势是 VSCode 配合 WSL 扩展。在 Windows 侧安装好 VSCode 以后,在扩展商店搜索WSL并安装微软官方的 Remote - WSL 扩展。然后在 WSL2 终端里进入项目目录,执行:
code .VSCode 会自动检测到当前目录在 WSL2 内,然后远程连接并打开这个目录。你不需要安装任何 Linux 侧编辑器,所有界面都在 Windows 上渲染,但实际编译执行都在 WSL2 里进行,体验非常接近原生。
7.2 安装扩展时注意环境
Remote - WSL 有个特点:扩展分为两类,一类是运行在 Windows 侧的 UI 扩展(比如主题、图标),另一类是运行在 WSL2 侧的扩展(比如 Python、Jupyter、GitLens)。当 VSCode 连接 WSL2 后,扩展面板会提示你哪些扩展安装到了远程端。如果你发现 Python 解释器识别不了,多半是扩展没装到远程端。解决办法是在扩展详情页选择“在 WSL: Ubuntu 中安装”。
7.3 Git 和代码管理的几个小建议
WSL2 里安装 git 之后,你的 SSH 密钥、git 配置都要重新设置一遍。建议把 SSH 密钥单独放到 WSL2 的~/.ssh目录,并把权限设置严格一点:
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa提交信息、分支策略这些经验就不展开了,只强调一点:让 VSCode 在 WSL2 里使用 Git 时,一定要确认终端和 IDE 里用的都是同一个 Git 版本,不然有些换行符、文件模式问题会烦死你。可以通过在 VSCode 终端运行git --version和 Windows Git Bash 里的版本对比,确保两者一致。
7.4 调试和端口转发的联动
VSCode 集成了端口转发功能,比如 WSL2 里启动了 Flask 服务,VSCode 底部的“端口”面板会自动识别并帮你把端口映射到 Windows 的 localhost。这个功能在调试 Web 应用时极其好用,不用手动去查 IP 也不用配置防火墙。如果你的服务没有自动检测到,也可以在端口面板手动添加需要监听的端口。
8. 高频问题排障:从装不上到磁盘膨胀
8.1 安装过程中容易翻车的地方
不少人在wsl --install之后发现没有自动安装 Ubuntu,或者卡在下载内核那一半。常见原因包括:Windows 功能没有启用完整(尤其是“虚拟机平台”);BIOS 虚拟化没开;Windows 更新没打全。排查定位就是三步:先wsl --status查看当前状态,再检查 Windows 功能设置里两项是否已勾选,最后确认任务管理器的“虚拟化”是否显示已启用。基本能覆盖 90% 的安装问题。
还有种情况是网络问题导致内核下载失败,可以先wsl --update手动执行更新,或者从微软官方 GitHub 仓库下载内核安装包离线安装。这部分我不展开太多,但记住一点:安装失败时不要反复重试同一命令,先看错误码再对症下药。
8.2 域名解析失败和网络异常
WSL2 偶尔会出现能连通外网 IP,但域名解析失败的情况,表现为apt update报错或者ping域名不通。这多半是/etc/resolv.conf里的 DNS 服务器指向了错误的虚拟网卡。一个常见修复方法是编辑/etc/wsl.conf添加:
[network] generateResolvConf = false然后手动创建/etc/resolv.conf,写入公共 DNS(比如 223.5.5.5),并设置不可被覆盖:
sudo chattr +i /etc/resolv.conf注意这样修改后以后每次启动系统 DNS 配置都不会自动更新,如果公司网络有内网域名需求,需要自己根据实际情况调整。
8.3 磁盘空间被吃光和 vhdx 膨胀问题
WSL2 的虚拟磁盘文件.vhdx只会增长不会自动回收。你明明在 Linux 里删了几个大文件,Windows 侧的磁盘占用却没有降下来,这是正常的,因为磁盘空间已经被虚拟机预分配了。要压缩它,先关掉 WSL2:
wsl --shutdown然后在 Windows 侧以管理员身份打开 PowerShell,找到发行版的 vhdx 文件路径,执行:
diskpart select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited...\LocalState\ext4.vhdx" compact vdisk detach vdisk这个操作能收回一部分未使用的空间。当然更彻底的办法是定期审查你 WSL2 里保存的文件,特别是 Docker 镜像、conda 缓存、npm 缓存,清理一下很多时候空间问题迎刃而解。
8.4 内存占用过高
WSL2 默认会从 Windows 动态申请内存,最大可以占到物理内存的 50% 甚至更多。如果你的机器只有 8GB 内存,跑两个 WSL2 服务再加浏览器就会很紧张。解决办法是在 Windows 用户目录下创建.wslconfig文件,限制 WSL2 的资源使用:
[wsl2] memory=4GB processors=4 swap=2GB修改后执行wsl --shutdown再重新启动,配置生效。实测这样设置以后日常浏览网页、写代码的流畅度会明显提升,代价是 WSL2 里跑大型构建任务时会稍慢,但总体取舍是值得的。
8.5 WSL2 与防病毒软件、代理工具的冲突
在部分带有网络过滤功能的软件环境下,WSL2 的虚拟网卡流量可能会被拦截,导致 WSL2 内无法访问外网或访问 Windows 主机异常。如果遇到这种问题,建议先把相关功能关闭测试,确认是冲突后再决定是否加入白名单。另外新版本 WSL2 提供了镜像网络模式,通过.wslconfig里的networkingMode=mirrored可以将网络接口直接镜像到 Windows 主机,很多网络兼容性问题在这种模式下会大幅减少。不过这种模式在某些服务绑定场景下也有新坑,建议按需尝试,不要无脑开启。
9. 最后再聊两句实在话
我现在的基本环境配置就是 Windows 11 + Windows Terminal + WSL2 Ubuntu + Zsh + VSCode Remote,日常的脚本调试、Python 数据分析、Docker 容器测试全部在 WSL2 里完成,Windows 侧只承担浏览器、微信、办公软件这些任务。用了这么久,最大的感受就是它把“学习和使用 Linux”的门槛降到很低——你不用再去折腾分区、引导、双系统切换,也不用为一个apt install纠结半天,打开终端就是完整的 Linux 发行版,这种感觉非常适合新手入门。
如果你完全没接触过 Linux,我的建议是先把基础命令练熟,再尝试在 WSL2 里装一个 Navicat 或者其他 GUI 工具通过 X Server 连上来用,等熟悉了再深入系统服务、网络配置这些内容。环境的搭建并不难,难的是坚持每天在终端里动手敲几行。希望这篇文章能帮你在 Windows 上顺利迈出第一步,少走一些我当年绕过的弯路。