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

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

[复制链接]
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。  w& b0 r- {- q
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档。$ ^5 d0 l+ k5 F
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
: y& n- A+ R! I1 t微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。
" M0 L; T2 D& o9 c' {  q, ~! n$ }& T本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。- ]8 l3 Y' h* f. @$ G0 z9 d

& B/ C1 ^) o& w8 R下面以 Rocky Linux 8 作为示例,介绍具体制作过程。7 c2 ]- @% z' S% q' P+ e
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:- Y5 q1 Q+ z( f6 @8 z2 f
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
. d! D, m1 m4 ^4 x/ u% m* N4 M其他常见发行版的 qcow2 文件下载地址(节选)4 n6 b' S3 k" }0 n: ?: v
CentOS 7.9
9 g% h0 ?  T$ f1 ^! V" B: TCentOS 8.4- j' C2 `1 ?0 V$ A& a. l+ f4 v1 b
AlmaLinux 8
. j. _( K' Y5 U3 EFedora 36+ R! V: Q; x4 s- v+ K1 W
Debian 10
4 R9 Y+ |$ U4 Q, _Debian 11+ Q2 |: n' X: j& {' {+ a3 Q* e
Ubuntu 18.04  O. q, |! f% N7 P' Z
Ubuntu 20.04
4 C  l% C$ u7 Z) m: i2 G8 @( jAmazon Linux 2* }$ O9 W" u: e. g9 `
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
: q' Q. r3 [% G转换 qcow2 文件到 raw 文件
' V% z- p. G$ L. ]. y( A
  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& S/ i9 |: X7 U' {( p: r  c9 |% a+ N/ H4 n8 {( h! \. o
使用 losetup 将 raw 文件虚拟成块设备2 W9 i9 Q) q7 X* G2 }/ w
  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>
复制代码

