Windows Subsystem for Linux (WSL) 中的系统分布是什么?

Windows Subsystem for Linux (WSL) 中的系统分布是什么?

wsl.exe帮助(由 所示wsl.exe --help)谈论“系统分布”:

Options:
...
    --system
        Launches a shell for the system distribution.

它是什么?在 WSL 文档中搜索“系统发行版”时,我只得到了该部分中的以下内容如何管理 WSL 磁盘空间:

有关块设备的信息包括: 名称:分配给设备的名称为sd[a-z],指的是 SCSI 磁盘,并为每个正在使用的磁盘指定一个字母。sda始终是系统分布。

答案1

启动此 shell 后,检查/etc/os-release以获取有关已安装发行版的更多信息。

在我的 WSL 中,这似乎是Common Base Linux Mariner,并且记录在此处:https://aka.ms/cbl-mariner

CBL-Mariner 是适用于 Microsoft 云基础设施以及边缘产品和服务的内部 Linux 发行版。 CBL-Mariner 旨在为这些设备和服务提供一致的平台,并将增强 Microsoft 及时更新 Linux 的能力。 [...]

系统 shell 的输出示例

PS C:\Users\testuser> wsl --system
wslg [ /mnt/c/Users/testuser ]$ cat /etc/os-release
NAME="Common Base Linux Mariner"
VERSION="2.0.20230630"
ID=mariner
VERSION_ID="2.0"
PRETTY_NAME="CBL-Mariner/Linux"
ANSI_COLOR="1;34"
HOME_URL="https://aka.ms/cbl-mariner"
BUG_REPORT_URL="https://aka.ms/cbl-mariner"
SUPPORT_URL="https://aka.ms/cbl-mariner"

常规用户 shell 的输出示例

PS C:\Users\testuser> wsl
testuser@testhost:/mnt/c/Users/testuser$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

答案2

WSL 中的(或“a”,具体取决于上下文)“系统分发”的名称有点奇怪,但可能意味着与“用户分发”相反。解释起来也有点困难。原著里有概述WSLg架构大约 2 年前的开发博客文章。

对于大多数用户来说,除了好奇之外,确实没有必要了解或使用系统发行版。但是,它可用于:

  • 调试 WSL 中的 WSLg/GUI 问题
  • 如果需要,修改或替换 WSLg 功能。
  • --system在 WSL 帮助中了解这个奇怪的参数的用途;-)

首先,一些额外的“术语”。要理解什么是“系统分发”,我们首先需要真正理解WSL中的“分发”。简短摘要 - 发行版是运行的名称空间隔离环境(容器)里面WSL2 虚拟机。看这个答案了解更多详情。

实际上有多个系统发行版:

  • 模板,根文件系统(基于CBL水手,如中所述@潘基的回答)这是 WSL 本身提供的。然后使用该根文件系统创建...

  • 系统发行版(命名空间容器)每个其他正在运行的用户发行版(例如 Ubuntu、Alpine、Kali、Arch 等)。该系统发行版是 Wayland(带有 RDP/RAILS)、Xwayland、Weston 和 PulseAudio 运行的地方。然后,这些服务的套接字在启动时被安装、绑定安装和/或符号链接(这些技术随着时间的推移而改变)到用户分发中。该系统发行版与同级用户发行版具有相同的生命周期。

默认 WSL 安装使用 Ubuntu(当前为 20.04)作为发行版。在这种情况下,当您启动 WSL/Ubuntu 时,会启动相应的系统发行版、启动服务,并从系统发行版创建回 Ubuntu 的符号链接/挂载。该架构对于在 WSL 下运行的所有 Linux 发行版都是通用的。然而,某些发行版(我正在看你,GNU Guix ;-))可能偏离“规范”太远,并且需要额外的工作才能使用 WSLg 运行 GUI 应用程序。

主要的安装是/mnt/wslg(正如你提到的,应该是/dev/sda——我以前从未真正注意到这一点)。 X11 套接字所在的目录/tmp/.X11(现在)是只读的,绑定挂载回/mnt/wslg/.X11-unix.

尽管我还没有完全探索该架构的所有角落和缝隙,但为 Wayland 和 PulseAudio 创建了类似的绑定安装或符号链接。

因此,当您启动 WSL 时,您可以单独启动:

wsl --system

您会看到您的默认用户就在wslg那里。但是,您也可以访问它wsl --system -u root

您也可以从 开始wsl --system,您会发现(用wsl -l -v)您的默认发行版也已启动。

由于“每个发行版”系统发行版是在每次 WSL 发行版启动时“按需”创建的,因此它是短暂的。当用户分发停止时,您在wsl --system( 或)中所做的任何更改都将丢失。wsl --system -d <user_distro_name>

要使更改永久生效,您可以构建您自己的系统发行版使用 Github 上的 WSLg 存储库并将 WSLg 使用的存储库替换为文件.wslconfig。老实说,自 WSLg 推出以来的近两年内,我不知道 Microsoft 以外的任何人发现有必要这样做,但这确实是一项有趣的功能。至少,它允许您升级(甚至回滚)像 Weston 这样的组件,而不必等待 Microsoft 进行更改。

相关内容