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

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

[复制链接]
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。7 |6 M3 O/ P+ |
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档。
4 D7 k  y% M  Y) @8 sMicrosoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
& Y: e+ M- z8 T- D微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
  Y/ O# L. {  E0 _, X  }8 s" \本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。
/ i2 V- L: P) }" D: G4 D" O' t  Z- ^3 q; D; O* P* M+ q) R
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
7 h9 W9 F  N& a- S1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:( p+ r" d7 G  c& z1 x+ I1 b6 k
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
4 u* f* X+ b" h: \4 L, J8 w3 i, k其他常见发行版的 qcow2 文件下载地址(节选)
6 o& P" ?# a2 M3 F5 J4 OCentOS 7.96 B/ T4 j: P( x
CentOS 8.4
3 m4 W4 r5 Z/ a- g0 rAlmaLinux 8! w1 `2 Z2 e$ Q* e. U2 }9 ?4 d
Fedora 368 }& X9 C- t  E0 T6 i: F
Debian 104 h6 v0 f  P0 i# e. @
Debian 11( L: L5 [" @- G0 Y
Ubuntu 18.04
6 c/ {/ _6 d- |Ubuntu 20.04
5 ?, z% L8 s6 S2 O0 B: o8 f& uAmazon Linux 2
* i0 x# }- Z* p. C( D4 ?6 J2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。1 T% Q. L+ @& b$ ]! u( @
转换 qcow2 文件到 raw 文件
4 H/ E% T: \7 M( ]; I0 T! K
  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>
复制代码
8 v/ d: ]) j0 ]8 a* ~8 x- g
- L; [) [! h8 A& V; d) L$ |
使用 losetup 将 raw 文件虚拟成块设备8 N8 A# a; K4 ?' X: ~& p
  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>
复制代码

3 P$ X9 ]' W4 b0 k" ?- h
; u; P: v; Y- Y7 |: j3 e! [+ {0 H6 v使用 kpartx 挂载虚拟文件系统& S" V5 o0 |$ ?* C
  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>
复制代码

& D' `( }/ }: ]3 S6 E, [, q
$ Z# ?8 i& q% l) p: f使用 fdisk 查看挂载的分区情况
) ]4 u, `% V6 p* d
  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>
复制代码
" U% R0 k- B) M5 i+ @9 L' `$ A
8 }4 M5 s, j- z% x/ ^( [
返回如下信息
1 H7 @6 C: i6 h2 i
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors2 }& e  Y6 Z# ]2 C$ k
  2. Units: sectors of 1 * 512 = 512 bytes2 G6 C- H6 }" A$ \
  3. Sector size (logical/physical): 512 bytes / 512 bytes( d: c/ d; J. z7 Z8 i$ `+ d
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes0 _6 s- |" y$ \, Y
  5. Disklabel type: dos
      ~  b+ u# S9 q, h% p
  6. Disk identifier: 0x2cc9c27e
    . b1 h5 u: K0 Y, k4 R7 u$ ~

  7. / C8 o9 E/ Q6 w' [0 @
  8. Device       Boot Start      End  Sectors  Size Id Type
    / @  H" A2 W( D; A$ N2 Y; ^
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码

, t7 [6 H% Y/ _* _2 \! r- A: c3 I5 G7 e& F# P8 F  R  \- o

; k# `/ H" V6 J; A4 s' T  @4 [此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。6 O, f4 ~; {7 U( \
挂载块设备到本机路径0 E2 C6 u) p  c. \; U: y' C$ B$ `# Q
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
1 x, n- I; f  |) X
1 C4 @" J; b5 S; s

7 @- b) ?( _8 Y# _' G进入挂载点 /mnt,查看文件& j! ~+ g5 c6 A' I, D! Z& L
5 h  B) a  G4 a5 d8 Y2 V
  1. cd /mnt+ S! m' z- U  Y( d0 w; X
  2. ls -la
复制代码
" y$ r; v- ?* v; M

