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

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

[复制链接]

979

主题

90

回帖

5万

积分

管理员

积分
53052
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
' n6 a2 i2 Y* q如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档1 p* l( D8 B. s
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
! N% ?" W; S  D2 }微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
2 y- p, @4 {; a4 r! k本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。
3 r' v' u. |, A- M
: a6 D- ]7 ?. @" C下面以 Rocky Linux 8 作为示例,介绍具体制作过程。2 _6 }1 p. Z" c1 c3 Z  K- C9 J
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
4 _. q6 Y) F) s$ Ghttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2! x+ K+ k* P! }
其他常见发行版的 qcow2 文件下载地址(节选). s+ D+ Y, l/ C
CentOS 7.9
+ ~5 x+ w; K! v$ \4 lCentOS 8.44 }, ?# ?7 T$ W% y
AlmaLinux 8. V" l- l/ H0 r. j/ ^
Fedora 36
! M/ D- r4 f- m7 P. e  ADebian 10
* g& d( W/ F* e/ p+ tDebian 11/ u( d$ x$ ^* _
Ubuntu 18.04( s0 h' w  m/ e3 z9 p: `3 Y
Ubuntu 20.040 W1 O* u3 {) `
Amazon Linux 2
2 `4 r4 g! d# B+ {2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。9 `" }% o3 L, f5 H/ Y% r8 v6 j4 C
转换 qcow2 文件到 raw 文件& I3 u  s5 t7 t" V$ O7 ~
  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>
复制代码

) s1 Z* m3 H" c4 M, O; k) p1 o2 h" h) I& Q, w; }
使用 losetup 将 raw 文件虚拟成块设备- |& P4 Q1 h/ X/ L! @
  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>
复制代码

