找回密码
 立即注册
搜索
查看: 315|回复: 0

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

[复制链接]

986

主题

92

回帖

5万

积分

管理员

积分
55255
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
9 ~0 l5 l) H$ A9 p8 U# x如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档% K* \* F3 i3 I& m* w0 f1 f: u
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。8 W3 h1 q/ m9 h, u6 ^" F
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
1 m# Q: \# Y( G, L5 G% U2 v本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。4 m* i4 X% H1 p0 R  _+ Q2 e( O0 S
2 I- {  T! {: a" `; I! e
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。+ g6 F0 B. H+ }* q0 p" [* o% ^
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:2 E3 ~8 a4 b( v4 r
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
; Z2 {, M# ~; `0 s其他常见发行版的 qcow2 文件下载地址(节选)
1 `8 y5 H0 {- f: G6 B$ MCentOS 7.9
( I+ H2 ~, t1 X7 W0 t- l, o- S' u4 MCentOS 8.4) v' g# S+ u) y9 C9 I$ j. n
AlmaLinux 80 e1 ~" t6 @$ \% Z0 ?2 R
Fedora 36
% `  x' L+ c" U1 d- ]& N3 DDebian 10
& G0 e2 M) N* a1 i# j8 \) m+ wDebian 11: b" r+ D+ K% @; T
Ubuntu 18.04
  h' K0 L6 I7 x7 d5 `1 T& ~/ e4 UUbuntu 20.04
9 k+ y; u& _) b; B' s. qAmazon Linux 2
  S" T. Q) M6 _* {" e1 V2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
9 w1 i9 Y5 V. c8 K转换 qcow2 文件到 raw 文件
8 I+ b2 `0 H1 d& H4 Q% B
  1. <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>
复制代码

) x& L- H; P; k  U) y' Y
: z7 E  [! _7 k3 B2 R5 `使用 losetup 将 raw 文件虚拟成块设备
8 v. w3 K! x  E  F" b; K$ g* g
  1. <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>
复制代码

9 k9 U" P6 m7 `9 E/ m( V* X. n# c9 R* R( v1 r& S7 D
使用 kpartx 挂载虚拟文件系统# Z4 ?: C6 b$ H
  1. <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>
复制代码

; f$ s7 ]# H5 W! c* Q. Q* F6 L+ q/ D' R$ R' K9 ]
使用 fdisk 查看挂载的分区情况
$ M, y+ K9 M, z
  1. <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>
复制代码

