如何在WSL中安装多个独立的Ubuntu实例?

Mat*_*lay 23 windows-subsystem-for-linux

在Windows 10中,如何在WSL中安装多个独立的Ubuntu实例?我想为不同的工作空间分别设置实例.例如,一个在Python开发,一个用于Ruby开发,一个对于.NET开发的核心,等我知道我可以堵塞所有这些在同一个Ubuntu的上WSL实例,但我宁愿为每个这些单独的一个场景.这可能吗?

小智 117

较新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
Run Code Online (Sandbox Code Playgroud)

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

wsl --import UbuntuRuby .\UbuntuRuby ubuntu.tar --version 2
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您对这篇文章。我基于此制作了一个 GUI:https://github.com/bostrot/wsl2-distro-manager (4认同)
  • 新实例将与旧实例具有相同的用户(当然是副本),但将使用“root”作为默认登录名,并且我无法使用“ubuntu config --default-user &lt;username&gt;”,因为“ubuntu” ` 实际上是一个 .exe,上面的方法创建了一个目录。如何更改为我的用户而不是 root? (3认同)
  • 可能适用于 WSL 的命令行启动,不会创建 APPX 链接,因此没有启动器项目。真的想要启动器项目。 (2认同)

Luk*_*kti 14

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

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

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

  1. 从终端运行发行版
wsl -d Ubuntu-18.04
Run Code Online (Sandbox Code Playgroud)
  1. 按照Docker 文档中的说明安装适用于 Ubuntu 的 Docker

  2. 运行docker服务

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

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

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


Bra*_*aca 13

可能,但是需要一些工作。您可以使用LxRunOffline- “ Linux子系统(WSL)的Windows子系统的全功能实用程序”。您可以通过Chocolatey:进行安装choco install lxrunoffline,也可以下载并解压缩。您可能需要将LxRunOffline.exe添加到PATH。
https://lxrunoffline.apphb.com/download/{distro}/{version}将重定向到所需发行版的下载页面。根据lxrunoffline wiki,在这种情况下,它可能是... / ubuntu / xenial或类似名称,或者您可以直接从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.
Run Code Online (Sandbox Code Playgroud)

  • 刚刚尝试了 LxRunOffline,它非常棒。感谢您并感谢 LxRunOffline 团队。 (2认同)

Adr*_*tro 6

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

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

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

以下示例使用 Ubuntu20.04 (Focal Fossa) 使用先前下载的 tarball 创建 WSL2 实例(该示例使用以下一个: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
Run Code Online (Sandbox Code Playgroud)

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


Bis*_*iyo 5

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

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

Ubuntu 18.04的安装路径为:

%ProgramFiles%\WindowsApps\CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2018.427.0_x64__79rhkp1fndgsc
Run Code Online (Sandbox Code Playgroud)

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

  1. 分发用户空间tarball,名称为install.tar.gz(或任何TAR.GZ文件)。
  2. 要安装的主要可执行文件,名为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
Run Code Online (Sandbox Code Playgroud)

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