跳转至

WSL2

本文介绍 WSL 的基本使用方法,详情见 WSL 官方文档

Note

由于 WSL2 相对于 WSL1 在性能上有了质的飞跃,所以现代 WSL 一般都指 WSL2。下文的 WSL 不特别声明均指 WSL2。

基本概念

WSL (Windows Subsystem for Linux) 是微软开发的一个兼容层,允许在 Windows 上运行 Linux 并使用其大部分功能。它为开发者提供了一个完整的 Linux 环境,而无需安装虚拟机或双系统。

WSL1 vs WSL2:

  • WSL1:使用转换层将 Linux 系统调用转换为 Windows 系统调用,性能较低,I/O 速度慢;
  • WSL2:使用真实的 Linux 内核,运行在轻量级虚拟机中,提供完整的系统调用和更快的 I/O。

WSL2 的主要特性:

  • 真实的 Linux 内核:运行完整的 Linux 内核,提供 100% 的系统调用兼容性;
  • 快速的文件系统性能:Linux 文件系统操作速度显著提升;
  • 完整的系统调用兼容:可以运行 Docker、Kubernetes 等需要完整内核支持的应用;
  • 快速启动:秒级启动 Linux 环境;
  • 轻量级资源占用:动态内存分配,按需使用系统资源。

WSL 管理

安装 WSL

Note

安装 WSL 需要 Windows 10 2004 及更高版本(内部版本 19041 及更高版本),同时需要有支持虚拟化的 CPU(需要在 BIOS 中启用虚拟化,默认开启,可在任务管理器的「性能」选项中查看)。

1)配置「启用或关闭 Windows 功能」选项,启用「Virtual Machine Platform(有些主机会显示为中文——虚拟机平台)」和「适用于 Linux 的 Windows 子系统」两个选项,然后重启电脑。如下图所示:

启用功能

2)终端输入以下命令下载 WSL:

Bash
wsl --install

系统会自动安装 WSL 和默认的 Linux 发行版 Ubuntu。下载安装过程如下所示:

首先会下载安装最新的 WSL 然后回下载安装默认的 Linux 发行版 Ubuntu
正在下载 WSL 正在下载 Ubuntu

查看 WSL 安装情况:

Bash
wsl --version

3)设置好用户名和密码后,就可以使用以下命令进入 Linux 环境:

Bash
wsl -d Ubuntu  # Ubuntu 可以替换为你指定的 Linux 发行版名称

专属于 Linux 的命令

更新 WSL

Bash
wsl --update

配置 WSL

有以下两种方法来对 WSL 进行全局配置:

  • 创建 C:\Users\<用户名>\.wslconfig 文本文件来配置 WSL;
  • 运行 WSL Settings GUI 程序可视化配置 WSL(也会自动创建上述文件)。

示例配置:

INI
[wsl2]
memory=8GB
swap=16GB
processors=12
defaultVhdSize=32GB

配置前需要关闭所有实例,重启后生效。

卸载 WSL

Bash
wsl --uninstall

发行版管理

Note

使用 wsl 命令会在后台启动一个 WSL 守护进程,该进程无法自动关闭,但占用的资源可以忽略不计。

查看发行版

Bash
# 查看所有已安装的发行版
wsl --list

# 查看所有已安装的发行版的详细信息
wsl --list --verbose

# 查看可在线安装的发行版
wsl --list --online

安装发行版

Bash
wsl --install <distri_name>

卸载发行版

Bash
wsl --unregister <distri_name>

启动发行版

Bash
# 启动默认的发行版
wsl

# 设置默认的发行版
wsl --set-default <distri_name>

# 启动指定的发行版
wsl --distribution <distri_name>

停止发行版

Bash
# 停止所有的发行版
wsl --shutdown

# 停止指定的发行版
wsl --terminate <distri_name>

移动发行版

发行版默认安装在系统盘,我们可以手动调整安装位置缓解存储压力。

首先需要关闭 WSL:

Bash
wsl --shutdown

