WSL 允许用户使用他们选择的任何发行版,并且默认安装 Ubuntu。
我不太明白发行版在 WSL 环境中的相关性。我的理解是 Linux 发行版是指操作系统的外表。操作系统核心之上的 UI 层。但是当使用 WSL 时,您只需使用命令行,或者运行一个独立的单一 GUI 应用程序。那么在这个上下文中发行版的相关性是什么,选择哪个发行版有什么区别?
答案1
这里的其他一些答案集中在“Linux 发行版”的“正常”含义上,这对于理解您的问题的背景当然很有用。但您是在 WSL 的背景下专门询问这个问题的。
选择哪种分布有什么区别?
在我们讨论有关 WSL 发行版的“差异”之前,让我先回答您问题的这一部分。 Linux 发行版的主要区别是(这里主要关注 WSL/开发人员需求):
默认存储库中可用的应用程序版本。 (过度概括)通常有两个类型您会发现的发行版:
“稳定”发行版,往往很少更新(安全更新除外),但重点是确保(尽其所能)所有软件包都能很好地协同工作并且不会破坏系统。 Ubuntu、Debian 和 Red Hat 就是很好的例子。
例如,Ubuntu 每 6 个月发布一个版本。但只有每两年(偶数年的四月)更新一次长期支持(LTS)版本(例如22.04 LTS),支持期限为5年。
“滚动发布”发行版,重点是在软件的新版本被认为稳定并经过测试后立即将其放入其存储库。 Arch 和 Kali 是常见的例子。
作为另一个例子,openSUSE 有以下发行版本:每个型号,并且两者都可以通过 Microsoft Store 安装 WSL 获得。如果您在商店中搜索 openSUSE,您会发现“Leap”版本(稳定)和“Tumbleweed”(滚动)。
选择稳定版本还是滚动版本完全取决于您。我个人把两者都保留在身边。在 WSL 上根本没有理由限制自己只能使用一种发行版(磁盘空间除外)。我已经使用 Tumbleweed 作为我的滚动版本有一段时间了,最新的 Ubuntu LTS 作为我的稳定版本。然而,Artix 作为一个滚动版本(基于 Arch)给我留下了深刻的印象,并且我可能会尝试将它作为我的日常滚动驱动程序一段时间。
另请注意,作为一名开发人员(根据您首先在 Stack Overflow 上发布的事实以及您在那里的个人资料),根据您使用的语言和工具,这对您来说可能并不那么重要。您似乎通过 SO 标签进行了大量基于节点/React/web/框架的开发。在 WSL(或任何 Linux 发行版)下,您不太可能使用预打包的 Node.js 存储库版本。您将通过
nvm
或安装n
。然后,当然,您将通过npm
,yarn
(或其他)安装包/模块。即使对于对系统至关重要且不应更改的语言(例如,更改 Linux 发行版中的 Python 版本是一个坏主意),您也可以使用 Docker 或其他虚拟化/容器技术在 WSL 上使用不同的语言版本,与分布无关。 (有关该主题的更多阅读内容 - 请参阅我最近在 Ask Ubuntu 问题上关于 Docker Python 的回答如何使用 apt-get 安装不同的 Python 版本?)。
因此,作为一名开发人员,如果您没有任何非开发人员的理由来选择滚动发布、稳定风格的发行版可能从长远来看,让您的生活更轻松。
文档和支持的可用性是选择发行版的另一个充分理由。正是基于此,我不得不向大多数新的 WSL 用户推荐 Ubuntu(正如您提到的,它现在是默认的 WSL 发行版)。您找到的大多数博客、视频或其他指导文档都将重点介绍如何在 Ubuntu 中执行操作。这可能会在某种程度上转向 Arch,但目前我认为这个阵营的优势仍然是 Ubuntu。
这并不是说您可以盲目地遵循任何 Ubuntu(或任何发行版)文档并让它在 WSL 上运行。 WSL 存在许多差异,这意味着您经常需要对说明进行一些调整。下面介绍了其中一些差异,但我尝试在这个询问 Ubuntu 答案。
另一方面,请注意 Kali 是一个高级发行版,即使在不是在 WSL 中。请参阅这里的优秀元帖子,如果您需要询问,那么 Kali Linux 不是适合您的发行版。
那么,在 [WSL] 背景下,分布的相关性是什么?
在 WSL 中,“Distribution”这个词实际上有点超载,有多种含义,以及与“正常”定义的一些重要区别Linux发行版:
首先,WSL 发行版的核心只是一个打包根文件系统。它可以包括一些简单的内容,例如单个静态链接可执行文件(如 BusyBox)或包、脚本和包管理的复杂生态系统(如 Ubuntu 或 Arch)。
该包可以是:
tar
或者tar.gz
- 最新 WSL 预览版中的Hyper-V 虚拟磁盘映像(
vhd
或)。vhdx
但实际上,只要您可以以这两种形式之一打包文件,至少可以
wsl --import
打包到 WSL 发行版中。有一些方便的(并且可能经过测试的)发行版可以从 Microsoft Store 安装到 WSL 中,但它们最终打包了install.tar.gz
一个然后安装到 WSL 中。WSL 的包装还有一个额外的优点:真的轻松将任何具有 Docker 映像的软件转换为 WSL“发行版”。只需
docker pull ...
、docker run ...
、 和docker export ...
创建一个 tarball。如果想要 Microsoft Store 中没有的 Red Hat 映像,只需获取相应的 Docker 映像即可。忙碌盒?相同的。 ETC。然而,要成为“可启动”发行版,您至少需要:
- 具有
/etc/passwd
一个或多个用户的。 - 为主用户定义的 shell,它成为默认入口点。
- 如果用户不是
root
,那么您需要/etc/wsl.conf
定义默认用户(请参阅这里) 或注册表项。
“普通”Linux 发行版通常还提供默认值:
- 初始化系统
- 内核与驱动程序
- 引导加载程序(通常为 GRUB2)
- X 和/或 Wayland 服务器
WSL 中不需要或没有使用这些。 WSL 提供了自己的内核。虽然(至少在 WSL2 中)您可以构建自己的内核(从标准内核源)并替换它,但单个内核在您安装在 Windows/WSL 系统上的所有发行版之间共享。在 WSL1 中,这是一个伪内核,用于将系统调用从 Linux 转换为 Windows。在WSL2中,它是一个真正的Linux在托管(例如,您通常无法看到它、访问它或更改它)Hyper-V 虚拟机中运行的内核。
WSL 还提供了自己的 init 系统,该系统处理 WSL/Linux 和 Windows 层之间的互操作性(例如网络、通过 执行 Windows 二进制文件的能力
binfmt_misc
、WSLg 引导等)。这可能会产生问题,因为 WSL 确实不是运行大多数 Linux 发行版的标准 init。例如,尽管 Ubuntu/Debian/Arch(除了一些小众发行版之外的几乎所有发行版)都运行 Systemd,但 WSL 不会启用它,即使在运行这些“发行版”之一时也是如此。看我的解释这里和这里。
当然,虽然 Systemd 是占主导地位的 init 系统,但它比 WSL 下的大多数其他 init 系统问题更多,因为 WSL 的 init 和 Systemd 都在争夺 PID1。 Systemd 将断然拒绝以 PID1 以外的任何方式运行(并且 WSL2 不会允许它,而不使用命名空间作为解决方法)。其他一些 inits/进程管理器可以作为非 PID1 运行,因此更(恕我直言)更适合在 WSL 下使用。例如,我在 Artix 和 Dinit 方面取得了巨大成功。作为一名普通的流程经理,主管在大多数发行版下都工作得相当好。
WSL“分发”也可以表示从导入的包创建的“实例”或“容器”。运行
wsl -l -v
将列出系统上已安装的发行版。当您运行其中之一时,至少在 WSL2 下,运行的本质上是您导入的包的容器(隔离的命名空间)。
Linux 发行版通常还附带默认桌面环境(例如 Gnome、KDE Plasma、Xfce 等)以及(正如您提到的)主题。虽然可以从 WSL 中的发行版运行桌面环境,但这不是标准过程。在 Windows 11 中,WSL 可以通过使用 WSLg 功能来运行 Linux GUI 应用程序,但这只是为了运行集成到 Windows 11 中的单个 Linux 应用程序。视窗桌面。
运行Linux桌面环境能可以完成(通过第三方 X 服务器、WSLg 全屏 Weston/Xwayland 或 XRDP),但是(除了 XRDP)您需要确保更改诸如Alt+之类的键绑定Tab,以便它们不会不会被 Windows 内置功能拦截。
答案2
我的理解是Linux发行版是指操作系统的皮肤。操作系统核心之上的 UI 层。
这是不正确的。 Linux 发行版在许多基本方面都存在差异,这些差异超出了 GUI 的外观和感觉:
- 版本的内核,以及各种自定义(想要最新的内核和尖端软件?使用 Fedora。想要稳定性?使用 RHEL。)
- 支持不同的硬件设备
- 包管理器(RHEL 有
rpm
、yum
、 和dnf
;Debian 有dpkg
和apt
;ArchLinux 有pacman
;等等) - 软件包和工具(例如,Debian 在其主要存储库中仅包含免费和开源软件)
- 存储库,具有不同的更新和错误修复时间表
但是,如果您的主要用途只是编写一些 Bash 脚本,那么无论使用哪种发行版,您的体验都会或多或少相同。
答案3
从广义上讲,分布的差异就是皮肤的差异。不同的图形界面只是它的一个特例。首先,任何两个分配函数之间有两个主要区别:
- 存储库中包含哪些内容以及不包含哪些内容;
- 基本工具的默认值是什么。
第一个示例可以是库或应用程序的版本。一旦开发人员制作了新版本 - 分发版的维护者应该下载它,编译并在存储库中发布。如果维护者(真实的人)预计应用程序的新版本中会出现很多错误 - 他可以跳过该版本。但另一个发行版的维护者将按原样发布它,并允许普通用户直接向开发人员抱怨错误。
对于第二个:在 Ubuntu 中,sudo
正在检查组wheel
中是否有允许使用sudo
.在 Fedora 中,该组名为sudo
。sudo
在将其作为基本工具之一放入存储库之前,这种差异已在编译过程中内置到工具中。
请不要忘记,终端也是一个 UI。只是不是图形化的。而且也可能存在差异。例如:在 Ubuntu 中,您用于apt
从其存储库安装新应用程序,但在 Fedora 中您用于执行dnf
相同的任务。这可以被视为不同的 UI 选择。他们具有相同的目的以及几乎相同的能力和局限性。只是不同的命令行键集,并且正在处理不同结构的包。
通过对操作系统结构的充分了解,可以忽略您安装的发行版并混合不同发行版的不同方法。您可以sudo
自己重新编译并定义其特殊组,例如admins
。或者您可以dnf
在 Ubuntu(或apt
Fedora)上安装并从两个存储库下载应用程序,之后您可能需要调整下载的应用程序的一些设置,但这是可能的。当然,您始终可以下载一些应用程序/库作为源代码,然后自己编译它,并共享编译后的版本 - 这将成为您自己的发行版。
这适用于操作系统的正常设置和 WSL 操作系统。
答案4
我不完全确定这是否是您问题的“最佳”答案,但不同的发行版在给定时间点可能有不同的内核要求,导致 WSL1 兼容性在发行版之间有所不同。
作为一个实际的例子,Arch Linux 遭受了“内核太旧”问题有一段时间,由于 glibc-2.33-4 的更改,而 Ubuntu 没有。
然而,这个问题CentOS 上的 Arch 容器也出现了,因此它本身并不特定于 WSL1。但实际上,这意味着让 Arch 在 WSL1 上运行会更加困难。