" P! D/ i7 ^6 X1 i9 v; E返回如下信息
  1. total 16
      d; o. k9 T2 b7 Q$ [
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    ; s3 P# @3 s$ Y3 p7 x& _% @$ {
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    7 V7 k) m3 ^: i0 z( l
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
      o0 C6 ?  I' @$ f) {* v* M2 z% Z) q
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot4 l' i, [* r3 Y' K! V; |
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    4 n2 w3 H- g+ a, j4 E) W0 Q
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
    4 R. B0 P* |- j6 s4 G" Y' x
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    , w7 t* F( g- u, Q2 g* e. c5 Q2 M
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib
      F: L! \  M$ b3 i- W
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64+ d5 R& z7 A- w# t
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    9 r/ t: [$ Z: |% {( J. G6 g2 l
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt+ Q& J+ z% ~2 }9 t8 G
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    6 |# ]# l: d4 ^$ I* P7 ~
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
      J" z/ f; h7 t7 @7 k2 @& f
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    ! L% H6 G$ P. g
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    , `$ M, i# D$ x7 G  b- R
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    # E$ l' N" p# A; `/ M0 a1 H: L
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv" M6 O8 c5 d+ I
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys/ h8 `; h% ]9 P7 `
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp, u* u4 X* j7 o- I- n& a5 K
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr
    " W; k: _6 z" j' W* [
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root" B7 l2 ^3 i# g( v6 T5 X" o
  1. tar zcf /root/rootfs.tar.gz *
复制代码
) _/ u3 r- e' s) H! n
查看打包后的文件,确认文件存在,大小一般是在几百 MB
( D/ j7 }2 W2 B4 F4 v% s* f
  1. ll -h /root/rootfs.tar.gz
复制代码
  g. C) `, M$ `" v6 `8 d
至此,Rocky Linux 8 的文件系统基本上就制作完成了。
! H+ ~1 @) I9 [6 d& r  r9 M! P; l' ~& Q, ]  \

5 z- _; t3 |2 C. v7 T5 _  c+ \2 |3. 后续卸载挂载点
( a7 O; i) Z: d9 u) }5 X* u& v
  1. cd ~* F7 ]+ h- {' ]& `& o8 I
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
1 T( z+ E+ H, Q- d
  1. kpartx -d /dev/loop1
复制代码
. n9 |1 A4 M7 ?! ~; r
使用 losetup 卸载虚拟块设备2 Z: T9 \6 x) x5 w, \* D
  1. losetup -d /dev/loop1
复制代码
$ j- o3 ~1 \, T; L0 j
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
" x* D. {3 X/ J项目地址:https://github.com/yuk7/wsldl( u7 _- U1 [# V# {3 e) C! B
下载最新版 Release 的 icons.zip 文件
1 I4 v3 `; y1 L0 l' @解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
* m/ O1 B0 m: _& K9 h: |6 A# t8 D
* x! c" v. t5 b# \找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
# @- ?. F" }, ]2 }  b; G' ?& g! o/ A0 K0 k6 K' ]! S, N
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统》3 }: t" x& l4 t, g9 F2 H
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
: u& t$ r: [5 d( }& G* Q3 W% q; u' f5 s6 I( ~2 k9 T+ Y$ t9 o
5. 已制作好的 Linux 发行版下载链接如下:
& P) S  o/ b0 F, JCentOS 7.9
6 B! M4 C  H; {) D7 KCentOS 8.4
$ e) N; P* E7 o+ t. PFedora 35
6 L; H6 ]6 ?2 H8 h* T" R6 O9 i1 P9 ZFedora 36, c* d  M4 i* ^& L7 J4 x  K
AlmaLinux 8
* J, F6 M( A" F1 HAlmaLinux 9
, @% i4 z/ h+ g- r/ Z+ g0 u3 ZRocky Linux 8.5
; ?7 ]9 c* b, c$ EAlpine 3.15+ u5 z5 }5 V) H$ g3 w
Ubuntu 18.04
$ \& F" J9 c; i0 Y9 bUbuntu 20.04
6 k1 e0 i+ j% nUbuntu 22.04( C3 G$ P7 S  x" K% B
Debian 10
4 S, g1 E- c# _2 M0 g4 x- @Debian 11$ i% J8 B/ v4 z2 f/ ?* b
Amazon Linux 2
4 s5 p2 G, A; S3 _2 s
; x: z1 u  S; T2 K2 K7 u
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-3 04:45 AM , Processed in 0.099839 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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