如何在 WSL 中安装多个单独的 Ubuntu 实例? [关闭]

Posted

技术标签:

【中文标题】如何在 WSL 中安装多个单独的 Ubuntu 实例? [关闭]【英文标题】:How do you install multiple, separate instances of Ubuntu in WSL? [closed] 【发布时间】:2019-01-06 03:51:49 【问题描述】:

在 Windows 10 中,如何在 WSL 中安装多个单独的 Ubuntu 实例?我想为不同的工作空间提供单独的实例。例如,一个用于 Python 开发,一个用于 Ruby 开发,一个用于 .Net Core 开发等。我知道我可以将所有这些都塞到 WSL 实例上的同一个 Ubuntu 中,但我宁愿为每一个单独一个情景。这可能吗?

【问题讨论】:

为什么不直接安装 VirtualBox 就可以了? @ivanivan 这只是除了完整的 VM-s、Vagrant、Docker 之外的另一种选择。选择哪一个取决于用例。与 VirtualBox 相比,它提供了对 Windows 的访问,并且几乎可以立即启动。 我们使用无法在其上运行 virtualbox 的 Surface Pro 机器。我们还尝试了 Hyper-V,但由于我们的基础架构也遇到了问题。正如 Braca 所说,这取决于您使用它的目的以及您可能因基础设施而受到的任何限制。 > 为什么不直接安装 VirtualBox 就可以了? - 我认为,VM 是一种资源密集型和笨重的解决方案。 【参考方案1】:

较新的wsl 命令的导入/导出功能可以轻松创建发行版的副本,而无需安装任何其他工具或使用RegEdit。例如

cd C:\Users\MattSlay
wsl --export Ubuntu ubuntu.tar
wsl --import UbuntuRuby .\UbuntuRuby ubuntu.tar
wsl --import UbuntuPython .\UbuntuPython ubuntu.tar
wsl --import UbuntuDotNet .\UbuntuDotNet ubuntu.tar
wsl -d UbuntuRuby

wsl -d <distro> 启动发行版。如果已安装WSL 2,则可以在--import 期间使用--version 选项在版本之间转换发行版:

wsl --import UbuntuRuby .\UbuntuRuby ubuntu.tar --version 2

较小的发行版,例如Alpine,可以使实验更快。最后,wsl --import 可以从标准输入- 读取,wsl --export 可以写入标准输出-。如果需要,这允许使用压缩程序来节省磁盘空间。

【讨论】:

注意问题:无法导入wsl2发行版#4530 新实例将与旧实例具有相同的用户(当然是副本),但将使用root作为默认登录名,我不能使用ubuntu config --default-user <username>,因为ubuntu实际上是一个 .exe,上面的方法创建了一个目录。如何更改为我的用户而不是 root? github.com/microsoft/WSL/issues/4276#issuecomment-509364493 说明如何更改默认用户:将 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\MY-UUID\DefaultUid (DWORD) 设置为来自 /etc/passwd 的 id 可能适用于 WSL 的命令行启动,不会创建 APPX 链接,因此没有启动器项。真的很想要启动器项目。 感谢您的这篇文章。我基于此制作了一个 GUI:github.com/bostrot/wsl2-distro-manager【参考方案2】:

这是可能的,但需要一些工作。您可以使用LxRunOffline - “适用于 Linux 的 Windows 子系统 (WSL) 的全功能实用程序”。

可以通过Chocolatey:choco install lxrunoffline安装,或者下载解压。

您可能希望将 LxRunOffline.exe 添加到您的 PATH。

https://lxrunoffline.apphb.com/download/distro/version 将重定向到所需发行版的下载页面。在这种情况下,它将是 .../ubuntu/xenial 或类似的,根据lxrunoffline wiki,或者您可以直接从Canonical 下载。

然后您可以:LxRunOffline install -n someName -d where/to/install -f path/to/downloaded/distro 多次使用不同的名称和目标目录。

然后您可以lxrunoffline -w -n someName 开始所需的安装,最后,您可以在桌面上创建多个快捷方式,为特定的工作空间提供不同的选项。 LxRunOffline 可用命令:

list           List all installed distributions.
get-default    Get the default distribution, which is used by bash.exe.
set-default    Set the default distribution, which is used by bash.exe.
install        Install a new distribution.
uninstall      Uninstall a distribution.
register       Register an existing installation directory.
unregister     Unregister a distribution but not delete the installation directory.
move           Move a distribution to a new directory.
duplicate      Duplicate an existing distribution in a new directory.
run            Run a command in a distribution.
get-dir        Get the installation directory of a distribution.
get-env        Get the default environment variables of a distribution.
set-env        Set the default environment variables of a distribution.
get-uid        Get the UID of the default user of a distribution.
set-uid        Set the UID of the default user of a distribution.
get-kernelcmd  Get the default kernel command line of a distribution.
set-kernelcmd  Set the default kernel command line of a distribution.
get-flags      Get some flags of a distribution. See https://msdn.microsoft.com/en-us/library/windows/desktop/mt826872(v=vs.85).aspx for details.
set-flags      Set some flags of a distribution. See https://msdn.microsoft.com/en-us/library/windows/desktop/mt826872(v=vs.85).aspx for details.
version        Get version information about this LxRunOffline.exe.

【讨论】:

刚刚尝试了 LxRunOffline,它非常棒。谢谢你,也感谢 LxRunOffline 团队。【参考方案3】:

首先,我们必须找到该 Windows Store Appx 的安装位置。这是一个用于查找该路径的 Powershell 脚本。首先输入分发名称(例如Ubuntu18.04)。

$DistroName=Read-Host "Enter Distribution Name"
$path = (Get-AppxPackage "*$DistroName*").InstallLocation
echo $path
Invoke-Item $path
pause

Ubuntu 18.04 的安装路径为:

%ProgramFiles%\WindowsApps\CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2018.427.0_x64__79rhkp1fndgsc

在 PS 脚本中,Invoke-Item 将在文件资源管理器中打开该路径。如果该路径不可见或显示任何安全问题,则从其“属性”菜单授予访问该文件夹的权限。现在只复制这两个必需的文件:

    分发名为 install.tar.gz(或任何 TAR.GZ 文件)的用户空间 tarball。 要安装的主要可执行文件,命名为 Ubuntu.exe 或 Ubuntu1804.exe 或 Ubuntu1604.exe 等。

接下来是下一节。 备份,然后删除注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss。将这两个文件放在这样的文件夹结构中(或根据需要):

C:\MyFiles
|
+-- UbuntuPython
|   |
|   +-- ubuntu.exe
|   +-- install.tar.gz
|
+-- UbuntuRuby
    |
    +-- ubuntu.exe
    +-- install.tar.gz

文件夹名称应该不同。现在双击第一个复制的.exe 可执行文件,等待它安装。打开HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss\<some-GUID> 并将DistributionName 字符串注册表更改为UbuntuPython(或任何)。对每个实例重复该过程。 GUID 对于每个实例都是新的。确保DistributionName 注册表项 更改为每个条目的不同值,否则ubuntu.exe 将执行wsl.exe 而不是安装。在GitHub: Microsoft/WSL-DistroLauncher 处查看这些 EXE 文件的源代码。

【讨论】:

更改DistributionName 注册表似乎不再起作用。相反,它会被损坏。有这方面的更新吗? “在我的机器上工作”【参考方案4】:

不是从 Microsoft Store 或 .appx 文件复制发行版,另一种解决方案是在 WSL 上运行的现有 Linux 发行版中利用 Docker。这个方法其实在WSL Docs by Microsoft中有说明。

此方法非常有用,因为您可以利用 Docker 注册表中提供的各种发行版。

例如,您已经从 Microsoft Store 安装了 Ubuntu-18.04 发行版。

    从终端运行分发
wsl -d Ubuntu-18.04

    按照instruction from Docker Docs为Ubuntu安装Docker

    运行 docker 服务

service docker start
    使用所需的任何 Linux 发行版运行容器,例如 Ubuntu 20.04
docker run -d ubuntu:20.04
    列出所有容器,并保留所需分发的容器 ID
docker ps -a
    将选中的容器导出为.tar文件,例如容器ID为123123abcabc,你想将导出的文件保存在C:\data中。 WSL 将您的 Windows 目录挂载到正在运行的 Linux 上的 /mnt 目录中。如果您在 Windows 上有一个 C:\data 目录,则可以在您的 Linux 上的 /mnt/c/data 目录中访问其内容。
docker export 123123abcabc > /mnt/c/data/exported-ubuntu-20.04.tar

现在,导出的文件在C:\data\exported-ubuntu-20.04.tar 中可用。

    从 Linux 退出,返回 Windows 终端,然后将导出的容器导入为具有任何所需名称的新发行版,并存储在 Windows 中的任何位置
exit
wsl --import anyName C:\data\anyLocation C:\data\exported-ubuntu-20.04.tar
    现在,您可以在列表中看到您的新发行版并运行它
wsl --list -v
wsl -d anyName

【讨论】:

【参考方案5】:

我最近遇到了同样的问题,因为我同时与不同的公司合作,并且需要一个可以轻松创建新 WSL2 实例并同样轻松删除它的脚本。

删除本身并不难,因为官方命令wsl --unregister <distro_name> 工作得很好,并且完美地摆脱了 WSL2 实例,不留任何痕迹。

然而,创作可能会很麻烦甚至乏味。我的脚本就是这样做的:https://github.com/IAL32/WSL2-Create-Distro

以下示例使用之前下载的 Ubuntu20.04 (Focal Fossa) 创建 WSL2 实例 tarball(示例使用下面的一个:https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64-wsl.rootfs.tar.gz),创建一个用户名为myuser的用户 并将其添加到组sudo。它还将用户密码设置为管道中给定的密码,root 用户的密码也在管道中给出。

.\CreateLinuxDistro.ps1 -INPUT_FILENAME .\focal-server-cloudimg-amd64-wsl.rootfs.tar.gz -OUTPUT_DIRNAME "$env:LOCALAPPDATA\Packages\ubuntu2004-test-1" -OUTPUT_DISTRONAME ubuntu2004-test-1 -CREATE_USER 1 -CREATE_USER_USERNAME myuser -ADD_USER_TO_GROUP 1 -ADD_USER_TO_GROUP_NAME sudo -SET_USER_AS_DEFAULT myuser

在后台,如果创建了新用户,它也会将其默认 shell 从 /bin/sh 更改为 /bin/bash

【讨论】:

以上是关于如何在 WSL 中安装多个单独的 Ubuntu 实例? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在wsl中运行Windows应用程序(如VSCode)

WSL2中安装docker 并开机启动

微软 WSL 重装操作系统

如何在 Ubuntu 中安装 clang-format?

如何在windows 11中安装WSLG(WSL2)

WSL2_07 VSCode配置并编写Python程序