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

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

[复制链接]

991

主题

92

回帖

5万

积分

管理员

积分
55422
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
5 a! u) U" Y/ t如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
$ P9 h0 h) R" m% g2 [Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。* Y3 D+ ]3 K( l6 `% M0 ~: C
微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
7 G* P: {) y5 Y/ o本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。( _$ q1 j0 d' x2 a) h

/ {/ s% `8 \6 \) X2 I" p下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
( {2 S2 j' Q9 |# ^$ z1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
0 B* W/ s) }& X' i3 g6 rhttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2% A1 G6 A1 o: X/ w
其他常见发行版的 qcow2 文件下载地址(节选)
5 Z) d3 h8 R- n- ~CentOS 7.93 t7 U( u  m0 H0 t$ ?! y
CentOS 8.4
. S/ q# Y+ x  L8 H/ pAlmaLinux 8* i( K  h) ^% s+ Q' N9 ^
Fedora 36% n& ~$ h% n) Q% j% c
Debian 10
0 A! G7 u1 f% PDebian 11
5 {2 X% R0 {  O1 h7 C6 q1 w7 G& cUbuntu 18.04, b" t/ w+ U3 o$ i+ L# C4 w
Ubuntu 20.04# x# `. @6 d1 a# V7 O& z
Amazon Linux 27 K, Y" H3 p2 @4 c$ r
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
6 U% V0 w) \7 X: O8 a  t转换 qcow2 文件到 raw 文件' ?0 H' t/ A$ s
  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>
复制代码
) _' s, p! {; l; N. ]

. k1 P* ]4 \! H4 t* c使用 losetup 将 raw 文件虚拟成块设备# V1 g3 O0 `+ [  Z2 o$ C
  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>
复制代码

