|
|
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
. w+ R6 a: g$ R0 Q+ Y: s5 b如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档。 {1 M+ S7 M; x
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
' i) l/ O( `: [% _微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。* [ W F+ @; d( h( F& v
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。
) z3 L* L1 o& Q3 P6 Y1 @2 g6 P5 T# W; l: b$ {* p
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
5 g7 c1 v$ B/ M/ z y1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址: x! Z, T' f' [" `
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
1 d- G, L. Y: q( v其他常见发行版的 qcow2 文件下载地址(节选)# W9 q; \1 C# k/ D/ a3 I8 I
CentOS 7.9
$ Z+ r5 G: o3 H4 Q' P# JCentOS 8.4
+ B( X; C3 p( Y* WAlmaLinux 8# ^: l0 k; O% h
Fedora 36
+ H4 q! A; V- r% G7 D8 @ BDebian 10
) H# X0 M1 p' I- H. w& sDebian 11
7 Q+ v( N2 c! i* A9 f, JUbuntu 18.04
9 v3 N/ J0 V: T* L# b# TUbuntu 20.04" u/ F Z; \# q( \8 C7 `
Amazon Linux 23 v0 F3 W6 f) j# G9 y
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。! g3 M e6 f4 G3 R* f' Z
转换 qcow2 文件到 raw 文件
; m5 g0 F' `2 m! Q% k Y- <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>
复制代码 9 }1 D: W# X. N5 Y
( ~! t3 p& F/ P( M使用 losetup 将 raw 文件虚拟成块设备8 Z* \& i Z4 p2 X' A
- <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>
复制代码
- x5 ^3 n- L) F2 K6 y( s8 h% o: W5 x7 |6 x N0 K
使用 kpartx 挂载虚拟文件系统
) ^: h2 h E- @& Q8 W: s- <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>
复制代码
+ p' g9 [( S: U1 E, v3 e/ F" x* [+ D @* i6 o9 j/ J
使用 fdisk 查看挂载的分区情况
! [' Z1 y" T; C- c+ L: {- j- <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>
复制代码 0 O- e l6 N$ [- K8 Q& u
8 V( w+ [" Q( T6 h# c" V$ {返回如下信息7 r- G' T F0 W1 _
- Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors2 p- ^$ F, P. ]' q' `
- Units: sectors of 1 * 512 = 512 bytes S; V9 ?* r5 K$ B! u
- Sector size (logical/physical): 512 bytes / 512 bytes
( N$ m4 i9 M7 {' w - I/O size (minimum/optimal): 512 bytes / 512 bytes
' D& C5 ~: }) x - Disklabel type: dos8 {, A# l- u' r3 \% q5 |; l8 e
- Disk identifier: 0x2cc9c27e
" s3 h: ~, \6 R+ f- i& Y( c - 3 V3 H+ N& Y4 L5 A
- Device Boot Start End Sectors Size Id Type
) Z- Z( v$ @9 y9 H1 z& C! h - /dev/loop1p1 * 2048 16386047 16384000 7.8G 83 Linux
复制代码
# H4 T2 \; f! S/ a9 P" o9 O* A) S6 L
+ s- I9 k/ @. n/ U: S; i# }& M! t
此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
' E5 L6 X9 j+ R2 G" z4 i9 ^挂载块设备到本机路径/ D. G. N- O0 s& ]4 Q' k/ _! ^
- mount /dev/mapper/loop1p1 /mnt
复制代码
$ l/ M& y0 p) j0 f6 r6 K1 F2 T: h
* }$ r O6 X& H. J, W, ^0 O$ m; ^3 _
进入挂载点 /mnt,查看文件 [4 p. \& h8 v% r9 U9 ~8 r* ~
D: f1 [- W9 v+ b- cd /mnt! n- p/ U p6 D) B, N# I0 B* ~
- ls -la
复制代码 2 r% E6 V8 B& y3 f) x
- y R# Z- B; h* P: ~ x3 o
返回如下信息- total 16
+ Z' k# G( |/ l. s - dr-xr-xr-x. 17 root root 224 Nov 15 03:17 .
: u$ z/ l$ T3 s; K: R7 g" v. { - dr-xr-xr-x. 18 root root 256 Nov 17 09:09 ..
# M# b" D/ p- I+ Q4 I# K4 v: ` - lrwxrwxrwx. 1 root root 7 Oct 11 08:48 bin -> usr/bin
! o: g/ ?1 P" Z N - dr-xr-xr-x. 6 root root 4096 Nov 15 03:24 boot
d4 @0 `0 ]: D" D5 H1 k - drwxr-xr-x. 2 root root 6 Nov 15 02:50 dev
/ X; [$ I. k5 E; T& B% A - drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
+ `: O8 G( ^! D6 X: N - drwxr-xr-x. 2 root root 6 Oct 11 08:48 home
1 [# s6 C% ]/ j# h4 R* ~0 [ - lrwxrwxrwx. 1 root root 7 Oct 11 08:48 lib -> usr/lib
3 M& o8 c: u- U: o* q" h) e: j# K+ g2 b - lrwxrwxrwx. 1 root root 9 Oct 11 08:48 lib64 -> usr/lib64) v0 F2 O; H/ z, m% v. v+ j) R
- drwxr-xr-x. 2 root root 6 Oct 11 08:48 media7 N7 ^% |* X8 a$ }3 O+ @& @
- drwxr-xr-x. 2 root root 6 Oct 11 08:48 mnt( u3 ]& x" _7 c5 ^! {5 w; c
- drwxr-xr-x. 2 root root 6 Oct 11 08:48 opt+ X0 l' _* g7 p
- drwxr-xr-x. 2 root root 6 Nov 15 02:50 proc
! X) q# v. `) d1 e. r& s9 N5 C - dr-xr-x---. 2 root root 114 Nov 15 03:47 root/ r5 M1 C0 M. j o
- drwxr-xr-x. 2 root root 6 Nov 15 02:50 run
/ |8 |; p, Z9 w& i! t0 u - lrwxrwxrwx. 1 root root 8 Oct 11 08:48 sbin -> usr/sbin* e# p0 n& E" M8 o( l6 B. y
- drwxr-xr-x. 2 root root 6 Oct 11 08:48 srv
- f7 ^4 Q: y. i9 l) w - drwxr-xr-x. 2 root root 6 Nov 15 02:50 sys
/ Z6 s! y! n3 b - drwxrwxrwt. 2 root root 84 Nov 15 03:47 tmp n; I# P2 N( \- ?
- drwxr-xr-x. 13 root root 158 Nov 15 03:01 usr
; |! h2 z* s& y2 _ - drwxr-xr-x. 20 root root 262 Nov 15 03:00 var
复制代码 打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root0 A3 }. I0 u# f9 d$ L Q
- tar zcf /root/rootfs.tar.gz *
复制代码 # d4 {3 \. P3 H8 v
查看打包后的文件,确认文件存在,大小一般是在几百 MB * a( o1 d8 r4 @# m
- ll -h /root/rootfs.tar.gz
复制代码
. X; i0 m$ \, X# J! }至此,Rocky Linux 8 的文件系统基本上就制作完成了。- n- m3 v3 a+ A
8 t/ \+ y5 _% x4 W' I% Z
3 O3 \6 t! l: y' H
3. 后续卸载挂载点" t) E u& a# R8 |
- cd ~- }& T* K+ R+ m7 i1 B6 v/ F
- umount /mnt
复制代码 使用 kpartx 卸载虚拟文件系统) q" v% ~" g2 J7 N6 A5 k1 {
. L, t, ?4 t1 v2 K
使用 losetup 卸载虚拟块设备. [& X J" N3 \' _" g! U) m
1 F4 e4 B$ u, H, _( i7 c
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
$ f- M) @9 F7 d: l/ I项目地址:https://github.com/yuk7/wsldl8 D& c: T+ }) Y% |
下载最新版 Release 的 icons.zip 文件! L$ d6 K& ~$ \
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
+ b- L8 `0 Z; K: E, p3 J2 u; h 7 [- ^! N) b* x8 F
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。( K: G* T0 k% r$ y$ U l' u+ M

+ t: P2 D7 g( q, e双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统》: E; B3 e6 X3 |* F. V
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。4 E% y* @4 |( a2 V+ S8 ^9 Y, `! b- P
; O3 H9 ]4 W2 g0 U
5. 已制作好的 Linux 发行版下载链接如下:4 u# a( M# K- M( S# G
CentOS 7.9
2 H v& {& \* ? t* LCentOS 8.4; U- }& {; ^6 }1 X/ Y4 l! f
Fedora 35
& B( }3 T o1 {3 `Fedora 362 p* I1 H# o, v1 H1 p
AlmaLinux 8
! x- B1 E$ g7 s& R3 q8 Q7 VAlmaLinux 9
9 d1 U' F) k9 C r+ }5 z& w& TRocky Linux 8.5
$ f7 D0 R; i3 LAlpine 3.15
% Z: l0 S7 r$ eUbuntu 18.04
: C4 ^/ S! c9 H, r) gUbuntu 20.04' B( o- x0 r7 t4 N v- B2 v0 ^, i. I3 V
Ubuntu 22.04( I' h1 o" p! M3 o( ]4 o3 W9 H
Debian 10
4 ^! v8 v/ O! K, j) hDebian 11
+ o8 J; v* _2 o: H# _Amazon Linux 27 {0 c6 @! d( O9 a+ m+ r
; Y) U: b; z# r7 a: e |
|