fudyou 发表于 2022-7-4 16:04:34

制作适用于 WSL 的任意 Linux 镜像

https://teddysun.com/wp-content/uploads/2018/win_linux.jpgWSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档。
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。

下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
其他常见发行版的 qcow2 文件下载地址(节选)
CentOS 7.9
CentOS 8.4
AlmaLinux 8
Fedora 36
Debian 10
Debian 11
Ubuntu 18.04
Ubuntu 20.04
Amazon Linux 2
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
转换 qcow2 文件到 raw 文件
<pre class="prettyprint lang-bsh"><span class="pln">qemu</span><span class="pun">-</span><span class="pln">img convert </span><span class="pun">-</span><span class="pln">f qcow2 </span><span class="pun">-</span><span class="pln">O raw </span><span class="typ">Rocky</span><span class="pun">-</span><span class="lit">8</span><span class="pun">-</span><span class="typ">GenericCloud</span><span class="pun">.</span><span class="pln">latest</span><span class="pun">.</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">qcow2 </span><span class="typ">Rocky8</span><span class="pun">.</span><span class="pln">raw</span></pre>

使用 losetup 将 raw 文件虚拟成块设备
<pre class="prettyprint lang-bsh"><span class="pln">losetup </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">loop1 </span><span class="typ">Rocky8</span><span class="pun">.</span><span class="pln">raw</span></pre>

使用 kpartx 挂载虚拟文件系统
<pre class="prettyprint lang-bsh"><span class="pln">kpartx </span><span class="pun">-</span><span class="pln">a </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">loop1</span></pre>

使用 fdisk 查看挂载的分区情况
<pre class="prettyprint lang-bsh"><span class="pln">fdisk </span><span class="pun">-</span><span class="pln">l </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">loop1</span></pre>

返回如下信息
Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2cc9c27e

Device       Boot Start      EndSectorsSize Id Type
/dev/loop1p1 *   2048 16386047 163840007.8G 83 Linux


此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
挂载块设备到本机路径
mount /dev/mapper/loop1p1 /mnt


进入挂载点 /mnt,查看文件

cd /mnt
ls -la

返回如下信息total 16
dr-xr-xr-x. 17 root root224 Nov 15 03:17 .
dr-xr-xr-x. 18 root root256 Nov 17 09:09 ..
lrwxrwxrwx.1 root root    7 Oct 11 08:48 bin -> usr/bin
dr-xr-xr-x.6 root root 4096 Nov 15 03:24 boot
drwxr-xr-x.2 root root    6 Nov 15 02:50 dev
drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
drwxr-xr-x.2 root root    6 Oct 11 08:48 home
lrwxrwxrwx.1 root root    7 Oct 11 08:48 lib -> usr/lib
lrwxrwxrwx.1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
drwxr-xr-x.2 root root    6 Oct 11 08:48 media
drwxr-xr-x.2 root root    6 Oct 11 08:48 mnt
drwxr-xr-x.2 root root    6 Oct 11 08:48 opt
drwxr-xr-x.2 root root    6 Nov 15 02:50 proc
dr-xr-x---.2 root root114 Nov 15 03:47 root
drwxr-xr-x.2 root root    6 Nov 15 02:50 run
lrwxrwxrwx.1 root root    8 Oct 11 08:48 sbin -> usr/sbin
drwxr-xr-x.2 root root    6 Oct 11 08:48 srv
drwxr-xr-x.2 root root    6 Nov 15 02:50 sys
drwxrwxrwt.2 root root   84 Nov 15 03:47 tmp
drwxr-xr-x. 13 root root158 Nov 15 03:01 usr
drwxr-xr-x. 20 root root262 Nov 15 03:00 var打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
tar zcf /root/rootfs.tar.gz *
查看打包后的文件,确认文件存在,大小一般是在几百 MB
ll -h /root/rootfs.tar.gz
至此,Rocky Linux 8 的文件系统基本上就制作完成了。


3. 后续卸载挂载点
cd ~
umount /mnt使用 kpartx 卸载虚拟文件系统
kpartx -d /dev/loop1
使用 losetup 卸载虚拟块设备
losetup -d /dev/loop1
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
项目地址:https://github.com/yuk7/wsldl
下载最新版 Release 的 icons.zip 文件
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
https://teddysun.com/wp-content/uploads/2022/WSL_icons.png
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
https://teddysun.com/wp-content/uploads/2022/WSL_Rocky8.png
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统》
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。

5. 已制作好的 Linux 发行版下载链接如下:
CentOS 7.9
CentOS 8.4
Fedora 35
Fedora 36
AlmaLinux 8
AlmaLinux 9
Rocky Linux 8.5
Alpine 3.15
Ubuntu 18.04
Ubuntu 20.04
Ubuntu 22.04
Debian 10
Debian 11
Amazon Linux 2

页: [1]
查看完整版本: 制作适用于 WSL 的任意 Linux 镜像