如何在Windows上运行多个WSL2实例?

16

我已经安装了WSL2并在其上部署了两台虚拟机:

  • CentOS
  • Ubuntu-20.04

是否可以在我的win10机器上运行多个Ubuntu-20.04实例?

2个回答

32

完全可以。以下是我的建议步骤。在 PowerShell 中(也可以使用 cmd):

  • 创建一个方便的目录,在其中处理你的 WSL 镜像。当然,我会将其命名为 WSL。这个目录不一定要在 C:\ 上。

  • 创建两个子目录,imagesinstances。同样,这些名称实际上取决于你自己。

  • 运行 wsl -l -v 来确认你当前的发行版名称。

  • 使用类似 wsl --export Ubuntu images\2021-02-05_Ubuntu20.04_snapshot.tar 的方法备份你现有的 20.04 发行版(假设你的发行版名称为“Ubuntu”)。

  • 使用类似 wsl --import Ubuntu20.04_clone instances\Ubuntu20.04_clone images\2021-02-05_Ubuntu20.04_snapshot.tar --version 2 的方法使用该快照创建一个新实例。当完成后,你应该在你的 instances\Ubuntu20.04_clone 目录中看到一个 ext4.vhdx 文件。--version 是可选项,但显示了如果需要,你可以并排创建 WSL1 和 WSL2 实例(例如,如果你需要访问 NTFS 文件系统,则 WSL1 的速度要快得多)。

  • 使用 wsl ~ -d Ubuntu20.04_clone 启动该实例。或者重新启动 Windows 终端(假设你正在使用它),新实例应该会被自动检测到。

  • 默认情况下,新实例将作为 root 启动。你需要创建一个 /etc/wsl.conf 并设置你的用户名:

[user]
default=me

......当然,要替换为您的用户名。

  • 退出并终止该发行版(通过 wsl --terminate Ubuntu20.04_clone),然后重新启动它,并确认您的环境正在按照预期运行。

  • 现在您已经确认了新实例的正确操作,以下步骤是可选的,但建议执行。(有另一种方法,请参见Reddit线程中u/Zoredache的多条评论)。

    • 通过使用原始分布的wsl --unregister <distroname>,“重置”旧映像为干净状态。

    • 通过使用Windows“开始菜单”中的“启动->运行”并输入“Ubuntu”,重新运行该“应用程序”(技术上它是一个“应用程序执行别名”)。这将重新运行配置步骤并创建您的默认用户/密码/等(感谢@JackoBongo在评论中提供此建议)。

    • 出于方便起见,我建议您添加/etc/wsl.conf,如上所述添加到此实例。这样,每次添加或替换实例时就不必再执行一遍该步骤。注意:如果您计划将此映像分发给其他用户,则不要这样做;如果只为自己进行此操作,则可以这样做。

    • 使用上述wsl --export命令备份此“干净副本”,例如为2021-02-05_Ubuntu20.04_default.tar。现在,此“干净”版本可以成为您的起点,用于测试新的Ubuntu 20.04,而不必担心来自正常工作环境的应用程序/定制会妨碍您的测试。

    • 由于您已经运行多个发行版(CentOS和Ubuntu),因此我猜测您已经在使用Windows终端了。但是,如果通过“开始菜单”中的“Ubuntu”条目启动Ubuntu,则您可能需要将克隆的vhdx文件复制回新安装的干净版本。您将在%userprofile%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc (或类似位置)找到“default”版本。


  • 谢谢!顺便问一下,这些实例是并行运行的,还是它们在某种程度上共享一个单例内核? - 古今中
    2
    请注意,在“/etc/wsl.conf”中,= 前后没有空格。 - edwillys
    1
    如果您想从一个全新的状态重新开始,似乎没有必要卸载Ubuntu并再次下载。只需注销当前的Ubuntu分发 (wsl --unregister Ubuntu) 并从开始菜单再次启动它。控制台窗口会出现并开始初始安装过程。 - JackoBongo
    我很兴奋,但遗憾的是,似乎它无法恢复备份中安装的任何文件、目录或软件包。我是不是漏了什么? - nathanjw
    1
    @nathanjw 嗯。由wsl --export生成的tar文件应该包含该实例中的所有内容. 请注意,我的说明让您导出为tgz(gzipped tar),但实际上wsl --export创建了一个普通的.tar. 这不应有任何影响,但在故障排除时会有所区别。将其重命名为tar并检查tarball的内容以查看其中的内容。非常乐意为您提供进一步帮助,但可能需要创建一个新问题(在Super User,更适合此类问题)以获取详细信息。仅仅评论不足以解决这个问题。 - NotTheDr01ds
    显示剩余2条评论

    7

    此外,GitHub 上也有一个图形界面(GUI)的项目,用于管理多个 WSL2 实例。可能会为您节省一些时间。


    1
    看起来很酷。我一直在考虑做类似的事情,但我选择编写了用于WSL参数的PowerShell 自动完成。我很快就会查看你的项目。我的下一步可能是基于dialog运行它在终端中,但我喜欢Flutter的概念。还要提醒一下,当您链接到自己的项目时,Stack 要求您披露这一点。 - NotTheDr01ds
    @NotTheDr01ds 噢,我忘了。我立刻添加它。你的自动补全项目看起来很不错。当您不想处理GUI时,这将节省大量时间。不幸的是,Windows的PS/cmd自动补全功能远不如Linux的那个经过深思熟虑。 - Bostrot

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接