在WSL2中安装任意Linux发行版

为什么

因为我要准备EDK2的开发环境,但是我不想污染自己之前在用的 WSL 发行版

我在安装Docker之后发现 WSL 多出了两个发行版本docker-desktopdocker-desktop-data。这个我是知道为什么的,因为 Windows 上的 Docker 其实只是套壳,本质上还是用 Linux 版本的 Docker 进行工作的。不过重点不是这个,重要的是这个说明 WSL 可以安装多个 Linux distro

我第一反应是去 MSDN 看一下,搜multi distro,果然有对应的文档:Import any Linux distribution to use with WSL | Microsoft Docs

接下来围绕文档进行说明和操作

从本地导入 Linux distro tar 镜像

文档中提到,你可以通过导入tar包的方式安装任何 Linux 发行版,方法是使用如下命令:

1
wsl --import <Distro name> <InstallLocation> <FileName>

那么这个 tar 包要从哪里来呢?包括但不限于以下来源:

  • 从某些发行版的官网下载针对 WSL2 优化的容器镜像
  • 将某个发行版的 Docker 容器导出作为镜像
  • 将目前运行的 WSL 实例导出后再次导入

从发行版官网下载镜像

你可以在cloud-images.ubuntu.com的镜像库中找到任意版本的 Ubuntu 服务器 WSL 专用镜像,其他发行版的服务器版本应该也会提供

比如你可以在Ubuntu 21.04版本的目录中找到ubuntu-21.04-server-cloudimg-amd64-wsl.rootfs.tar.gz,作为要使用的镜像

下载完成后,执行相关操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS D:\> mkdir ubuntu_instance
目录: D:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/5/21 22:30 ubuntu_instance


PS D:\> cd vhds
PS D:\vhds> wsl --import my-ubuntu D:\ubuntu_instance D:\OS_Images\ubuntu-21.04-server-cloudimg-amd64-wsl.rootfs.tar.gz
PS D:\vhds> ls
目录: D:\vhds

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/5/21 22:31 1274019840 ext4.vhdx

可以看到,ext4.vhdx就是要提供给Hyper-V用的虚拟硬盘文件了,现在它已经被注册到 WSL2 中,你可以随时启动它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PS D:\ubuntu_instance> wsl -l
适用于 Linux 的 Windows 子系统分发版:
Ubuntu-20.04 (默认)
my-ubuntu
docker-desktop
docker-desktop-data
edk2
PS D:\ubuntu_instance> wsl -d my-ubuntu
Welcome to Ubuntu 21.04 (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage

System information as of Sat May 21 22:34:47 CST 2022

System load: 0.0 Processes: 8
Usage of /: 0.5% of 250.98GB Users logged in: 0
Memory usage: 2% IPv4 address for eth0: 172.27.197.78
Swap usage: 0%

0 updates can be applied immediately.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/root/.hushlogin file.
root@BakaFT-PC:/mnt/d/ubuntu_instance#

Docker ubuntu 容器仓库

现成的容器镜像,感谢开源社区的馈赠

22.04 的容器竟然只有不到 30MB..

tianon/docker-brew-ubuntu-core: Official imports of the Ubuntu Core tarballs for use in Docker (previously from https://partner-images.canonical.com/core/) (github.com)

自行导出 Docker 容器作为镜像

呃呃。。不想自己试了。如果确实有需求请查阅文章开头给出的 MSDN 文档,或者寻找其他博主的文章

将现有 WSL 实例导出作为镜像

使用wsl --export <Distro name> <Output path>,即可得到你原来发行版的克隆镜像

镜像安装后续设置

安装 sudo 并新建个人用户

这个教程针对那些用作 Docker 容器的镜像

一般来说,容器镜像是只有root用户的,并且只有运行操作系统必要的软件包,甚至连vi都没有

先建立一个用户

1
2
3
NEW_USER=<YOUR_USERNAME_HERE>
useradd -m -G sudo -s /bin/bash "$NEW_USER"
passwd "$NEW_USER"

下面安装一下vimsudo,然后使用visudo快速打开配置文件

1
2
3
apt install vim
apt install sudo
visudo

在最下面追加内容,保存即可

1
<USERNAME_HERE> ALL=(ALL:ALL) NOPASSWD: ALL

设置用户为 WSL 默认启动用户

/etc/wsl.conf写入如下内容

1
2
[user]
default=${NEW_USER}

也可以使用tee写入

1
2
3
4
tee /etc/wsl.conf <<_EOF
[user]
default=${NEW_USER}
_EOF

更改在 Windows Terminal 的标签名

Windows Terminal中,Ubuntu 实例的 Tab 名格式是user@machine:path,如果实例比较多的话根本分不清楚

好在你有办法避免这种情况,你可以根据这篇文档进行操作:Windows Terminal Tab Title Setup | Microsoft Docs

简单说,向.bashrc写入如下内容:

1
2
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
echo -ne '\033]0;<YOUR_TITLE_HERE>\a'
Author

BakaFT

Posted on

2022-05-21

Updated on

2023-12-28

Licensed under

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×