linux的windows子系统如何在WSL中安装多个独立的Ubuntu实例



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

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

cd C:UsersMattSlay
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>启动发行版。如果WSL2已经安装,那么发行版可以在--import期间使用--version选项在版本之间转换:

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

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

旁注:导入的发行版的默认登录名是root
对于Build 18980及更高版本,您可以创建或修改/etc/wsl.conf以设置默认登录用户,而不是篡改注册表或使用wsl -u <username>登录。参考

/etc/wsl.conf的内容。它可能在关闭或注销后生效。

[user]
default=<your-default-username>

这是可能的,但需要一些工作。您可以使用LxRunOffline-"一个用于Windows Subsystem for Linux(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.

首先我们必须找到该Windows应用商店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%WindowsAppsCanonicalGroupLimited.Ubuntu18.04onWindows_1804.2018.427.0_x64__79rhkp1fndgsc

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

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

下面是下一节备份,然后删除注册表项HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionLxss。将这两个文件放在这样的文件夹结构中(或根据您的需要):

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

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

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

这种方法是有益的,因为您可以使用Docker注册表中提供的各种发行版。

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

  1. 从终端运行分发
wsl -d Ubuntu-18.04
  1. 按照Docker Docs 的说明为Ubuntu安装Docker

  2. 运行docker服务

service docker start
  1. 使用所需的任何Linux发行版运行容器,例如Ubuntu 20.04
docker run -d ubuntu:20.04
  1. 列出所有容器,并保留所需分发的容器ID
docker ps -a
  1. 将所选容器导出到.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:dataexported-ubuntu-20.04.tar中可用。

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

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

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

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

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

.CreateLinuxDistro.ps1 -INPUT_FILENAME .focal-server-cloudimg-amd64-wsl.rootfs.tar.gz -OUTPUT_DIRNAME "$env:LOCALAPPDATAPackagesubuntu2004-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

在后台,如果创建了一个新用户,它还会将其默认外壳从/bin/sh更改为/bin/bash

最新更新