Ubuntu WSL

2025年3月17日 | 阅读 7 分钟

WSL 简介

WSL(**Windows subsystem for Linux** 的缩写)是一个兼容层,可以在 Windows Server 2019、Windows 11 和 Windows 10 上运行 Linux 二进制可执行文件(格式为 **ELF**)。WSL 2 于 2019 年 5 月发布,引入了重要的修改,例如来自 **Hyper V** 功能子集的 **Linux 内核**。自 2019 年 6 月起,Windows 预览体验计划的用户(包括 **家庭版**)就可以使用它。

  • 并非所有 Windows 10 用户都能使用 WSL。
  • 可以通过手动安装或加入程序(即 Windows 预览体验计划)来安装它。
  • WSL 的第一个版本于 2016 年 8 月 2 日发布,它提供了一个由 Microsoft 集成的 Linux 内核兼容接口。
  • 有趣的是,它不包含真正的 Linux 内核代码。但它仍然支持几乎所有的 Linux 原生命令。
  • Microsoft 团队在 NT 内核和用户输入之间建立了一个翻译层。

如果一个命令是 Windows 的原生命令,它将被精确地传递给知道如何管理的 Windows 内核。如果它是 Linux 命令,则会调用翻译服务,然后请求将被转发到已启动的 Linux 实例(即 **Pico 进程**)的新实例化进程。命令运行后,结果会再次被翻译成 NT 内核可以理解的适当命令。

WSL 是一项 Windows 功能,允许开发人员在不需要独立的双引导或虚拟机的情况下运行 Linux 环境。WSL 有两个版本,称为 WSL 1 和 WSL 2。首先,WSL 1 作为兼容层,用于运行 Linux 二进制可执行文件(ELF 格式)。它可在 Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows 11、Windows 10 LTSB/LTSC 和 Windows 10 上使用。

WSL 2 于 2019 年 5 月发布,引入了重要的修改,例如来自 Hyper-V 功能子集的原始 Linux 内核。WSL 2 与 WSL 1 不同,因为 WSL 2 在运行完整 Linux 内核的结构化虚拟机中执行。由于 WSL 1 并非所有系统调用都得到支持,因此 WSL 2 比 WSL 1 更兼容 Linux 二进制文件。

自 2019 年 6 月起,WSL 2 已可通过 Windows 预览体验计划提供给 Windows 10 用户,包括家庭版。WSL 默认并非适用于所有 Windows 10 用户。但是,可以通过手动安装或加入 Windows 预览体验计划来安装它。截至 2022 年,WSL 2 包含 Linux 内核 5.15.74.2。

WSL 历史

Microsoft 首次尝试在 Windows 上实现类 Unix 兼容性始于 **Microsoft POSIX 子系统**,后来被 Interix/MKS 的 Windows Services for UNIX 取代,并最终在 Windows 8.1 版本中被移除。WSL 的底层技术源自未发布的 Astoria 项目,该项目允许一些 Android 应用程序在 Windows 10 移动版上运行。它最初出现在 **Windows 10 预览版 build 14316** 中。

另一方面,Microsoft 之前的项目和第三方 **Cygwin** 都专注于构建基于 **POSIX** 标准的特定类 Unix 环境。WSL 则专注于 Linux 的原生兼容性,而不是像 Cygwin 那样将非原生功能封装到 **Win32** 系统调用中。

WSL 的初始设计利用 NT 内核执行器,将 Linux 程序作为隔离的特殊最小进程(称为 **pico** 进程)提供服务,这些进程连接到 pico providers 内核模式,具有与普通 NT 进程不同的专用系统调用和多个异常处理程序,并尽可能重用现有的 NT 实现。

  • WSL 的 Beta 版本于 2016 年 8 月 2 日在 Windows 10 1607 版本(**周年更新**)中发布。
  • 当时仅支持 Ubuntu。此外,WSL Beta 版本被称为 **“Bash on Windows”** 或 **“Bash on Ubuntu on Windows”**。
  • WSL 在 2017 年 10 月 17 日发布的 Windows 10 1709 版本(秋季创意者更新)中不再是 Beta 版本。
  • 可以在 Windows 应用商店中安装多个 Linux 发行版。
    因此,与之前的类 Unix on Windows 项目相比,WSL 由于其初始设计,速度更快,并且可以说是更受欢迎。
  • Windows 内核工程师在尝试通过重塑旧的 NT 内核以正确运行和识别 Linux API 来增强 WSL 的 **系统调用** 兼容性和性能时,遇到了困难。

Microsoft 于 2021 年 4 月发布了一个 Windows 10 测试版本,该版本还通过 **CBL-Mariner** 和 **WSL 2** 实现了运行 Linux GUI 应用程序的能力。**WSLg**(**Windows Subsystem for Linux GUI**)在 2021 年 Microsoft Build 大会(Build 2021)上正式发布。它包含在 **Windows 10 预览版 build 21363** 或更高版本中。

Microsoft 于 2021 年 10 月 11 日为 Windows 11 发布了 **WSL Windows 应用商店** 版本。

WSL 的功能

WSL 可在 Windows 10 版本(从 1607 版本开始)和 Windows Server 2019 中使用,但仅限 64 位版本。

