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

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

[复制链接]

985

主题

92

回帖

5万

积分

管理员

积分
53561
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。' O' X0 j/ [/ F: ?' J; D3 r
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
& n+ n, ~4 T' _Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。# N0 B; y8 p/ @# Q2 y4 O4 o+ c! U5 h/ w
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
; i- Q' G5 q% B" k! s' ?本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。0 V! S/ N8 p+ m5 ?$ Y# _# t
7 T3 o" @! f/ h" Y
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
- k: I( O6 ?) a$ o- k9 X7 Q1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
* ^# l; {2 @/ X. i5 z1 z5 l' w# xhttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow26 W. K) \1 K3 l1 `# C- _# I9 L
其他常见发行版的 qcow2 文件下载地址(节选)/ E# |9 R  V7 O& N
CentOS 7.9
8 L  o: @* ^% s; M# N! zCentOS 8.4
3 U0 P( D, K1 }8 w1 s9 ^+ {  ~( Y+ [AlmaLinux 8' ~! f& c+ L6 A
Fedora 36- @5 s7 ~5 i- z- H' l
Debian 10& b# y9 O! u7 `2 C# A
Debian 115 z& [8 [6 @, `) g/ `
Ubuntu 18.04) S" V; Y2 ?# g- h+ u7 f
Ubuntu 20.04
) E2 Y, \% j" c; \+ x: [- cAmazon Linux 2
. _1 u- S9 {/ i+ I& l2 T2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
& A! `1 [! w2 z+ B转换 qcow2 文件到 raw 文件
9 `; t/ ^# O9 ]8 H' u: @. i; 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>
复制代码

3 R, z% D, z; l) O" o& m: G
0 c3 x6 A& \3 s, r5 E; _- R使用 losetup 将 raw 文件虚拟成块设备
; \% |: N* H" @6 p/ }# o/ M, y* Q" O1 t
  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>
复制代码

  ?6 O; r! [$ d" i* x# O8 z# f' K  Y5 [4 Q
使用 kpartx 挂载虚拟文件系统
! W# {9 c; f* s* F  K
  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>
复制代码

* [- H9 f% ?; s" n7 i3 C3 g8 `/ i5 A+ m- y0 G, r
使用 fdisk 查看挂载的分区情况# Q+ K0 v1 U2 S! c. l( |: X
  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 O$ R# e  p& ~% Q  i7 v
5 P' S& s3 ]* {0 v# k返回如下信息
  F- t; [" t% l# K: J  u# @7 }
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors" N5 @% \- S) Z( c* B, K6 a6 b3 M
  2. Units: sectors of 1 * 512 = 512 bytes( g& F+ x. h8 b' |) d
  3. Sector size (logical/physical): 512 bytes / 512 bytes* p. {& n% b$ C# p; z# M+ y- ]
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    # m1 H0 B3 K0 m- L( `* ]7 Y/ L/ H
  5. Disklabel type: dos
    ( u7 W  q" A* T/ u  y9 u
  6. Disk identifier: 0x2cc9c27e
    ( O+ r4 j9 ?6 y4 k
  7. % Q+ L; J, C4 n3 X5 k
  8. Device       Boot Start      End  Sectors  Size Id Type: p# p" D$ t, t& z: |8 h
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
& u) S: [( F  n9 W/ {8 ^6 ^6 Y
; c/ \5 g  v  @: N! J

1 C6 E  f" V, D) h5 ~此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。; c2 |1 U' x# w/ U. a# k; C# B
挂载块设备到本机路径
( o/ K) C4 J) S6 J( U% v
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
$ I3 [4 }, K% i
6 q! p9 t, G4 g! f9 S

4 E$ e; N. x  E2 J进入挂载点 /mnt,查看文件& ^3 h, I, M& F6 h

  [- `* k1 V+ }! ^
  1. cd /mnt' U2 l3 @- J, ^, {) m6 ^/ ~3 \
  2. ls -la
复制代码

- G9 M6 ~, a8 B4 K
1 m7 L4 A( O! z9 [' Z5 k返回如下信息
  1. total 16: k8 P7 ^6 F7 A" T4 W
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    9 y9 S) t& S, j/ }" n+ ^
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..# D# B$ `! |/ z7 n% a, W: I3 m( L
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    $ i+ s6 O5 D, A; c+ X) u
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot: q( U, G, l; F5 @! ^1 o
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    5 ]. B8 T( m# |, I1 S- t( M0 v
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc+ D* m) F7 e* p9 Z& {
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home! U/ n! R& g. ^/ K# q& }# J
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib7 p5 N! G/ S4 _: M7 V2 P7 c  o3 e
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    % t3 p; M2 S, W* m
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media( |' V2 G, U# [) s
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    6 h" A6 D& A  }6 R& R
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt6 m4 e1 g! n8 p2 X; t% s/ s
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc& C1 n5 U$ d0 b" L
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root( \, {) j7 O1 F/ k0 m" o9 `6 ]
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    ! v, q4 i- C3 }0 s
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    . ?! u/ I1 y6 l
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv  N9 Y0 n# e( ?4 A, r
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
      s' j. D" V/ j# ~
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
    6 `8 ^  }% r! }! Q% e$ w: e
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr& W, i) k7 i3 U, m+ C. e9 d4 }, w
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root* W' ]1 B9 E  H8 Z% k- A- }
  1. tar zcf /root/rootfs.tar.gz *
复制代码
8 r  v; e" T/ S) x. r
查看打包后的文件,确认文件存在,大小一般是在几百 MB
. }2 S/ R% x0 c/ o8 v9 p& j" ~
  1. ll -h /root/rootfs.tar.gz
复制代码
+ I; S& l3 y3 U3 Y
至此,Rocky Linux 8 的文件系统基本上就制作完成了。
( S/ i8 ^) H0 |9 I( S6 L* z+ S
0 I( m- p. R, l% N/ E

# z8 b! o% |; Q; |* ^3. 后续卸载挂载点4 r  ~7 q$ R0 _4 t* O( L
  1. cd ~" }$ A  }' Q# ]  ?
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
; `* B9 e1 ~8 m! C
  1. kpartx -d /dev/loop1
复制代码
1 _1 d( Q! w" V2 K) A# P" h: e
使用 losetup 卸载虚拟块设备
7 I7 v, b: ^5 ]+ Z# M" J  [4 ~" i
  1. losetup -d /dev/loop1
复制代码
% p: ?2 l8 \0 ^) Q; r  z
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
2 M" @- V" B/ [. t* o项目地址:https://github.com/yuk7/wsldl
4 w3 M4 ?( Q/ A( r* H- |6 R下载最新版 Release 的 icons.zip 文件
. x  \- K# H6 q! D* M解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
3 C9 r! S* z- E9 ~% d9 v1 g
; b5 K3 a' i9 A, n1 y+ l% Q找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。) M+ q; r; O# o& P, y

* }7 |9 H6 K. x( T双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
: l$ _% ]0 s0 E+ r其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
9 M8 z1 u2 J: A% p2 z3 |- c+ ?9 p3 S2 p$ H9 L
5. 已制作好的 Linux 发行版下载链接如下:
# r  C( @- w. v$ h& y. C: N. NCentOS 7.96 Y- Z" J  Q% H0 V* i& W
CentOS 8.4
2 J% N  x3 |, Z) W) p2 {Fedora 35( s, g1 |; E! I  @! V6 E+ ~. ^
Fedora 36
9 g1 h" k/ \: c+ X0 h2 xAlmaLinux 8
: V; ^" a% Q) ~" G% PAlmaLinux 9
; G7 {1 h' S. \( f- L# w2 uRocky Linux 8.5, S5 o. O: K) B# Q* ]) W0 d: t
Alpine 3.15* J5 _2 w4 Q5 v. h- l  l0 P2 V! b
Ubuntu 18.04  b3 V/ X3 r7 X3 R( n# P
Ubuntu 20.04: a  J$ M$ E/ \+ E) p$ X; ], d
Ubuntu 22.046 y+ A! t# I+ ~3 x9 l
Debian 10
4 ?( J* z$ Q! _. dDebian 11
5 u/ e/ I- E) ]Amazon Linux 23 S. Z0 K4 A" q* F5 O, A# ?, b
  Z9 I' K4 O* [% M" x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-11-5 05:54 AM , Processed in 0.102030 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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