9 w0 E6 ^/ Q$ V9 H( {; |6 w5 \# F! c, S  o0 P
返回如下信息+ R4 X/ E" c) ^. S2 f
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
    ' Q9 T$ w+ R# |# `
  2. Units: sectors of 1 * 512 = 512 bytes
    ) s1 k  V  y: V6 h' M
  3. Sector size (logical/physical): 512 bytes / 512 bytes( L0 |" q* u5 [) H# D3 F
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    % T8 `% Q- o: O) |1 |: c
  5. Disklabel type: dos
    - b# h* C; R2 w
  6. Disk identifier: 0x2cc9c27e9 V. d6 ?+ Y/ {* j, X# I5 d: Q
  7. . Z* @; x- M- @' R
  8. Device       Boot Start      End  Sectors  Size Id Type4 T% x" ?1 O& T* u7 A
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
) J  }' E0 a! S5 Y) T6 ^* `  q

8 L# O6 }4 p6 t: v9 f+ @8 P8 k2 W  S1 O: T: p, s1 r, _
此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。, X% v  H( b3 _' U  R8 Y" [2 |
挂载块设备到本机路径' ~; P" I0 e9 ^9 x7 w
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
- Y- z( M, n( C0 S5 s" j
  l$ x; J+ G( Z

6 I- m0 O1 ^/ z; x5 H+ Y2 t进入挂载点 /mnt,查看文件4 L7 s" Q& ~0 ?0 k$ p$ o

* l* {- q6 }6 n9 B" g
  1. cd /mnt
    " o* O9 e7 o" y4 W! f1 Z* v
  2. ls -la
复制代码

8 ^0 J* ~- e6 A" t% {% t* R! Y% y
$ k+ E3 E! q/ F2 ?5 n( Q/ H" D: }返回如下信息
  1. total 162 J0 e  r# D0 h/ \1 ]8 [
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .8 u- ]+ m! O2 e7 @; B: F3 D
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    ' o) k" c* N4 ?' B4 C/ u
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    ' P# K* u' g/ l9 W+ f
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    0 o& O, {0 k* [* e7 G6 S5 n1 [
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    2 O$ h+ F7 U* B9 `3 J2 C
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc: U! u# I6 b6 s! }
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    8 N2 h2 X4 |# b' e" W% b( q5 L0 H' t
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib# l" |9 C5 \. G: Y% w( d& R
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64! s/ L/ H: P7 a) g
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    * x( a4 t& t# @2 n% o
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    ; Y) O4 m/ _  k+ l6 N3 N
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    ; r  }6 ]  l9 |" T. e
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc6 H/ f& [. k7 x) q, _/ _5 J' @
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root5 K8 C& E* ?8 Y* b# I* g
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    6 M& N, s% q) o+ s/ n! Q; \' V+ u
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    % K/ [: @0 S) }2 \6 N  A0 z  ?
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    - I9 G! p" x9 f$ T
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    & I  G1 u. T. x3 J% B
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp) S  c7 L, E" o: D7 P
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr( x6 T$ ~% a' R' u5 n3 \
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root; r2 h( d- \; B( L. p
  1. tar zcf /root/rootfs.tar.gz *
复制代码

& u5 r+ w$ I, ?5 Q! `$ R查看打包后的文件,确认文件存在,大小一般是在几百 MB

2 {4 o9 J8 |1 R7 K4 S
  1. ll -h /root/rootfs.tar.gz
复制代码
" \! w2 q$ T& U  R
至此,Rocky Linux 8 的文件系统基本上就制作完成了。% E& P5 {& W, v# b+ G

- d% j/ T- F$ }1 r

8 Q- o& X: v( t1 \3. 后续卸载挂载点
& ]" t' `- ]6 M8 z% Q, u
  1. cd ~! z. [/ V( F: J) G% v1 Z( \# _
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
2 n( C% N$ v0 x( h. ^. r
  1. kpartx -d /dev/loop1
复制代码

% \6 g1 v" u" s* P$ G使用 losetup 卸载虚拟块设备% W: x$ L6 z7 Z: o, }3 {
  1. losetup -d /dev/loop1
复制代码

) h4 K9 x6 J0 X; j  @7 H1 z" |4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
' L  z+ C  Y$ G' O7 i9 Q项目地址:https://github.com/yuk7/wsldl" a8 ]4 G" D: ]2 r& F/ v. e# C* j9 ?
下载最新版 Release 的 icons.zip 文件* J. A1 \2 e+ N. g9 }
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:1 G2 `5 m7 b! h% u% S! r
2 C  d; g) L- {1 I0 G
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
8 V4 }/ c7 Z8 K" S; a$ R" Q& Y
9 c9 U1 u1 J$ C$ ?. M" R8 y! G双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统; `  G' L: G; |4 s/ U
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
7 N+ z) T5 q; x4 i4 d' C& z" {( I) y0 e# `& t$ X2 A
5. 已制作好的 Linux 发行版下载链接如下:% ?8 B2 n7 v' ?2 g; o# _
CentOS 7.9
0 {2 O% `  E" t9 d: }4 j7 l6 Z& ECentOS 8.40 O3 P4 W% d$ P0 p6 I8 g
Fedora 35+ p1 V4 E! ~- R- T
Fedora 36
' V. D* J$ ~9 s* n* \AlmaLinux 8( A3 s/ g$ v; y$ ~+ i
AlmaLinux 9
" m1 w4 F$ z6 p: R( C3 q5 SRocky Linux 8.5
1 `  c' Y3 ~8 b# D% zAlpine 3.158 r/ Z! Z' ]1 l5 J5 R0 O9 l- v
Ubuntu 18.04
( X% M- n3 p5 hUbuntu 20.04: `! b3 g2 X# A
Ubuntu 22.04
5 F4 x& z* T+ J- T( VDebian 104 G: U  ~# p+ E) |( R& w
Debian 116 Y: w+ h- m3 ~) z+ X  W; R3 f( }
Amazon Linux 2
, e2 T) Z% ^6 S: L1 E" O; o
! O) @: V2 m6 y. d5 r
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-3-21 11:54 PM , Processed in 0.082847 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表