Ubuntu 是否有 WSL 的替代方案?

Ya *_*a Y 12 alternative software-recommendation windows-subsystem-for-linux

Windows 现在有一个适用于 Linux 的子系统,您可以在其中尝试不同的发行版作为应用程序。无需虚拟机。Linux 上有类似的东西吗?

Not*_*1ds 27

首先,如果您在虚拟机上尝试发行版,它总是会带来更丰富、更“真实”的体验,但是……

无需虚拟机。Linux 上有类似的东西吗?

当然,WSL 2 使用的技术几乎适用于任何 Linux 操作系统,但也有类似的警告和限制。

请记住,正如@UtkarshChandraSrivastava 在此答案中提到的,WSL 2 确实在虚拟机中运行

然而,WSL 2 中运行的发行版是在命名空间/容器中运行的。每个正在运行的发行版都有不同的:

  • PID命名空间
  • 挂载命名空间
  • IPC命名空间
  • 悉尼科技大学命名空间
  • WSLg系统分布

但是,它们都与父 WSL2 VM 共享以下内容(因此彼此共享):

  • 用户命名空间
  • 网络命名空间
  • Cgroup命名空间
  • 设备树(除了/dev/pts
  • CPU/内核/内存/交换(显然)
  • /init二进制(但不是进程)

这与 Docker、Podman 和其他容器系统的工作方式非常相似。他们可能使用稍微不同的命名空间配置,但核心技术通常是相同的。

因此,在基础级别上,您可以使用容器(无论是 Docker、Systemd-machined、Podman 还是其他容器)重现 WSL2 在 Ubuntu 上所做的大部分操作。在任何这些场景中运行 GUI(尤其是桌面环境)通常都需要额外的配置,但这通常也是可能的。

完成后,您将能够检查发行版:

  • 包管理器
  • 库存存储库
  • 其他功能,例如 Arch 上的 AUR
  • 常规配置(stock shell启动文件等)

但是,您可能在使用网络工具或桌面工具时遇到困难。此外,与 WSL2 一样,容器内的内核将是来自主机 Ubuntu 发行版的内核,而不是特定于您正在测试的发行版的任何内核。


当然,在比容器简单得多的级别上,甚至可以使用chroot不同发行版的简单环境来实现大部分相同的体验。


Utk*_*ava 20

WSL-2 确实使用“轻量级实用虚拟机 (VM)”。

您始终需要虚拟机来运行不同的操作系统。

如果您只需要一个 shell 来测试不同的工具/发行版,那么有一个更出名的Multipass 。

  • WSL2 确实使用了 vm。WSL1 没有。 (5认同)
  • @丹M。是的,因为 WSL1 背后没有适当的 Linux 内核,它只是一个用于运行 Linux 二进制可执行文件的兼容层。 (3认同)
  • 我想这取决于你所说的操作系统,但从技术上讲,你需要一个虚拟机来运行不同的_内核_。其他一切都可以在容器中运行,无需虚拟化。当您在 Ubuntu 上的 docker 中运行 Alpine 时,是否算作运行不同的操作系统? (2认同)

Gil*_*il' 7

施鲁特

\n

TL,DR:schroot 是运行另一个 Ubuntu 版本或另一个基于 Debian 的发行版的程序的好方法。

\n

您可以使用schroot尝试另一个发行版的许多方面。这是在另一个 Linux 中运行 Linux 的最轻量级虚拟化环境(从技术上讲,它是一个虚拟环境,但与 Python 的虚拟环境有很多相同的意义,如果这告诉你什么 \xe2\x80\x94它不涉及任何形式的基于 CPU 或基于内核的虚拟化)。

\n

chroot是一项 Unix 功能,可让您在目录内运行程序,以便该程序只能看到该目录及其子目录,而看不到系统的其余部分。Linux 发行版希望某些文件位于特定位置(/etc/lib等),并且 chroot 可以让您告诉程序 \xe2\x80\x9creal\xe2\x80\x9d/etc实际上是/somewhere/etc等等。例如,您在 中安装 Debian /debian,然后运行chroot /debian bash并获得在 Debian 中运行的 bash 提示符。你得到 Debian 的 bash,从该 bash 启动的每个程序都是 Debian 中的任何程序,并将apt install somepackage安装该 Debian 中的软件包等等,因为 chroot 程序看到的/etc是真实的/debian/etc,等等。内核(因此硬件驱动程序)、网络配置和系统的所有其他方面(不是由磁盘文件决定的)都是外部世界的。

\n

chroot 有很多限制。例如,由于它看不到自己的树之外的任何内容,因此它无法访问/home/proc/dev您真正想要共享的系统的其他关键部分。它没有相同的用户帐户。此外,chroot 可以绕过安全策略,因此只允许 root(系统管理员)使用它。

\n

Schroot是一个围绕使用 chroot 安装另一个 Linux 操作系统提供许多便利功能的程序。它负责(根据其配置)创建 schroot 中的目录,/home以及/proc共享用户帐户等。它以 Ubuntu 软件包的形式提供,因此您可以使用apt install schroot您最喜欢的软件包管理器来安装它。安装程序后,创建一个配置文件来声明您想要的 schroot(请参阅 Debian wiki 或网络上其他地方的示例)。

\n

下一步是在 schroot 环境中安装另一个发行版。如何执行此操作取决于发行版。注意\xe2\x80\x94 您需要小心一些,因为 schroot 与主机共享很多东西,例如网络访问。如果您在 schroot 内启动网络服务器,它将需要端口上的独占访问权限,这会与主机上的相同软件发生冲突,除非将两者配置为使用不同的端口。没有统一的方法来安装另一个这样的发行版。

\n

Debian 及其衍生版本有两个非常方便的功能可以在 chroot 环境中安装另一个发行版:debootstrap 和服务抑制。Debootstrap ( apt install debootstrap) 是一个从 Debian、Ubuntu 或(可能需要一些配置)其他基于 Debian 的发行版下载一组入门包的工具,并将这些包安装在您选择的目录下。现代 Debian 版本带有服务抑制功能,因此在 chroot 内安装软件包不会自动启动系统服务(如果您想尝试旧版本,请小心这一点)。

\n

例如,我是一名软件开发人员,有时需要测试我的软件如何与旧版本或新版本的其他软件进行互操作。为了测试与 2015 年左右软件的互操作性,我使用了 Ubuntu 16.04 的 schroot:

\n
$ cat /etc/schroot/chroot.d/xenial \n[xenial]\ndescription=Ubuntu 16.04\ndirectory=/chroot/xenial\ntype=directory\ngroups=users\n
Run Code Online (Sandbox Code Playgroud)\n

我开始安装该系统debootstrap xenial /chroot/xenial https://archive.ubuntu.com/ubuntu/。然后我跑了

\n
sudo schroot apt install [more packages I needed]\nschroot ./interoperability-tests\n
Run Code Online (Sandbox Code Playgroud)\n

使用 Ubuntu 16.04 中的程序运行我的互操作性测试。

\n

  • @NotTheDr01ds 根本不是一个愚蠢的问题!您确实可以使用绑定安装。这就是 schroot 所做的。它负责了解需要哪些绑定挂载(并且这是可配置的),以及在 schroot 会话结束时卸载。 (2认同)

pa4*_*080 5

在我看来,您正在寻找GNOME Boxes,它使用最先进的虚拟化技术libvirtlibosinfoqemu使事情变得简单。

在此输入图像描述

是的 - 它提供了非常有限的配置选项,但字面意思是您只需点击大约 5 次即可在虚拟机中安装新的操作系统。

apt要通过运行以下命令安装 GNOME Boxes :

sudo apt update
sudo apt install gnome-boxes 
Run Code Online (Sandbox Code Playgroud)

注释和参考文献: