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

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

[复制链接]

986

主题

92

回帖

5万

积分

管理员

积分
55255
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
3 E7 K0 z6 m. N7 Y$ I" l如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
) V# b) n0 C  {& O" \Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。) G0 @# ~- @; g/ R$ z
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。  e) V6 V) [9 v2 [, X1 r, B% ^
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。
. T' ~9 l: A/ O( v
9 d) E, }' R& q下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
% ^; x0 t- S/ J  K* l1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
' @( s, Q0 J$ y9 khttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
3 o; }" v; m: R% i9 y0 ]0 }! y6 R其他常见发行版的 qcow2 文件下载地址(节选)% L7 v4 M6 |4 S0 O9 X, K& w( r
CentOS 7.9
5 y' t0 p5 J! |; \1 B; k  ?/ e+ E2 v8 z4 X8 @CentOS 8.49 x6 }+ q* a* X# ~. m+ J
AlmaLinux 8% g1 k. p" Q) x
Fedora 36  c/ u1 Z) q; Y* [9 ~- Z- v3 H
Debian 102 i( m) {! `6 V
Debian 11
$ q0 n8 F5 z; u: c! \, dUbuntu 18.04
. n) r/ F* t! }4 |# H, SUbuntu 20.04$ @3 S/ }, ^/ n. t! R
Amazon Linux 2: c- @  l4 F) O. m9 _2 S
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。4 z! Y. V! |# K7 H6 m. `
转换 qcow2 文件到 raw 文件6 Z1 i- m0 C/ q' v
  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>
复制代码
$ l; ?. X+ L. b  [0 q

$ [8 l% y! L- X' c& s7 O使用 losetup 将 raw 文件虚拟成块设备
) l) w1 G7 ~6 }4 Z+ z$ F
  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>
复制代码
% w& V# }; J" `

* k# u8 U! |( f$ H! z' B使用 kpartx 挂载虚拟文件系统
& G6 ^+ r) f* f' |* D. X/ D
  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>