0 q* P7 k9 M) |' y8 _$ O- V
2 f8 @( L' ^! _0 o% b, N使用 kpartx 挂载虚拟文件系统
: C/ N5 F* b. ~" b% ~0 s" ~
  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 c. N3 x$ j2 I$ D
9 u- _8 v( g: E' E* A4 S: }8 X6 X8 e使用 fdisk 查看挂载的分区情况
6 L! j6 U; T% \8 O% i: v+ G
  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>
复制代码

- t0 n" p2 b: p' p. h+ k  Z
! i. [6 K  s0 U# R2 q& d6 O; `返回如下信息
! X0 L' u0 P; t, h1 n
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
    7 l$ E. Z& w8 q8 Q
  2. Units: sectors of 1 * 512 = 512 bytes: p( t! z. c1 G9 W! g$ G5 q+ n
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    . }( {0 ?5 s7 B
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    % I; v5 F9 g* f# U! {, x
  5. Disklabel type: dos
    9 F0 {* e* Z* f; a; z
  6. Disk identifier: 0x2cc9c27e
    " Q& h7 X  i" L; Y1 `0 t
  7. ) e4 \6 y8 Z+ L
  8. Device       Boot Start      End  Sectors  Size Id Type
    $ H1 I" [9 v- o8 p& C# W4 Y% {( r
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
& k/ h7 V8 |; A9 [9 l
, d8 ]2 i! S% E4 K+ O5 k( \

3 `, Q  V8 a/ b2 Q) X, S* X此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
- p, E) _  b, Z9 w  p/ C挂载块设备到本机路径9 P4 A& g( w. |* U; Z7 ~& e
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
& L! E7 H* P( |

1 x& m5 G3 n6 o% f9 m' f
* @7 j# P! e: f9 S  K: ]进入挂载点 /mnt,查看文件
, x8 {* r* c& t1 R" f0 F+ N8 A* f9 W2 f
  1. cd /mnt# T# _3 n! u+ c/ b3 L4 X
  2. ls -la
复制代码
7 x1 a0 M4 i! k. i" i

( E) q0 k5 x  l2 n0 P. m( t4 l返回如下信息
  1. total 16+ z4 Q& E- L( e7 Q
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    , t: q$ O5 t6 a1 W& O" R/ `- J% z
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..) B1 D* H- h" f1 J* B
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin7 ~; n2 g" M# C- r# ^% e! R, [
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot# M9 Z2 b$ v. W( h8 R  w
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev/ [5 x4 }4 _1 m& }2 B3 U& K& [
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc" u! f& a- u3 v! R+ j- ^& U
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home' m4 G- }( {' `8 S0 G
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib
    ; M- d6 a- @. P3 x/ O! q0 N) c
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    : M" {3 T6 t! I- u
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media
    ; ?8 g% I4 ]0 l! r/ b. n& i
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt7 c) v; C0 [+ Y: F. b( g9 x; B* h
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    : b0 n' Y% `  z- H
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
    ; a! ~- a# b5 U: X
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    , H7 V1 g, e8 a/ T9 |6 V! D% t0 k: A
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run  ?+ s+ y( ^  M, v
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    9 A: p; A: Z6 M
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    4 v( q- Z8 Q0 }2 U
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    ) _1 j* z! R# u% r5 ?) e5 J
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp) h) y. U8 W1 h' ?: S
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr
    : M& _! i  |, D
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
9 ~9 @3 M2 g* k) L- M/ }
  1. tar zcf /root/rootfs.tar.gz *
复制代码
% q3 \, @9 U+ ~/ |' a
查看打包后的文件,确认文件存在,大小一般是在几百 MB

0 Q. L4 Z1 I- q! r: y. U
  1. ll -h /root/rootfs.tar.gz
复制代码
7 N, _% Y7 B2 t. [
至此,Rocky Linux 8 的文件系统基本上就制作完成了。0 \* W8 }" }1 E% `# d

! g# w% H" i: W. ~4 m  N

6 z) [2 h& [0 Y! B, j3. 后续卸载挂载点
" ]% H' H, a* X, h
  1. cd ~
      B/ X3 z: X2 U8 q
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
8 H1 h- o* ^& [. I) n8 r
  1. kpartx -d /dev/loop1
复制代码
: q' Z9 {2 w5 s8 C. n" V( |
使用 losetup 卸载虚拟块设备# R8 @6 r2 V$ `' b1 u2 h
  1. losetup -d /dev/loop1
复制代码

5 Q* Y( w& G; Y: p' P4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
; V) z; |' ?0 j6 r- x, E项目地址:https://github.com/yuk7/wsldl
) C) v3 F/ X8 k/ a: D% x5 ^- J下载最新版 Release 的 icons.zip 文件
) ?4 S6 l6 W8 \% B解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:! p# S+ [9 s) b; ]+ R
$ j* k# t+ t. O, R
找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
& R1 [; @; L- J9 N1 g' D+ B6 W- |  \- \8 B4 H& n
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统》6 O( B; G0 }* u, n7 X; H: A5 R
其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
! X' ~# J# S0 t) o& G0 i& R! g, J7 F" U$ R& B4 V
5. 已制作好的 Linux 发行版下载链接如下:
7 ]& f" q% b6 C; ?5 k# ?. ]$ D6 MCentOS 7.9
9 I3 n8 g0 f9 D* O8 I9 H7 ?2 r  pCentOS 8.4
  l5 ]. _) }4 c9 tFedora 35
5 G( [* U. A: B* f0 Z0 E7 M8 nFedora 36+ ^' l# r) o4 W4 _- e) q# @
AlmaLinux 8+ M: E  Y. Y  d3 H4 V, A' t% Z
AlmaLinux 9, D9 p; Q9 y7 I1 v- n
Rocky Linux 8.5
$ g' {6 K% u; P) x/ m" GAlpine 3.156 k2 t% \: Y. r) f% L5 A
Ubuntu 18.04
- Y7 [. f+ U/ i- s5 W5 P  r8 [Ubuntu 20.04
3 |5 w* a! ]! Y/ F; r; X* X' SUbuntu 22.046 N8 W3 P) p) e6 s9 f+ l- }
Debian 10
5 B" K- [9 }7 I- ADebian 11
( |5 n, k! ?( R0 C  M, \Amazon Linux 2
6 C1 R- w& h3 }9 |
3 |7 e# ]7 Z" o  `
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-3 02:34 AM , Processed in 0.096741 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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