Microsoft 将 WSL 视为“**主要是为开发人员准备的工具——特别是 Web 开发人员以及从事开源项目或在其中工作的人员。2018 年 9 月,Microsoft 表示“WSL 比完整的虚拟机占用的资源(CPU、内存和存储)更少”**(在 WSL 出现之前,虚拟机是运行 Windows 内 Linux 软件的最直接方式之一),同时还允许用户在同一组文件上使用 Linux 工具和 Windows 应用程序。

Ubuntu WSL
  • 最初的 WSL 版本提供了一个由 Microsoft 集成的 Linux 内核兼容接口,不包含 Linux 内核代码,然后可以在其之上运行 Linux 发行版的用户空间,例如 Kali Linux、Debian、SUSE Linux Enterprise Server、OpenSUSE 和 Ubuntu。
  • 这种用户空间可以包含命令行和 GNU Bash shell,以及一些原生的 GNU 命令行工具(awk、sed 等)、编程语言解释器(Python、Ruby 等),还可以运行带有主机端 X11 服务器的图形应用程序。

**WSL 2** 中的 WSL 架构进行了重构,其中 Linux 内核在一个轻量级的虚拟机环境中运行。

wsl.exe

命令 **wsl.exe** 用于在命令行中管理 WSL 中的发行版。此命令可以列出所有可用的发行版、卸载发行版以及设置默认发行版。此外,它还可以用于通过 Windows PowerShell 或 Windows 命令提示符运行 Linux 二进制文件。 **wsl.exe** 命令取代了 **Windows 10 1803** 及更高版本中已弃用的 **lxrun.exe** 命令。

WSLg

它是 **Windows Subsystem for Linux GUI** 的缩写,旨在支持在 Windows 中运行 Linux GUI 应用程序(**Wayland** 和 **X11**),并提供完全集成的桌面体验。官方而言,**WSLg** 在 2021 年 Microsoft Build 大会上发布。它包含在 **Windows 10 预览版 build 21364** 或更高版本中。

不过,随着 Windows 11 的推出,WSLg 最终移植到生产环境的 Windows 中,为 WSL 应用程序提供了音频和图形支持。

运行 WSLg 的先决条件包括:

  • 建议使用启用了虚拟 GPU 的系统以用于 WSL,这将使我们能够利用 OpenGL 渲染(硬件加速)
  • Windows 11 Insider Preview (21362+ builds) 或 Windows 11 (22000.* build)

WSL 的设计

WSL 1 设计

**LXSS Manager Service** 是一个与子系统(来自驱动程序 **lxcore.exe** 和 **lxss.exe**)交互的服务,并负责 **Bash.exe**(不要将其与 Linux 发行版提供的 Shell 混淆)启动 Linux 进程,在执行期间管理 Linux 二进制锁和系统调用。由特定用户调用的每个 Linux 进程都进入 **“Linux 实例”**(通常,**init** 是初始启动的进程)。一旦所有应用程序都关闭,该实例也会被关闭。

  • WSL 1 的设计不提供硬件虚拟化/仿真(与其他项目如 **coLinux** 不同),并允许直接使用主机文件系统(来自 **DrvFS** 和 **VolFS**)以及一些硬件组件(如网络),从而确保了互操作性。
  • **例如,** Web 服务器可以从与主机上配置的 IP 地址和接口相同的地址使用,并应用与端口使用相同的限制,这需要管理员权限。
  • WSL 1 无法运行所有 Linux 软件,例如 32 位二进制文件或那些需要 WSL 中未实现的特定 Linux 内核服务的软件。
  • 由于在此版本中缺少 **“真实”** 的 Linux 内核,因此无法运行像设备驱动程序这样的内核模块。
  • 然而,WSL 2 使用了活跃的 Linux 内核虚拟化实例。
  • 可以通过在 Windows 环境中安装 X11 服务器(如 **Xming** 或 **VcXsrv**)来运行一些图形应用程序,例如 **Mozilla Firefox**。
  • 此外,目前尚未实现对 **CUDA** 和 **OpenCL** 的支持,但计划在后续版本中实现。
  • Microsoft 表示,WSL 是为应用程序开发而设计的,而不是用于生产服务器或桌面计算机,并推荐将虚拟机(**Hyper V**)、**Azure** 和 **Kubernetes** 用于这些目的。

WSL 2 设计

WSL 2 版本定义了架构上的修改。Microsoft 已通过高度优化的 **Hyper V** 功能子集实现可视化,以运行发行版和内核,确保与 WSL 1 相似的性能。开发人员无需修改其已发布的发行版以实现 **向后兼容**。WSL 2 的设置可以通过 **WSL 全局配置** 进行调整,该配置包含在用户配置文件文件夹内的名为 **.wslconfig** 的 INI 文件中。

发行版的安装驻留在虚拟磁盘内的 ext4 格式文件系统中。通过 9P 协议,主机文件系统对 **9P 协议**透明可访问,这与其他虚拟机技术(如 **QEMU**)类似。Microsoft 向用户保证,WSL 2 的读/写性能比 WSL 1 高 20 倍。通过 Windows 的 **\\wsl$** UNC 路径前缀,为 Linux 的来宾文件访问提供了一个 IFS 网络重定向器。


下一个主题Unetbootin Ubuntu