% p% \  v$ u( P) T% w
1 v2 R/ Z" o1 j  p" n! {使用 kpartx 挂载虚拟文件系统( |8 A" K$ ?0 T, l: a: I) `
  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>
复制代码

: J3 R0 s" }: k
/ z8 R# |, R3 e' v* L. i使用 fdisk 查看挂载的分区情况
! h- \3 q7 q, ~1 \5 b
  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>
复制代码
* b7 i$ G2 ~: b; b( \1 F: Q8 I

  Y0 `' f; a, h8 }返回如下信息+ y: s9 ~9 N0 {2 a) b
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
    - i/ ?: {  ^+ g, U0 W
  2. Units: sectors of 1 * 512 = 512 bytes
    ' Z, r; v# _* ?4 o; X( \
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    6 g* C* X% _' a9 Z0 R$ e
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes8 k  e2 ?. Z5 Z, Q* U$ P( B$ y. e
  5. Disklabel type: dos5 G0 @3 a* T1 ]+ j/ d4 k
  6. Disk identifier: 0x2cc9c27e  G7 F: n0 O5 w$ K2 r% x  q
  7. # m% l- ^0 t: T& N
  8. Device       Boot Start      End  Sectors  Size Id Type
    $ I, c! Z" Z( L. N9 `+ c, i
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
- U6 L' ?! Z  R- F
% ]4 D: `) o: }# w

' x& K" I7 o* x- H9 y此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。- [; I4 |. K( k4 ]- j
挂载块设备到本机路径
7 n6 L: a% M9 Y" C1 G) b8 Z/ f- I; A
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
$ q& t1 n5 A! L; I& E& k& I
; T+ O6 l: f' T. R( J
; b# w* m9 @. o! z; }) _
进入挂载点 /mnt,查看文件- s+ t5 M  a( b! \, t! H: s
+ A' g6 ?, X" G# W- U
  1. cd /mnt
    / M8 P  H% ~/ @* p2 M+ l. D2 n
  2. ls -la
复制代码
7 b% @6 J- B4 O0 f: l4 `6 C

: q/ z- w% g3 m+ e" P- M返回如下信息
  1. total 169 Z( L" |6 ^. i8 z% ~! e
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    ! ^: @& y3 b4 v
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 .., u' G( ]: [/ \! J
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    1 H( V) w/ n) g! `3 a( g, E
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    " d( x: ^9 U" q$ C3 X3 l
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    8 _+ R$ S" `& h+ k( Y  [% v
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc6 k4 J+ `" U" Z7 x& q# W
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home$ W) T& ?5 g. o. h) n9 Z+ E. j- v
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib
    8 e! f! |3 ^2 H5 s& n5 j  R  [
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64- j# \/ i4 R+ p4 ]! n0 W
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media2 ?& N: w0 @% i8 n- x
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt& c  e. ?" t8 `  Z* d+ M% U
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    # D6 z" z- y, b: [9 \
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc$ X* Y4 ~3 o" M. w$ B
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root- U$ A% s9 i2 Q) N  v# S) ^
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    ; S4 O, r' Y7 q" @6 V2 p
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    ( x$ J* i, L2 a( E+ n
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv0 v# K: Q' x# I3 D1 U' Y6 |* k
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    # P! D2 Z4 i. g# D$ R& I; K
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
    ; h# K7 K" H1 n) |( z5 {
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr1 ^8 d' Y. T( x+ R& ?+ A" d  R
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
! M1 h/ U- `: O* v! ]
  1. tar zcf /root/rootfs.tar.gz *
复制代码

8 `1 u6 F: q; h- U2 n查看打包后的文件,确认文件存在,大小一般是在几百 MB
) m2 R7 _# I" _( s! {; K
  1. ll -h /root/rootfs.tar.gz
复制代码

' Q, T) e$ O8 [6 g2 A4 E: W至此,Rocky Linux 8 的文件系统基本上就制作完成了。6 y- T& O4 X! y2 z
! I  W3 r& C; O/ `4 P

8 k. A- l4 A, l3 F  w( p3. 后续卸载挂载点
8 R0 d, A4 |; `" M
  1. cd ~
    ' m1 F9 D5 h$ z- d- N
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
; X2 X0 O4 |5 n5 N6 x  k/ G
  1. kpartx -d /dev/loop1
复制代码
# l9 _- z  W/ f' D% t
使用 losetup 卸载虚拟块设备
3 M0 G& |4 J+ N' N7 i% P& b! @
  1. losetup -d /dev/loop1
复制代码

7 `6 U: T- W  _) r4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
$ H% c6 H  t- Q) h项目地址:https://github.com/yuk7/wsldl
: s! v' U6 k2 o1 Q  \下载最新版 Release 的 icons.zip 文件
6 ^  U& y- G  W% q解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
5 ]( r" n; f7 H2 j; h* ^
4 J1 h# F1 c+ V+ D$ N& m! @1 x找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
6 B1 w: w, [! S: ^( w- d, K# n. {/ f) |# Z
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统8 P( d; b/ A7 F8 V
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。  ]) K& ]& C% H4 L9 _. E

7 i9 Z1 b( {" Z% Q7 q8 ?
5. 已制作好的 Linux 发行版下载链接如下:* S' _% }' \# \4 N
CentOS 7.9
& E. z- Y2 [* a' kCentOS 8.4* h/ O; n( J2 g1 `0 H0 b. u
Fedora 35
$ z3 n6 V8 o4 {& Y4 UFedora 36( W" F0 T, D: y0 e* _6 x- p5 z
AlmaLinux 8
8 @$ M/ {/ S) }# h& E/ e- x% b. @AlmaLinux 9
5 c. @. e3 ]  |0 a$ VRocky Linux 8.5. ?8 \( B7 [$ y- E* j# B* d
Alpine 3.15
1 u' u* q$ P. kUbuntu 18.04" o" F% p8 m1 E$ G7 H% a- m
Ubuntu 20.04; W& ?: R& [; D
Ubuntu 22.04# t, z7 t- |( @1 @7 b+ j4 O
Debian 109 N0 o  v3 g* v$ i% r# t/ }
Debian 11" F* n8 w( z3 g
Amazon Linux 2. S) @) j+ Q9 s
5 Y/ ^. e% h7 J; p
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-2-25 07:44 , Processed in 0.102941 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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