/ i" F' i6 J  V- r
7 T, H3 Y+ ~: L* C! [/ S使用 kpartx 挂载虚拟文件系统
$ _: E; v  U5 ?7 Z/ L/ u
  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>
复制代码
* T" c* w9 T: Z6 x, K4 o* H1 h

. V" H1 y: K7 j! S9 h$ P1 a使用 fdisk 查看挂载的分区情况
, p9 e6 A7 Q( C  n. w3 t2 r3 `7 H
  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>
复制代码

/ Q+ i, @4 w5 e+ w
/ T& o" q, |+ f; s+ E6 e返回如下信息# U8 V. A+ {' [( v6 U
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
    5 Y& {4 x0 u/ s' Q6 B
  2. Units: sectors of 1 * 512 = 512 bytes
    7 l9 ]+ Q! ^+ Q! r* U8 V
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    - h, }* y+ l; I8 a
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    ! ?. t+ E- y* N' _2 K
  5. Disklabel type: dos
    & m, _( a* c' b, S6 U* T7 s3 ~
  6. Disk identifier: 0x2cc9c27e
    6 h' ^& V+ ?! _

  7. 3 `; E) A. ^, r3 q1 C1 C
  8. Device       Boot Start      End  Sectors  Size Id Type5 Z3 k: U/ p3 {! `; D
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码

9 ^. L- w) d+ n, N7 ]# b7 _0 v! X0 r5 p+ C' A" J; ^2 h8 q! @

0 e; F7 B3 D5 H1 @3 r此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。) g  P* X# K5 n* P9 `
挂载块设备到本机路径- D* N3 x( Q- v" ^/ y( c* I
  1. mount /dev/mapper/loop1p1 /mnt
复制代码

# `$ z8 H0 c' u3 l( v$ R9 E  q! R0 n) T6 V7 X

; o- P  A! R2 L( k- N7 i9 E7 W' P7 ^进入挂载点 /mnt,查看文件
! R, Z* G' b5 u5 ?: u
$ o( R4 |( G: G9 z2 F
  1. cd /mnt
    & F! [8 N2 r* m6 ?- H
  2. ls -la
复制代码
, S- F5 |4 u* U8 E" m% F6 E! J0 F

; ^5 q/ T' t- D- e1 ]返回如下信息
  1. total 16
    ! M4 ?  y2 R1 H: e' V
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .# ~  G" W/ t" n
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..5 @+ h# ?3 b) }* r; l
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    ; y% M$ ?; O& h  C7 |9 @
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    + X; A0 Q! w. R8 x9 s
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev1 O9 E9 h( J) Z: n
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
    ' W) L) g8 @1 G' y  ~
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home9 E( t$ Y% ^# m9 X1 b% A# }! I/ `
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib
    . x" u! y0 W& A2 f2 s0 J/ W7 r
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    & H4 |& @  {9 v
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    + {; u# c8 `0 ]9 K( C3 s
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    / a$ o1 e5 a& U5 D5 H6 v) c0 P7 ]
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt& Q  Z6 @+ z6 O; b$ e0 {+ ^
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc1 K% l1 j" h% ^5 u: Y# W" ~$ B
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root* y8 H7 K8 s7 G
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    + U# C: D0 B& j! N" |! `% \
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    * }' B# d* b( S; A
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    7 \+ z9 i9 G7 j, y; r) e
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    2 g9 q. T. V6 G/ f
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp3 L/ Y" }- l# l" t1 Z
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr
    7 n# ]+ j* ?8 N* `3 m4 r* O
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root; D6 w1 [' |) X7 E6 c
  1. tar zcf /root/rootfs.tar.gz *
复制代码

2 G# b. L0 `5 q$ Z查看打包后的文件,确认文件存在,大小一般是在几百 MB
/ B5 {& B# ^/ t* P. }
  1. ll -h /root/rootfs.tar.gz
复制代码
% H5 g# T, l/ L2 R) ]. ~' E
至此,Rocky Linux 8 的文件系统基本上就制作完成了。8 D. X3 L' M$ q  a
: D2 ~: U" p% o
/ D( U+ w# S5 Y' a$ e3 J. ?
3. 后续卸载挂载点3 f% Y* t5 p; O% Q
  1. cd ~9 |& h3 a5 n# `5 W/ D- s; L
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
: P, n4 `  [/ H, K
  1. kpartx -d /dev/loop1
复制代码

- E* g+ ?! U) _; ^; m& @使用 losetup 卸载虚拟块设备
: X1 E" Y* n6 P) A/ w7 u2 R
  1. losetup -d /dev/loop1
复制代码

- o) i3 t5 k* U' b" C4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
0 P* T, p7 m! Q; ]项目地址:https://github.com/yuk7/wsldl3 V" q# r* E9 N; Y
下载最新版 Release 的 icons.zip 文件/ D9 n! V( `  \- E9 ?
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:2 i. m6 i8 M7 o" H7 F
" E$ f$ s$ A/ r8 A! O+ Z5 W8 E
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
9 T' k, t5 G0 s, }- R6 h: r
, g% b# V) ^& z双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
/ _  b0 {4 [5 n  J  k" ^其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。2 n6 O7 V3 ~; H5 e# B1 m

4 n1 [6 Q& \6 U$ G- ]
5. 已制作好的 Linux 发行版下载链接如下:
1 P7 ^: M4 Y/ b- W& q- D3 g' _9 PCentOS 7.9; w- m, A* V" o: V# N
CentOS 8.41 b8 ~" Z: K) u( g
Fedora 35
& g6 s) n: h; n7 ~Fedora 36
" o5 v+ I7 f3 A% FAlmaLinux 80 n' }/ W, N% V4 q& k  ]  S6 n% U
AlmaLinux 9
! m  e* n2 e5 U, U" s; QRocky Linux 8.5
) q, M" v3 e* T8 N2 VAlpine 3.158 k3 N5 ]" m2 M
Ubuntu 18.04
$ l( y# u1 P/ I3 lUbuntu 20.04' {% Q- [- ]8 A# |1 H
Ubuntu 22.04
! B( a. c/ [6 A/ z5 F( N5 m8 vDebian 10
0 a5 K' f2 E4 N2 u, gDebian 114 q( R- C2 t' w
Amazon Linux 2
. k$ t6 w0 s3 e$ {8 X6 U& Y" a& j7 l' T7 ?; ~) e' p7 f' U' `8 f! A
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-6-20 01:05 PM , Processed in 0.106962 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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