本文最后更新于 2024-08-08,文章内容可能已经过时。

1 概述

WSL 是适用于 Linux 的 Windows 子系统,可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。

WSL 分为两个版本,一个是 WSL1,一个是 WSL2,WSL2 是 WSL1 的升级版,主要优势是:

  • 提高文件系统性能。
  • 支持完全的系统调用兼容性。
  • 托管 VM。
  • 完整的 Linux 内核。
  • 完全的系统调用兼容性。

WSL2 建议不要跨操作系统使用文件,若想获得最快的性能速度,请将文件存储在 WSL 文件系统中,在存储时,使用 Linux 文件系统根目录:\\wsl$\Ubuntu-20.04\home\<user name>\Project

访问 WSL2 文件系统,可以运行命令 WIN+R 或在文件资源管理器地址栏中键入 \\wsl$,以查找相应的分发名称并访问其根文件系统。

大多数情况下我们会使用 WSL2,但在以下情况,请考虑使用 WSL1:

  • 你的项目文件必须存储在 Windows 文件系统中。
  • 一个项目要求对相同的文件使用 Windows 和 Linux 工具进行交叉编译。
  • 你的项目需要访问串行端口或 USB 设备,WSL2 不支持访问串行端口。
  • 长时间运行的 WSL 会话或访问非常大量的文件。

2 常用命令

2.1 启动与停止

# 启动默认 Linux 分发版
wsl
 
# 以指定用户身份运行 Linux 分发版
wsl -u <username>
 
# 运行指定的 Linux 分发版
wsl -d <Linux分发版名称>
 
# 退出 Linux 分发版
exit
 
# 终止指定的分发
wsl -t <Linux分发版名称>
 
# 终止所有运行的分发及 WSL 轻型工具虚拟机
wsl --shutdown

2.2 查看

# 列出已安装且可供使用的 Linux 分发版
wsl -l
 
# 列出所有分发,包括当前不可用的分发
wsl -l --all
 
# 仅列出当前正在运行的分发
wsl -l --running
 
# 仅显示分发名称
wsl -l -q
 
# 显示所有分发的详细信息
wsl -l -v

2.3 安装与卸载

# 列出可安装 Linux 分发版
wsl -l -o
 
# 安装指定 Linux 分发版
wsl --install -d <Linux分发版名称>
 
# 卸载 Linux 分发版,卸载后可以重新安装
wsl --unregister <Linux分发版名称>

2.4 导入与导出

# 导入 Linux 分发版, 可加 --version 指定要用于新分发的版本
wsl --import <Linux分发版名称> <安装位置> <文件名>
 
# 导出 Linux 分发版,后缀名请以 tar 结尾
wsl --export <Linux分发版名称> <路径>

2.5 其它

# 设置默认 Linux 分发版
wsl -s <Linux分发版名称>
 
# 在不使用默认 Linux Shell 的情况下执行指定的命令
wsl -e <命令行>
 
# 更改新分发的默认安装版本
wsl --set-default-version <版本>
 
# 更新 WSL2 内核到最新版本
wsl --update
 
# 还原到 WSL2 内核的先前版本
wsl --update --rollback
 
# 更改指定分发的版本
wsl --set-version <Linux分发版名称> <版本>

3 常用操作

3.1 从 Windows 访问 Linux 网络应用

可以使用 localhost 从 Windows 上访问 Linux 分发版中的应用。

3.2 从 Linux访问 Windows 网络应用

如果要从 Linux 分发版访问 Windows 上运行的网络应用,则需要使用主机的 IP 地址。 你可以执行以下步骤来使其可行。

  1. 通过在 Linux 分发版中运行以下命令来获取主机的 IP 地址:cat /etc/resolv.conf
  2. 复制nameserver 后面的 IP 地址可用于访问 Windows 上运行的网络应用。

3.3 通过远程 IP 地址进行连接

当使用远程 IP 地址连接到应用程序时,它们将被视为来自局域网 (LAN) 的连接。 这意味着你需要确保你的应用程序可以接受 LAN 连接。例如,你可能需要将应用程序绑定到 0.0.0.0 而非 127.0.0.1

3.4 从局域网 (LAN) 访问 WSL 2 分发版

当使用 WSL 1 分发版时,如果计算机设置为可供 LAN 访问,那么在 WSL 中运行的应用程序也可供在 LAN 中访问。

这不是 WSL 2 中的默认情况,WSL 2 有一个带有其自己独一无二的 IP 地址的虚拟化以太网适配器。 目前,若要启用此工作流,你需要执行与常规虚拟机相同的步骤。下面是一个示例 PowerShell 命令,用于添加侦听主机上的端口 4000 的端口代理并将其连接到端口 4000,并使用 IP 地址 192.168.101.100 连接到 WSL 2 VM。

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

3.5 运行 Linux 命令

使用 wsl <Linux命令> 可以在 CMD 或 PowerShell 运行 Linux 命令,示例:

wsl ls -la

以这种方式运行的命令使用的是同一个工作目录,并且以 WSL 默认用户的身份运行,拥有与调用方进程和终端相同的 Windows 管理权限。

3.6 混合运行 Linux 和 Windows 命令

# 组合 Linux 的 ls 命令 和 powershell 的 findstr 命令
wsl ls -la | findstr "git"
 
# 组合 powershell 的 dir 命令和 Linux 的 grep 命令
dir | wsl grep git
 
# 组合 Linux 的 ls 命令 和 powershell 的 > 命令
组合 Linux 的 ls 命令 和 powershell 的 findstr 命令
 
# 使用 Linux 命令 列出 Linux 文件
wsl ls -la /proc/cpuinfo
 
# 使用 Linux 命令 列出 Windows 文件
wsl ls -la "/mnt/c/Program Files"

3.7 从 Linux 运行 Windows 工具

WSL 可以使用 [tool-name].exe 直接从 WSL 命令行运行 Windows 工具。 例如,notepad.exe

以这种方式运行的应用程序具有相同的工作目录,拥有与 WSL 进程相同的权限,以活动 Windows 用户的身份运行,显示在 Windows 任务管理器中。

4 总结

WSL 还有一些高级用法,比如更改磁盘大小,文件权限,环境变量等,具体配置可以参考官方文档。