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

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

[复制链接]

989

主题

92

回帖

5万

积分

管理员

积分
55362
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
/ j: L9 @1 E6 H如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
. m6 z! @' ~5 v; }Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。* Z  V1 m! |) s
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。2 a8 Z. [  h5 t* |+ R- {* w
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。
$ {- n/ K- Z4 L2 c1 h% @2 j* K) s
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。: T4 _+ h) r% ]* c
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
( [; I/ ^* A& Z: F' t( `5 Ehttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
/ W# d4 w+ V$ C" _其他常见发行版的 qcow2 文件下载地址(节选)
7 r( Z7 M, |3 N$ W7 UCentOS 7.9" P% |# a$ z! H4 n! L/ U8 Z" P
CentOS 8.4
' d( J( f! Q0 H, J) b: GAlmaLinux 8
# d3 k5 B' V3 g! A) w9 HFedora 36( U" V8 }2 f& h! \
Debian 10/ f# y2 t( d' e/ S1 z. r
Debian 11
0 l8 e$ Z7 U1 x$ eUbuntu 18.047 O4 @: e! R+ V
Ubuntu 20.04  G+ F8 G. m4 A
Amazon Linux 2/ D9 b+ @* Z; H% w
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
6 l/ i' E  X8 ~转换 qcow2 文件到 raw 文件2 R9 o4 P8 H  S* E& O6 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>
复制代码

5 E* B5 p0 t: G! U2 \) p4 c6 J5 w$ Z) X/ I
使用 losetup 将 raw 文件虚拟成块设备
* I& Q( X/ `* K# z9 _
  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>
复制代码

1 @  F9 x0 p: @7 T* X
" C' r& ?7 X: {& J. P' F使用 kpartx 挂载虚拟文件系统- o/ ?! i5 K* t, Y0 e% 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>
复制代码

2 q0 e$ v' s% ~! p, P$ s1 i4 h2 K, d6 X( i9 W; D% T
使用 fdisk 查看挂载的分区情况$ e* o; Y% T) N9 R
  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>
复制代码

4 B- S9 D* R; {) p" W- T- k& w
, X. |+ g8 ]6 E% S, X9 t% V2 Y  g返回如下信息
" T5 \1 S9 u" J" V4 ]8 x
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors& u" ?, C9 o# m1 T) u) |
  2. Units: sectors of 1 * 512 = 512 bytes3 q7 O: T( w7 }9 _& K4 X
  3. Sector size (logical/physical): 512 bytes / 512 bytes% Y3 d0 \; f! h8 T6 o" Y, ]
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes, v* |0 f8 }2 I
  5. Disklabel type: dos/ q" }, G& t$ F/ f
  6. Disk identifier: 0x2cc9c27e
    * W% Y  S! S& F
  7. - x( Q, M2 M# u8 v3 p9 L
  8. Device       Boot Start      End  Sectors  Size Id Type
    * D& ~* q. I, h& t9 K
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码

# s$ W4 H, G: e6 g( a8 \4 v/ S* O' m) Q; T- s: }6 J6 B

/ R9 |4 g) u$ o( x# z8 L$ g6 ^" b3 ]此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。9 ^+ C7 Z8 \5 X+ n' e: E4 _6 z
挂载块设备到本机路径
% u# [9 |& E0 O- U0 h
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
' D! Z& b+ n7 ~; j6 E5 c
8 n' [9 o% h6 `

# m' `) {/ M- ?, G& f3 T进入挂载点 /mnt,查看文件" u& f& }+ ?/ K; I. q1 ~% h2 C

: Q9 R# c/ }7 O" T( M
  1. cd /mnt5 R( \7 w; d9 h2 j/ [( i
  2. ls -la
复制代码
% l3 p/ h  d  z
( w9 v2 U# n9 i8 G1 J8 T
返回如下信息
  1. total 16
    ' B- n& S& \) U% `2 Q
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    + r$ j. {% d6 I
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    & T, O5 [! X! s+ v! C' z
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin3 I+ z$ E; x( K5 q. X
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot5 l: w* ^- g0 {* T) v
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev& E9 t; r  N5 n$ d, Z' l8 k7 O
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc2 s) s" r3 Z& E: y1 G" R. E
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    - k% e6 ^6 h; y6 j
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib& |9 e, s9 F6 Z- x: w+ o" p8 S
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib646 k9 B9 V5 \& e0 S* X" C
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    . `/ A7 m* L2 z+ h8 o6 e, I
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    6 Q& \/ L5 H9 n# A* M
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    $ K. J6 c. p( Q( i
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
    7 [2 U( h* E5 a
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    7 k+ k* r& j: q! A* z
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    0 {" p5 T& n" g: M- V2 E6 x
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    " t' U# {! \8 o5 W2 w8 M5 X& [9 ^
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    - u' h# y$ m7 I, m4 }* x9 r4 |- L( P6 L
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    2 [1 ^2 Y7 N; y& G7 O; l: e, g
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
    6 z' B( i  f5 i6 y# m5 c' G/ l
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr
    1 F7 \2 W9 V1 K( h/ z8 {# Z1 H
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
+ g' i! ]0 y' }2 @* R9 _
  1. tar zcf /root/rootfs.tar.gz *
复制代码

2 B7 h  a, D$ Z* _) c查看打包后的文件,确认文件存在,大小一般是在几百 MB

* e4 A1 q1 m$ B
  1. ll -h /root/rootfs.tar.gz
复制代码

2 ?$ V) J$ H0 c$ \) z至此,Rocky Linux 8 的文件系统基本上就制作完成了。" p7 d9 D; k  {5 D( J

) [" \. R  C- N# P
% d$ @+ h8 x- C0 c
3. 后续卸载挂载点) R( k8 j- I. L! y$ T2 V/ X
  1. cd ~1 ?# u# n5 }( }0 B, e+ w0 O: |+ N
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统1 S! U4 [. ?/ q6 y: w. a; P
  1. kpartx -d /dev/loop1
复制代码
, I. f5 ^' {8 J, a
使用 losetup 卸载虚拟块设备
* i8 W, z: ?' t, C
  1. losetup -d /dev/loop1
复制代码

1 b4 g# Z1 G) e& c4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
0 h3 o4 m4 J  E  W7 O1 {1 O项目地址:https://github.com/yuk7/wsldl
0 S& N3 `6 A# O( d下载最新版 Release 的 icons.zip 文件" l& Z  R& _' K5 E' v1 T0 t2 N
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:" L0 Z/ {! q- K" c- x/ d, Z

0 F) X- o/ R2 x, A* k% W6 T找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。& _6 U5 Y3 R: T8 B+ w

, o* W( q) ?9 ~( S0 n2 d/ E双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
3 {; @- D; u; U/ S其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
9 D4 T  |8 t0 Z4 V6 h+ o
" Y* c" M& P) @* M5 V
5. 已制作好的 Linux 发行版下载链接如下:+ r0 `% O; Z* |$ P
CentOS 7.9
! k4 c5 s+ _2 H5 t0 t8 h8 W0 d; F$ QCentOS 8.42 N" C5 A; p6 I7 i( v/ v4 g
Fedora 35
) |9 g' F* }3 G; g0 J! w5 ~Fedora 36
% E) I2 t5 K9 ?8 d; t( p$ RAlmaLinux 8, C4 |- C6 i5 T2 C
AlmaLinux 9
* S" M) h  T1 L2 Q# I) E& N& _# QRocky Linux 8.52 D2 M# P% n3 u1 p9 _: ^
Alpine 3.15( s8 m) b  Z* x- l  P
Ubuntu 18.04
: }* Q: x; a" v# w7 k) ~) bUbuntu 20.04
" R* n4 X/ ^# ^/ B7 HUbuntu 22.04
1 a' S/ s2 z4 J& _; DDebian 10
0 }; q) a* T1 ?+ E+ Z9 T6 RDebian 11+ g/ X, R. ?" G4 _4 x0 G4 n
Amazon Linux 2
7 A$ z, |" l. B0 q2 G/ }  d
+ j" w& |7 J$ _# X0 E1 ?1 y, m6 P
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-5-6 08:38 AM , Processed in 0.083131 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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