复制代码
3 @% `& p$ z  d- A2 o% L
0 P+ B5 k% M8 o6 l5 D
使用 fdisk 查看挂载的分区情况
9 P2 ^# D6 V- k* @6 K" u
  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/ E) @' ?8 d, T+ d! ]" F- L3 l7 V. P3 S7 u# I  d) W1 b
返回如下信息
' Q! K+ @/ k3 k  j  Y6 a
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors3 ]+ I5 r# `$ N  g3 T% v
  2. Units: sectors of 1 * 512 = 512 bytes
    $ k: c- j- o9 p( y$ [5 b4 @( z
  3. Sector size (logical/physical): 512 bytes / 512 bytes0 a8 ]; C) B9 H! F& B
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    7 t8 l' c2 J7 R; k
  5. Disklabel type: dos; H& _: I- z+ k& i
  6. Disk identifier: 0x2cc9c27e
    9 N. D+ F$ O5 _: }, D: O% [
  7. 3 r- r& A+ ?0 D7 @" [; [
  8. Device       Boot Start      End  Sectors  Size Id Type
    5 d* W4 P: R, U
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码

. {6 U7 a" A& O6 A& @2 R- a5 Q7 m1 a; U+ S6 B
$ @8 {4 H5 ~6 `; }4 p% J; }& z1 n, C
此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。" }% |4 Q/ H9 T9 s5 Y; ^
挂载块设备到本机路径
8 z9 ^' G/ y& o7 a, x
  1. mount /dev/mapper/loop1p1 /mnt
复制代码

: u3 p" K, s; I, \( I/ j/ c, F! @' j9 ?( a, E0 x0 o5 Q, u
. F6 p, @- h4 d  J0 f
进入挂载点 /mnt,查看文件2 k* A+ B3 T. o$ C
" A* E8 }4 T- Y/ R# Q; e
  1. cd /mnt+ V6 W# M. ]0 n7 g  G
  2. ls -la
复制代码
* i# J; Z$ r; b! s/ B( M6 i/ r
! g" k0 ?0 o2 c- [! q' `7 M
返回如下信息
  1. total 169 }5 s; M9 j' y# ~. |
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    ' x5 c# O6 m" E1 S/ F
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..% U2 H+ ?* g0 j2 @: Y8 p
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    % Z8 d2 U" ]; k7 \
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    ; B- f: E/ t5 g% G+ w) J& t
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev6 H  {5 B& U- o7 ?/ N- ~6 x- [$ U
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc6 v! i0 |. }( C" f2 a5 p2 A4 [
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    8 p5 W% P. D- j, a" N& t+ H5 `
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib1 p2 z' m$ b3 z3 U' ?; }/ R
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    ( u. g4 [$ s5 w$ Y* |8 P! `# W
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    ' N- Z  w7 \3 p/ ~' z9 q" }
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    # e' F. d& ?- L$ |5 j
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt5 x4 E2 d+ M0 h% ~  z3 o$ H/ v0 _
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
    / l) x5 s: X- [% c# q
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    : l. ?" b7 n7 R4 ~  k
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    + q. \' D# ^% C
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin! {4 `. W$ r. L+ X8 z
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv+ A  V% L' D# u( l
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys" h8 b& i# q0 O: R9 |! f+ {
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
    6 L$ E& W% [5 p  e: ]" P! `
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr3 h$ T( B/ y3 t6 ^
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root* T9 S, e9 ~% Z
  1. tar zcf /root/rootfs.tar.gz *
复制代码

9 \5 @+ r: v' Q# y3 F查看打包后的文件,确认文件存在,大小一般是在几百 MB
- V$ i& j" m$ }* m9 b& k4 {
  1. ll -h /root/rootfs.tar.gz
复制代码
( U& N# T' B0 N" C
至此,Rocky Linux 8 的文件系统基本上就制作完成了。
/ M& s! p) d$ o# A! ~$ ^$ V" Y0 U6 N3 s! r8 G) i  }$ H- X* o+ u
1 Y# ?5 V0 t6 x" n& [, f0 _: P# N
3. 后续卸载挂载点
) _  u9 T0 e2 p$ t- ?; Z
  1. cd ~2 Z* [9 R; T1 c
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统+ E$ R: e: R  N0 \
  1. kpartx -d /dev/loop1
复制代码
6 Z6 E4 H( Q" f9 I* {
使用 losetup 卸载虚拟块设备1 D! ~) v: \3 m( {7 Q9 U% D
  1. losetup -d /dev/loop1
复制代码
0 u7 W! m% |$ u5 E5 C
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
+ n( L, g% D0 q" r! [: Q6 W0 {项目地址:https://github.com/yuk7/wsldl( D2 X8 b  J5 q
下载最新版 Release 的 icons.zip 文件* K3 Q. p  K  W' ]# S4 l; Q
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
: |7 Z  h0 i+ `/ t' P4 ?3 }& s6 c) v) g, v( Z( }: m
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。& E; t$ j& ~$ ^4 L# [
/ X6 Q& _0 e. e% N2 }
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统, Y4 L5 @6 L, Z' L  ?0 D
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
) W6 C1 K, F% P; z* |3 j6 O# z
- Y0 B* j! U+ y! B: z% \
5. 已制作好的 Linux 发行版下载链接如下:; g3 }$ o9 X6 T- E
CentOS 7.9- {( n* o  F: |# R1 `. S
CentOS 8.4
% i, \6 H' _6 |( mFedora 35$ K+ X9 I- ?7 Z, y) c1 B0 |5 _6 p0 ^, B
Fedora 36' z2 @% d  q( Z* Z2 h8 B0 T
AlmaLinux 8; `# P/ _4 u# H6 j; A9 v0 Z* \1 J& Z
AlmaLinux 9
6 @2 N1 _/ ?" x4 i! r# |! y# D0 sRocky Linux 8.5+ l" B/ [: B: Y- [
Alpine 3.15
7 d! g% D! a6 T9 b7 n+ W4 mUbuntu 18.04' u  x2 t6 n$ a5 ]' ?
Ubuntu 20.049 |9 ~  @! w" }$ l) t
Ubuntu 22.04" L, n1 ]8 I2 d
Debian 10
$ P+ l9 `2 W, n6 I8 ?* {2 fDebian 11
5 g& R' d9 D3 p2 I: v, KAmazon Linux 2# A4 _% }6 n" z+ Y" ]" B, P
. x# Z4 l. p3 y' f8 R, ^, i! X. f
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-3-22 02:37 AM , Processed in 0.078841 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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