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

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

[复制链接]

985

主题

92

回帖

5万

积分

管理员

积分
53561
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
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
  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>
复制代码
9 }1 D: W# X. N5 Y

( ~! t3 p& F/ P( M使用 losetup 将 raw 文件虚拟成块设备8 Z* \& i  Z4 p2 X' A
  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>
复制代码

- x5 ^3 n- L) F2 K6 y( s8 h% o: W5 x7 |6 x  N0 K
使用 kpartx 挂载虚拟文件系统
) ^: h2 h  E- @& Q8 W: s
  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>
复制代码

+ p' g9 [( S: U1 E, v3 e/ F" x* [+ D  @* i6 o9 j/ J
使用 fdisk 查看挂载的分区情况
! [' Z1 y" T; C- c+ L: {- j
  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>
复制代码
0 O- e  l6 N$ [- K8 Q& u

8 V( w+ [" Q( T6 h# c" V$ {返回如下信息7 r- G' T  F0 W1 _
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors2 p- ^$ F, P. ]' q' `
  2. Units: sectors of 1 * 512 = 512 bytes  S; V9 ?* r5 K$ B! u
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    ( N$ m4 i9 M7 {' w
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    ' D& C5 ~: }) x
  5. Disklabel type: dos8 {, A# l- u' r3 \% q5 |; l8 e
  6. Disk identifier: 0x2cc9c27e
    " s3 h: ~, \6 R+ f- i& Y( c
  7. 3 V3 H+ N& Y4 L5 A
  8. Device       Boot Start      End  Sectors  Size Id Type
    ) Z- Z( v$ @9 y9 H1 z& C! h
  9. /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/ _! ^
  1. 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
  1. cd /mnt! n- p/ U  p6 D) B, N# I0 B* ~
  2. ls -la
复制代码
2 r% E6 V8 B& y3 f) x
- y  R# Z- B; h* P: ~  x3 o
返回如下信息
  1. total 16
    + Z' k# G( |/ l. s
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    : u$ z/ l$ T3 s; K: R7 g" v. {
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    # M# b" D/ p- I+ Q4 I# K4 v: `
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    ! o: g/ ?1 P" Z  N
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
      d4 @0 `0 ]: D" D5 H1 k
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    / X; [$ I. k5 E; T& B% A
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
    + `: O8 G( ^! D6 X: N
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    1 [# s6 C% ]/ j# h4 R* ~0 [
  9. 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
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64) v0 F2 O; H/ z, m% v. v+ j) R
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media7 N7 ^% |* X8 a$ }3 O+ @& @
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt( u3 ]& x" _7 c5 ^! {5 w; c
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt+ X0 l' _* g7 p
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
    ! X) q# v. `) d1 e. r& s9 N5 C
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root/ r5 M1 C0 M. j  o
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    / |8 |; p, Z9 w& i! t0 u
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin* e# p0 n& E" M8 o( l6 B. y
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    - f7 ^4 Q: y. i9 l) w
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    / Z6 s! y! n3 b
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp  n; I# P2 N( \- ?
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr
    ; |! h2 z* s& y2 _
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root0 A3 }. I0 u# f9 d$ L  Q
  1. tar zcf /root/rootfs.tar.gz *
复制代码
# d4 {3 \. P3 H8 v
查看打包后的文件,确认文件存在,大小一般是在几百 MB
* a( o1 d8 r4 @# m
  1. 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 |
  1. cd ~- }& T* K+ R+ m7 i1 B6 v/ F
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统) q" v% ~" g2 J7 N6 A5 k1 {
  1. kpartx -d /dev/loop1
复制代码
. L, t, ?4 t1 v2 K
使用 losetup 卸载虚拟块设备. [& X  J" N3 \' _" g! U) m
  1. losetup -d /dev/loop1
复制代码
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; h7 [- ^! 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-11-5 05:59 AM , Processed in 0.104535 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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