找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 221|回复: 0

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

[复制链接]

983

主题

83

回帖

5万

积分

管理员

积分
53122
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。; B- u  U( c' k, h
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
1 A+ z7 f; g! \# MMicrosoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
8 B9 T5 D  |8 Q) x" y+ }9 W' ]微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
7 q, a% W! B* _! L1 V. a) G$ g0 e( T本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。6 T- L! o" z6 P& g/ t

  I* W/ [  u2 T- _下面以 Rocky Linux 8 作为示例,介绍具体制作过程。- Y% p+ s4 z; x7 Z+ i5 w) x3 F
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:% I# j$ H0 ]4 j  \
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow25 G5 o8 q0 D/ d+ o
其他常见发行版的 qcow2 文件下载地址(节选)
& {5 v* ^6 D  e# r8 \5 sCentOS 7.9
3 U6 k. G* L4 MCentOS 8.4
9 {8 m: G/ b# ]: M9 V) V! dAlmaLinux 8
( J( w; L8 w7 _2 `" l+ Y7 T0 q* _+ zFedora 362 \- k. P+ g5 R: \$ m
Debian 10
7 H/ G3 s4 J" \6 H: z( QDebian 11
% M6 |# r- g, o! ?Ubuntu 18.044 ^2 w/ k6 S8 q' e- W0 U. y( {
Ubuntu 20.04
) T" V8 l! Q! d9 k4 a$ I' j! A8 HAmazon Linux 2) n* k! e  N; C3 S& S8 N2 |
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
- u5 e5 Y; [; T  d5 I$ K2 P转换 qcow2 文件到 raw 文件
  w# e. d8 B& g$ L  ^& \4 w
  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>
复制代码
$ R. f* n- ]* C! U6 E

8 y2 N" b4 M/ I使用 losetup 将 raw 文件虚拟成块设备
/ p# t% d* ~- j6 m9 \+ G% n! u; h3 [
  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>
复制代码

+ v1 X( p9 r( _
: k, {& G/ Y$ W, }% ^+ p6 T! a使用 kpartx 挂载虚拟文件系统3 m; V1 Q, T' I5 ~* s/ ]. `* G6 O8 [
  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>
复制代码
0 @4 n/ Y; Y9 X  e8 Q/ s
& y$ [7 ~* b* ?& @: x4 X
使用 fdisk 查看挂载的分区情况2 e$ a, P* a6 l, @% N4 l) i
  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 F4 G2 O) O- c7 m9 P' q+ Q
0 @% H" ~5 r" p# V1 s) a
返回如下信息+ Q  g5 A1 a7 j2 W0 y; g; Y: |
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
    & I( f( _6 `* S  n2 E# c) J5 s
  2. Units: sectors of 1 * 512 = 512 bytes) k8 X3 u! O6 \( C( p
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    0 T2 ~$ k% a/ Q6 W/ s% m
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes9 u- ~/ A! @$ I; Z5 l' f9 s8 v
  5. Disklabel type: dos
    & |$ I7 k3 c3 d' r5 }& i
  6. Disk identifier: 0x2cc9c27e
    9 i* Z5 g8 }* F: g$ C% Q

  7. , z1 Y1 E4 u4 E% M
  8. Device       Boot Start      End  Sectors  Size Id Type
    5 K+ J- o/ ?0 H& m( y2 q3 S
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
4 V& D0 b5 D, O# X0 ?# ^$ \* c
" ^# E& Q/ G! q; S" i: s6 m
2 S: C( x! Y; l8 [* n/ K1 Y
此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
1 K7 h% J  A$ W/ Q8 V挂载块设备到本机路径) t( f& q+ B5 q4 C# z
  1. mount /dev/mapper/loop1p1 /mnt
复制代码

6 i6 v& Y' x  f/ b7 q
( K+ o* ?% w  [
' n; _, U7 Q$ k# |! k+ R# e进入挂载点 /mnt,查看文件
% J  [# T/ h. A9 r* e8 I& U. @+ N* |: t6 L9 g
  1. cd /mnt
    8 P2 N8 ^, d+ z$ F
  2. ls -la
复制代码

+ [0 W% D6 l! k  k% h% M+ {9 j! l. ?0 h/ I7 Q8 L
返回如下信息
  1. total 16% a. [  M+ g! V
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    8 n/ L: h& q) P/ j( Z
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    : w; b+ D  y( p. y  m2 {; f; u, K
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin+ ]+ Z$ U) b- z( U2 J
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    - P3 x2 b3 K. W* P. T7 m
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    $ I7 h' Q0 G1 d' U! p
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc. i! e+ n8 J9 L+ @0 }% i0 `4 z/ q7 s! h
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home+ p( I  l5 Z3 l+ V$ M5 J9 \/ m$ T% C
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib
    , v2 w' h4 ~2 E" S- v4 c  p( R
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    . C1 I/ i# _+ o0 K! ^# d8 z% ?
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    ! w9 K# t3 a, I: P3 P
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    # h0 A+ _& R$ l9 h1 U. z
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt! T: {/ t- n0 U8 A
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc! \* j( l" w3 c5 E6 ?8 j+ n! e
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root3 d: B7 u- a% T# l4 Z/ M; N
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    , W# r# n6 f) a) ?0 z) _6 Q
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin+ W3 T$ H$ I% a7 M, I6 G
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    # A7 u2 k6 {8 K* j  M/ ^% h/ Y5 r
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    4 C8 J5 U- S5 i9 X6 b# F' N1 O
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
      _4 M, _' E) `6 H7 C
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr' c5 {/ I& `* h% U
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
. J# Q" i) `2 }7 A& W
  1. tar zcf /root/rootfs.tar.gz *
复制代码
) I' \4 I: ?" k6 e& S: t3 ~
查看打包后的文件,确认文件存在,大小一般是在几百 MB

' D9 @5 x0 @- G  T# Z* D; Y: e
  1. ll -h /root/rootfs.tar.gz
复制代码

3 V& y0 G* Z. j3 B7 t6 g至此,Rocky Linux 8 的文件系统基本上就制作完成了。
# ]3 v: E% s% [% r; p* i) [- w7 ?, C
& ~% N. M* U7 l' U3 d& }' S

2 z5 [8 c- q9 p0 [: W1 J2 Y3. 后续卸载挂载点
% C: B. ^3 _( y/ i+ S3 i( p! u
  1. cd ~0 q2 E' b. i7 s3 h" |
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
" O3 j2 p  q4 @  X( ]% ~! e6 A
  1. kpartx -d /dev/loop1
复制代码

, O; [5 C; j3 T5 [* ]; H1 v+ i使用 losetup 卸载虚拟块设备1 H. o$ i. |; {& t0 _9 c2 X* ~  ~2 i( R
  1. losetup -d /dev/loop1
复制代码
6 I# l& }' G( \& d
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
- I  B) a  v6 o( j9 Z项目地址:https://github.com/yuk7/wsldl4 C& g! Q5 E) ?1 ~
下载最新版 Release 的 icons.zip 文件0 k9 w, T# g9 Z7 V4 s4 `$ r
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:: x' l  s6 I6 `. P1 a
$ v3 t7 A5 P$ `3 _: D3 V7 H( ]
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
6 j) h* g: l1 D0 ^. L& t, q
" j4 _. k6 u8 R双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统" E) @- x6 ~7 m, w
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。7 ~1 V# R5 I, Z$ ]& @

: ~+ a% U, p" f
5. 已制作好的 Linux 发行版下载链接如下:
% `( u$ a2 f* gCentOS 7.92 A+ K4 a1 w6 z
CentOS 8.4
1 \6 ^' L7 Z" o7 x7 o. {Fedora 35
! H9 h& s: K2 F, ?3 O1 Y* p% LFedora 36! \! i' ^" s5 n  I6 Y
AlmaLinux 8
8 I3 S& }4 E" |' l* |: l/ KAlmaLinux 9: ^1 ?, l* w. d, j* [: o0 |$ T9 J
Rocky Linux 8.5
- E3 c7 e/ F) l; e: j# K4 F) V% oAlpine 3.15
5 ?/ a& ~8 q* {( l9 g+ OUbuntu 18.04# y8 x. ~- M' D! D
Ubuntu 20.04
3 \  T8 z2 l1 B0 P# |7 ?Ubuntu 22.04. b8 v- J4 m+ E& p
Debian 103 k+ {4 D; }* J8 W$ O  _
Debian 11
3 G6 O( u: N) o  {# |4 }Amazon Linux 25 C7 v  b- `' f: i' W9 g% O

5 w, t. `5 e5 O4 o9 V% y
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|返回首页

GMT+8, 2024-12-23 21:10 , Processed in 0.061258 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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