我有一个现有的 Ubuntu 发行版,我想要一个全新的 Ubuntu 映像作为第二个发行版。
我想我可以:
- 使用以下方法将我现有的发行版导出到 tar
wsl.exe --export
- 取消注册我现有的发行版
wsl unregister
- 从 Microsoft Store 卸载 Ubuntu
- 从 Microsoft Store 重新安装 Ubuntu,获得全新安装
- 通过 tar 导入
wsl --import
这样我就可以得到 2 个发行版,一个是我现有的,另一个是新的。有没有更简单/更好的方法?
这是最新的(截至撰写本文时)Windows 10 Build 19035
答案1
重要的:以下程序仅适用于Windows 10 内部版本 18305
或以上版本。请确保命令行中wsl.exe
有--import
选项。对于较旧的 Windows 10 版本,请尝试此替代方法。
程序:
首先,我们需要 Ubuntu 的 rootfs tarball。打开https://cloud-images.ubuntu.com/releases/(适用于 Ubuntu < 22.04)或https://cloud-images.ubuntu.com/wsl/(适用于 Ubuntu >= 22.04)在网络浏览器中。转到包含所需 Ubuntu 版本的文件夹。
下载
ubuntu-x.x-server-cloudimg-amd64-wsl.rootfs.tar.gz
文件(xx 用作版本号)。确保文件名有amd64-wsl
且文件类型为.tar.gz
(GZIP tarball)。例如,直接链接将如下所示:
https://cloud-images.ubuntu.com/releases/eoan/release/ubuntu-19.10-server-cloudimg-amd64-wsl.rootfs.tar.gz
- 现在我们将使用
wsl.exe
命令行安装它。打开命令提示符。实际命令格式如下:
wsl.exe --import <Distribution Name> <Install Folder> <.TAR.GZ File Path>
- 运行两次命令以使用不同的发行版名称安装 Ubuntu。文件夹名称和发行版名称必须不同否则输出中会显示错误。以下是两个示例:
wsl.exe --import DistroA FolderA ubuntu-x.x-server-cloudimg-amd64-wsl.rootfs.tar.gz
wsl.exe --import DistroB FolderB ubuntu-x.x-server-cloudimg-amd64-wsl.rootfs.tar.gz
- 已安装的发行版可以像这样执行
wsl.exe -d DistroA
。
笔记:
该过程可以与任何 GNU/Linux 发行版用户空间一起使用。
这不使用 Windows Store。因此,Windows Store 既不显示名称,也不更新安装。
在 Windows 10 ARM64(AArch64)中,使用
arm64-wsl
Ubuntu 的云映像。在此过程中,同一台机器上的其他用户可以访问安装文件夹。如果您使用的是共享机器,请使用适当的权限。
如果您愿意与同一台机器的其他用户共享安装,则只需导出此注册表
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss
。然后将其导入同一台机器的其他用户。
进一步阅读:
答案2
Biswapriyo 的回答效果很好,但需要额外的步骤来更改默认用户。请注意,这需要版本 18980 及以上。
通过命令添加非root用户adduser
:
PS C:\Users\Username> wsl -d DistroA
root@DESKTOP:/mnt/c/Users/Username# NEW_USER=username
root@DESKTOP:/mnt/c/Users/Username# adduser "${NEW_USER}"
Adding user `username' ...
Adding new group `username' (1000) ...
Adding new user `username' (1000) with group `username' ...
Creating home directory `/home/username' ...
Copying files from `/etc/skel' ...
New password: ****
Retype new password: ****
passwd: password updated successfully
Changing the user information for username
Enter the new value, or press ENTER for the default
Full Name []: User Name
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
启用 sudoer 权限${NEW_USER}
:
adduser ${NEW_USER} sudo
在 /etc/wsl.conf 中添加设置默认用户:
tee /etc/wsl.conf <<_EOF
[user]
default=${NEW_USER}
_EOF
通过 退出 WSL logout
,然后发出 WSL 关闭命令以使更改生效:
wsl --shutdown DistroA
下次wsl -d DistroA
调用时,${NEW_USER}
用户将处于活动状态。
答案3
我最近遇到了同样的问题,因为我同时与不同的公司合作,需要一个可以轻松创建新的 WSL2 实例并轻松删除它的脚本。
删除本身并不难,因为官方命令wsl --unregister <distro_name>
运行良好,可以完美地删除 WSL2 实例,而不留下任何痕迹。
然而,创建可能会很麻烦,甚至很乏味。我的脚本就是这样做的:https://github.com/IAL32/WSL2-Create-Distro
以下示例使用之前下载的 tarball 创建使用 Ubuntu20.04(Focal Fossa)的 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
在底层,如果创建了一个新用户,它也会将其默认 shell 从 更改/bin/sh
为/bin/bash
。
答案4
我建议使用 Ubuntu“基本”图像(比“云”图像更不臃肿):
下载 rootfs 并导入它:
wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-amd64.tar.gz
wsl --import my-ubuntu c:\wsl\my-ubuntu ubuntu-base-22.04-base-amd64.tar.gz --version 2
更新第一行/etc/passwd
或用户定义的/etc/wsl.conf
+passwd
定义一个启动的应用程序。
为了排除故障,你可以自己指定入口点-e
:wsl -d BaseUbuntu -e /bin/sh
你可以查看 rootfs 存档以查看哪些应用程序在/bin
/中/usr/bin
。找到 shell 后,你可以以 root 身份运行映像:
wsl -d my-ubuntu -u root -e /bin/sh
chsh
并使用或其他可用工具更新默认 shell 。