|
|
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。' O' X0 j/ [/ F: ?' J; D3 r
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档。
& n+ n, ~4 T' _Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。# N0 B; y8 p/ @# Q2 y4 O4 o+ c! U5 h/ w
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
; i- Q' G5 q% B" k! s' ?本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。0 V! S/ N8 p+ m5 ?$ Y# _# t
7 T3 o" @! f/ h" Y
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
- k: I( O6 ?) a$ o- k9 X7 Q1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
* ^# l; {2 @/ X. i5 z1 z5 l' w# xhttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow26 W. K) \1 K3 l1 `# C- _# I9 L
其他常见发行版的 qcow2 文件下载地址(节选)/ E# |9 R V7 O& N
CentOS 7.9
8 L o: @* ^% s; M# N! zCentOS 8.4
3 U0 P( D, K1 }8 w1 s9 ^+ { ~( Y+ [AlmaLinux 8' ~! f& c+ L6 A
Fedora 36- @5 s7 ~5 i- z- H' l
Debian 10& b# y9 O! u7 `2 C# A
Debian 115 z& [8 [6 @, `) g/ `
Ubuntu 18.04) S" V; Y2 ?# g- h+ u7 f
Ubuntu 20.04
) E2 Y, \% j" c; \+ x: [- cAmazon Linux 2
. _1 u- S9 {/ i+ I& l2 T2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
& A! `1 [! w2 z+ B转换 qcow2 文件到 raw 文件
9 `; t/ ^# O9 ]8 H' u: @. i; W- <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>
复制代码
3 R, z% D, z; l) O" o& m: G
0 c3 x6 A& \3 s, r5 E; _- R使用 losetup 将 raw 文件虚拟成块设备
; \% |: N* H" @6 p/ }# o/ M, y* Q" O1 t- <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>
复制代码
?6 O; r! [$ d" i* x# O8 z# f' K Y5 [4 Q
使用 kpartx 挂载虚拟文件系统
! W# {9 c; f* s* F K- <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>
复制代码
* [- H9 f% ?; s" n7 i3 C3 g8 `/ i5 A+ m- y0 G, r
使用 fdisk 查看挂载的分区情况# Q+ K0 v1 U2 S! c. l( |: X
- <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>
复制代码
4 O$ R# e p& ~% Q i7 v
5 P' S& s3 ]* {0 v# k返回如下信息
F- t; [" t% l# K: J u# @7 }- Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors" N5 @% \- S) Z( c* B, K6 a6 b3 M
- Units: sectors of 1 * 512 = 512 bytes( g& F+ x. h8 b' |) d
- Sector size (logical/physical): 512 bytes / 512 bytes* p. {& n% b$ C# p; z# M+ y- ]
- I/O size (minimum/optimal): 512 bytes / 512 bytes
# m1 H0 B3 K0 m- L( `* ]7 Y/ L/ H - Disklabel type: dos
( u7 W q" A* T/ u y9 u - Disk identifier: 0x2cc9c27e
( O+ r4 j9 ?6 y4 k - % Q+ L; J, C4 n3 X5 k
- Device Boot Start End Sectors Size Id Type: p# p" D$ t, t& z: |8 h
- /dev/loop1p1 * 2048 16386047 16384000 7.8G 83 Linux
复制代码 & u) S: [( F n9 W/ {8 ^6 ^6 Y
; c/ \5 g v @: N! J
1 C6 E f" V, D) h5 ~此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。; c2 |1 U' x# w/ U. a# k; C# B
挂载块设备到本机路径
( o/ K) C4 J) S6 J( U% v- mount /dev/mapper/loop1p1 /mnt
复制代码 $ I3 [4 }, K% i
6 q! p9 t, G4 g! f9 S
4 E$ e; N. x E2 J进入挂载点 /mnt,查看文件& ^3 h, I, M& F6 h
[- `* k1 V+ }! ^- cd /mnt' U2 l3 @- J, ^, {) m6 ^/ ~3 \
- ls -la
复制代码
- G9 M6 ~, a8 B4 K
1 m7 L4 A( O! z9 [' Z5 k返回如下信息- total 16: k8 P7 ^6 F7 A" T4 W
- dr-xr-xr-x. 17 root root 224 Nov 15 03:17 .
9 y9 S) t& S, j/ }" n+ ^ - dr-xr-xr-x. 18 root root 256 Nov 17 09:09 ..# D# B$ `! |/ z7 n% a, W: I3 m( L
- lrwxrwxrwx. 1 root root 7 Oct 11 08:48 bin -> usr/bin
$ i+ s6 O5 D, A; c+ X) u - dr-xr-xr-x. 6 root root 4096 Nov 15 03:24 boot: q( U, G, l; F5 @! ^1 o
- drwxr-xr-x. 2 root root 6 Nov 15 02:50 dev
5 ]. B8 T( m# |, I1 S- t( M0 v - drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc+ D* m) F7 e* p9 Z& {
- drwxr-xr-x. 2 root root 6 Oct 11 08:48 home! U/ n! R& g. ^/ K# q& }# J
- lrwxrwxrwx. 1 root root 7 Oct 11 08:48 lib -> usr/lib7 p5 N! G/ S4 _: M7 V2 P7 c o3 e
- lrwxrwxrwx. 1 root root 9 Oct 11 08:48 lib64 -> usr/lib64
% t3 p; M2 S, W* m - drwxr-xr-x. 2 root root 6 Oct 11 08:48 media( |' V2 G, U# [) s
- drwxr-xr-x. 2 root root 6 Oct 11 08:48 mnt
6 h" A6 D& A }6 R& R - drwxr-xr-x. 2 root root 6 Oct 11 08:48 opt6 m4 e1 g! n8 p2 X; t% s/ s
- drwxr-xr-x. 2 root root 6 Nov 15 02:50 proc& C1 n5 U$ d0 b" L
- dr-xr-x---. 2 root root 114 Nov 15 03:47 root( \, {) j7 O1 F/ k0 m" o9 `6 ]
- drwxr-xr-x. 2 root root 6 Nov 15 02:50 run
! v, q4 i- C3 }0 s - lrwxrwxrwx. 1 root root 8 Oct 11 08:48 sbin -> usr/sbin
. ?! u/ I1 y6 l - drwxr-xr-x. 2 root root 6 Oct 11 08:48 srv N9 Y0 n# e( ?4 A, r
- drwxr-xr-x. 2 root root 6 Nov 15 02:50 sys
s' j. D" V/ j# ~ - drwxrwxrwt. 2 root root 84 Nov 15 03:47 tmp
6 `8 ^ }% r! }! Q% e$ w: e - drwxr-xr-x. 13 root root 158 Nov 15 03:01 usr& W, i) k7 i3 U, m+ C. e9 d4 }, w
- drwxr-xr-x. 20 root root 262 Nov 15 03:00 var
复制代码 打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root* W' ]1 B9 E H8 Z% k- A- }
- tar zcf /root/rootfs.tar.gz *
复制代码 8 r v; e" T/ S) x. r
查看打包后的文件,确认文件存在,大小一般是在几百 MB . }2 S/ R% x0 c/ o8 v9 p& j" ~
- ll -h /root/rootfs.tar.gz
复制代码 + I; S& l3 y3 U3 Y
至此,Rocky Linux 8 的文件系统基本上就制作完成了。
( S/ i8 ^) H0 |9 I( S6 L* z+ S
0 I( m- p. R, l% N/ E
# z8 b! o% |; Q; |* ^3. 后续卸载挂载点4 r ~7 q$ R0 _4 t* O( L
- cd ~" }$ A }' Q# ] ?
- umount /mnt
复制代码 使用 kpartx 卸载虚拟文件系统
; `* B9 e1 ~8 m! C1 _1 d( Q! w" V2 K) A# P" h: e
使用 losetup 卸载虚拟块设备
7 I7 v, b: ^5 ]+ Z# M" J [4 ~" i% p: ?2 l8 \0 ^) Q; r z
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
2 M" @- V" B/ [. t* o项目地址:https://github.com/yuk7/wsldl
4 w3 M4 ?( Q/ A( r* H- |6 R下载最新版 Release 的 icons.zip 文件
. x \- K# H6 q! D* M解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
3 C9 r! S* z- E9 ~% d9 v1 g
; b5 K3 a' i9 A, n1 y+ l% Q找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。) M+ q; r; O# o& P, y

* }7 |9 H6 K. x( T双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统》
: l$ _% ]0 s0 E+ r其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
9 M8 z1 u2 J: A% p2 z3 |- c+ ?9 p3 S2 p$ H9 L
5. 已制作好的 Linux 发行版下载链接如下:
# r C( @- w. v$ h& y. C: N. NCentOS 7.96 Y- Z" J Q% H0 V* i& W
CentOS 8.4
2 J% N x3 |, Z) W) p2 {Fedora 35( s, g1 |; E! I @! V6 E+ ~. ^
Fedora 36
9 g1 h" k/ \: c+ X0 h2 xAlmaLinux 8
: V; ^" a% Q) ~" G% PAlmaLinux 9
; G7 {1 h' S. \( f- L# w2 uRocky Linux 8.5, S5 o. O: K) B# Q* ]) W0 d: t
Alpine 3.15* J5 _2 w4 Q5 v. h- l l0 P2 V! b
Ubuntu 18.04 b3 V/ X3 r7 X3 R( n# P
Ubuntu 20.04: a J$ M$ E/ \+ E) p$ X; ], d
Ubuntu 22.046 y+ A! t# I+ ~3 x9 l
Debian 10
4 ?( J* z$ Q! _. dDebian 11
5 u/ e/ I- E) ]Amazon Linux 23 S. Z0 K4 A" q* F5 O, A# ?, b
Z9 I' K4 O* [% M" x
|
|