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

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

[复制链接]

986

主题

92

回帖

5万

积分

管理员

积分
55255
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。# U. i/ i/ G/ L$ H( G
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档5 F5 T. ^* T% T$ C3 E( U& s
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
% t3 u* d0 [4 K# ]; i微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。) _5 a; |; {/ W  P% N, u
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。- B/ s; Q0 k/ j7 {9 S7 d  q% |

$ x: [$ q2 u9 I$ k1 t( a下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
# W, L  p' Y' {" n- E1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
+ U  G7 x/ N$ S. [https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
5 b+ q  c5 p. m' P$ v# m, \其他常见发行版的 qcow2 文件下载地址(节选)
7 ~5 t4 V; U- W& bCentOS 7.9& z) x0 x( r0 E: e6 A
CentOS 8.4
: h% l6 [; b' _! l- [! H2 X0 AAlmaLinux 8
3 Z) U3 K, d7 cFedora 36+ @, g: [! h/ N! X, ?
Debian 102 o1 D% E2 @' O* `0 J
Debian 11
% h' [* W7 _/ ^  d; W: gUbuntu 18.04
* o. Y- }+ ]9 U) L% u; Q$ YUbuntu 20.04
+ }% V! W$ K! x: GAmazon Linux 2
+ D# \& ]1 k3 @5 p2 l2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
; w& I0 Z6 h( z/ u% L- [- L- B转换 qcow2 文件到 raw 文件
; H3 Y+ Z( z+ b" B3 l
  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>
复制代码

/ e1 L8 b2 D' F
! `8 [- a# s# y+ c使用 losetup 将 raw 文件虚拟成块设备  |8 D4 W2 m9 ?$ [% y  H0 ^3 s: n
  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>
复制代码
0 ~) y1 p7 @) y: i5 v
# k3 ~6 P9 }4 x5 b; V" K
使用 kpartx 挂载虚拟文件系统
3 t" P6 O+ {) }- ?
  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>
复制代码
; S. ^" x/ _* C6 G6 i

1 h( X7 t' g* K9 A2 k使用 fdisk 查看挂载的分区情况
' @  O+ [; N5 C0 u/ g. g( n
  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>
复制代码
+ E" W0 M$ T: F8 X

9 L7 ~& K/ t# f( C返回如下信息$ _* [! }6 d( p. q
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors; K# Z* T; l' j, u) o" ?  h
  2. Units: sectors of 1 * 512 = 512 bytes
    8 F( N' p; e1 x- @2 J; I0 j
  3. Sector size (logical/physical): 512 bytes / 512 bytes' @6 x( [5 G$ O2 Y: m% z' O* @
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    8 S; V  Y4 k! ^1 N$ |
  5. Disklabel type: dos
    ; v, }1 @& K/ K
  6. Disk identifier: 0x2cc9c27e2 e" w7 j' ]1 I9 q* L6 p5 G

  7. 6 E% |. i7 L0 x  D8 k) V. z
  8. Device       Boot Start      End  Sectors  Size Id Type
    , b0 d* z- m9 x6 A- J: Z5 _
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码

+ ]8 `3 f6 \, A. m* w8 g
6 w1 ?% M1 W. p( c( W5 {4 J7 @
0 i5 L9 B1 \( _& M+ S- }- w- V此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
# t$ b5 ^4 W# R) Y挂载块设备到本机路径
/ P! x, b3 L) r! t. T
  1. mount /dev/mapper/loop1p1 /mnt
复制代码

! [# e  v. q, C1 e- O9 k- E' a) @( P& u- N9 l/ ?; D
; p( G. e, v; q7 ?
进入挂载点 /mnt,查看文件( m" X  e! R+ T/ |1 A4 j
* Y: b7 Z  f5 Q9 m& ^6 ]6 b
  1. cd /mnt
    5 j2 T% f/ g; f6 M; C. D! b
  2. ls -la
复制代码
' b1 w* P' C0 J% a4 q. c+ R

5 C/ O; g5 b1 \% Q0 p- G, D返回如下信息
  1. total 16
    % W- N# S& b0 Z/ z3 o% _0 Y
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    2 [! n: r  Y3 @2 |2 y
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..: l$ U8 `( H- J" D
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    # k; x! F8 x! V, p+ w; q/ t
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot( u$ y0 {2 {1 y) I9 \! o: V6 v
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    : W6 Y& o* f( w- y: z4 f' w# h) o
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
    6 H& e- n8 P3 i# @4 g" Y, Q
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    3 M1 d$ B/ U5 f7 ]
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib/ j0 M) M. ~! ?, @7 P
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib649 S7 I5 |. D) d+ T2 i; `, ~
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
      I1 y& ]  y3 t
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    6 @5 N6 x; V1 [" M
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt6 S2 M: V' d) `) p; H8 _: o  r$ N
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc3 B% `/ H7 \2 r! P2 W5 M( o+ N
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    ) R  c9 E2 ^  f: j! {  ^. X# I) m
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run& ?  P1 n0 J/ r, g( {
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin+ s3 x6 t* p2 @
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv4 Z# D) ^, a4 j
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys8 a9 t' g$ s. V9 H  ?: l
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
    + P, M/ t; U1 ]. d' `$ Q
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr4 U" I8 @0 Y1 f5 B
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
1 b) W; [. v4 K5 ^8 C
  1. tar zcf /root/rootfs.tar.gz *
复制代码
# t1 f/ I- y* S# G6 l. }
查看打包后的文件,确认文件存在,大小一般是在几百 MB
# N, d: R$ x5 c- \0 f5 J
  1. ll -h /root/rootfs.tar.gz
复制代码

" x' R8 u4 s5 y, i5 H9 b至此,Rocky Linux 8 的文件系统基本上就制作完成了。( p' A1 {+ a$ n1 |( Q) S- d
( e9 r. z7 u  ]! \* N& E1 ]6 R+ Z
& `2 o# ~$ \" }: B
3. 后续卸载挂载点
6 y: ~0 ~8 T0 }# c5 F% \
  1. cd ~
    1 Z! T5 |/ h$ d- G
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统" ?* {2 e8 G; J/ G' @) Y* \
  1. kpartx -d /dev/loop1
复制代码
9 Y4 [1 ]1 P4 \) M* _' r
使用 losetup 卸载虚拟块设备5 t% T9 P# g3 F$ A2 H: H; Y2 R$ J! t
  1. losetup -d /dev/loop1
复制代码

- F/ f3 H8 I& P* a. n4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
4 O5 A3 w  k& L( l项目地址:https://github.com/yuk7/wsldl
! C( a, Z) a; v下载最新版 Release 的 icons.zip 文件) `& G$ q& y; B& {$ f6 g5 G
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
, G0 Q# w8 z% a& X0 D! z6 g* Q: F4 Y: a8 k7 n; z
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
# r: H& Y7 H, K  ^# W( ]7 \9 H" @" |2 W1 B! n0 j8 {- U
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
, U+ c) @8 d( d7 S" [. d; R9 x其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
. j% H# \' I* \* N. B: K6 g+ ^9 ^0 Z: R! T: [3 M. V/ a( B
5. 已制作好的 Linux 发行版下载链接如下:/ J7 f1 e7 o& o8 h( k
CentOS 7.99 \; \1 m9 M1 V% y# ?
CentOS 8.43 `) v4 W" l; J5 Q' I; v
Fedora 35
) n( c3 D+ }8 x. s  ^) Z0 iFedora 36
+ u; `8 M6 D& X$ uAlmaLinux 8
1 ]. F* X  r7 FAlmaLinux 98 F3 m$ w* D' V; Q0 d* P8 g; m
Rocky Linux 8.5! M* ?8 X# I3 n  v  h/ h
Alpine 3.152 j0 l0 @! h- ~9 _9 I5 N
Ubuntu 18.043 @5 ]9 W( c/ y0 v) S- S4 b
Ubuntu 20.04
' j% P2 p5 \7 e3 K( bUbuntu 22.04
* ^7 k0 u. {" N# m1 N- N% NDebian 10) m: ~: b9 p. j' u* Y
Debian 115 P- C1 J( o1 Z$ d: ?- S
Amazon Linux 2
( P- a( W. s3 g* x9 J$ O
1 v* R% H/ n6 R' r( o
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-3-22 01:07 AM , Processed in 0.102562 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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