具体移动方法有两种:

  • 方法一:基于 WSL 2.3.11 新特性 --move 一步移动:

    Bash
    # 基本命令
    wsl --manage <distri_name> --move <path\to\target>
    
    # 示例命令
    wsl --manage Ubuntu-24.04 --move D:\WSL\Ubuntu-24.04
    
  • 方法二:基于导入导出机制:

    Bash
    # 导出发行版
    wsl --export <distri_name> <path/to/source.tar>
    
    # 导入发行版
    wsl --import <distri_name> <path/to/target> <path/to/source.tar>
    

配置发行版

在发行版文件系统内创建 /etc/wsl.conf 文本文件来配置对应的发行版。

示例配置:

INI
[boot]
# 启动时执行的命令
# command = service docker start

[network]
# 生成 /etc/resolv.conf
generateResolvConf = true

# 生成 /etc/hosts
generateHosts = true

[interop]
# 启用 Windows 互操作
enabled = true

# 将 Windows PATH 添加到 Linux PATH
appendWindowsPath = true

[user]
# 设置默认用户
# default = <用户名>

重置发行版密码

如果忘记了 Linux 用户密码:

Bash
# 以 root 身份启动
wsl -u root

# 重置用户密码
passwd <用户名>

文件管理

跨文件系统操作会较慢,在 WSL 中操作时,建议将项目文件放在 Linux 文件系统中以获得最佳性能。数据会默认存放在 %LOCALAPPDATA%\wsl 对应包的 vhdx 硬盘映像文件中。

Windows 访问 Linux 文件

直接从「文件资源管理器的侧边栏」访问 Linux 文件:

直接从「文件资源管理器的侧边栏」访问 Linux 文件

也可以在「文件资源管理器的地址栏」输入:

Bash
\\wsl.localhost\<distri_name>

# 示例
\\wsl.localhost\Ubuntu-22.04

Linux 访问 Windows 文件

Windows 磁盘被挂载在 /mnt 目录下:

Bash
# 访问 C 盘
cd /mnt/c

# 访问 D 盘
cd /mnt/d

# 示例:访问 Windows 用户目录
cd /mnt/c/Users/<user_name>

网络管理

网络模式

WSL 默认使用 NAT 网络模式,该模式允许 Windows 通过本地回环地址访问 WSL 中运行的服务:

Bash
# 在 WSL 中启动 Web 服务器
python3 -m http.server 8000

# 在 Windows 浏览器中访问
http://localhost:8000

但如果 Windows 开启了代理,会在每次启动 WSL 时出现以下提示(恼):

如果 Windows 开启了代理,会在每次启动 WSL 时出现提示

将 WSL 的网络模式 配置 为 mirrored 即可解决上述问题:

TOML
[wsl2]
networkingMode=mirrored

但在重新启动 WSL 后可能会出现以下警告:

修改为镜像网络模式后出现的新问题

多重启几次 WSL 即可:

Bash
# 关闭 WSL
wsl --shutdown

# 等待至少 8 秒

# 启动 WSL
wsl

之后就可以解决问题了。

WSL 科学上网

最简单的方法就是启用代理软件的 TUN 模式,直接把流量转到虚拟网卡上。

获取 WSL IP 地址

Bash
# 在 WSL 中查看 IP 地址
ip addr show eth0
hostname -I

常见应用

说了那么多 WSL 的管理方法,那么 WSL 到底有哪些用呢?我目前主要用 WSL 完成以下任务。

WSL + VSCode

为了在 Windows 平台进行 Linux 开发,我们能可以借助 WSL 和 VSCode。

方法一:在 VSCode 插件市场中搜索 WSL 并安装,调起命令面板后输入 WSL: Connect to WSL 即可连接本地 WSL 实例:

调起命令面板后输入 WSL: Connect to WSL 即可连接本地 WSL 实例

方法二:在「远程资源管理器」中选择「WSL 目标」来连接本地 WSL 实例:

在「远程资源管理器」中选择「WSL 目标」来连接本地 WSL 实例