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

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

[复制链接]

991

主题

92

回帖

5万

积分

管理员

积分
55422
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
- f7 }3 p' q" V- f/ z如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
1 J  y$ f1 H: H3 h4 |# SMicrosoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
" b+ A8 M! _" q6 ]微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。# a5 u2 O: g) l& ~9 z* [  a
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。. B7 G8 {8 L! `7 s# j
8 M  h7 F- D/ |- j9 B% B
下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
& @, ~9 }) E4 ^3 c) r6 P' ^7 E1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
8 y. t- ~9 W8 b6 F* Rhttps://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
8 H7 H4 j) ~  ~3 X$ O7 U. m( u7 M其他常见发行版的 qcow2 文件下载地址(节选)
3 A: k, n$ M5 wCentOS 7.9
1 |( W2 z; h% H& N: _4 tCentOS 8.4
% R9 R  e8 H: S6 vAlmaLinux 8
+ ]# T1 z" R/ S) ~0 V3 i6 B5 hFedora 36, f  X- r7 K  t3 x0 F
Debian 10
4 y2 Q7 ?$ ~! Y) @Debian 11
: F. c( M4 q& N0 t/ v( u' d; KUbuntu 18.046 h1 f) \/ b/ N! F+ ], K+ J: e" l, A. `' T
Ubuntu 20.04
# b! J4 D' x" n: f0 JAmazon Linux 2
9 G+ ]4 h- o( A* Z* l2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
1 R2 I/ r! `* j* i; s转换 qcow2 文件到 raw 文件
" _* L: X; W& G, O0 b; }  l  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>
复制代码

! V. H# @9 v1 a+ i9 }6 m4 C) \' D5 ]% q/ z; j9 R) _- f+ ?/ k
使用 losetup 将 raw 文件虚拟成块设备- K8 \4 `( r. d/ _
  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>
复制代码

+ p# j+ F+ p- y& x" C# n/ r  ~& d
使用 kpartx 挂载虚拟文件系统7 b4 V" `# l) m6 [- @1 ^, p
  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>
复制代码
8 k) J+ a4 K! F5 C

% ~! V% O* y8 E* |使用 fdisk 查看挂载的分区情况
- J( H& d5 x$ A% |, [
  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>
复制代码
) ]( z  @- l2 V& T( z
" ^! M9 C6 Z& E0 ~# U: j
返回如下信息  w2 i4 |4 f3 Q8 C7 \0 W
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors* s' l/ m# w- t& L8 P
  2. Units: sectors of 1 * 512 = 512 bytes) S$ J7 g* r: T4 O' ]  n6 u" f, x
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    2 C' h7 A! L+ D7 K% ?9 ^
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    ( u* @1 I- y. I% Q0 d7 G2 ^* V
  5. Disklabel type: dos
    5 |) k: c/ @7 J
  6. Disk identifier: 0x2cc9c27e" c4 U- `* q0 x

  7. , M2 _% j2 j: R* h
  8. Device       Boot Start      End  Sectors  Size Id Type
    ; M2 @) x" l# T0 y
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
. }: r) \+ S& p7 B
" \8 M* b1 d" `* ~& g1 t( e" K
/ f* U6 l  e( w8 J
此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。4 U( w6 N& [( t, g) o! r/ M% H; }% \9 B
挂载块设备到本机路径
/ V5 z/ Q8 C$ x7 Z1 G& l  N
  1. mount /dev/mapper/loop1p1 /mnt
复制代码

7 t  [# P+ c8 V  d/ ^
$ l4 |. `% d: b2 j
/ b1 ^0 B2 @& O' A; ^% I$ `/ R2 K进入挂载点 /mnt,查看文件) c- f+ B( ?: ]) M3 A3 l

2 c9 v' d! t- y  M
  1. cd /mnt
    ; @1 o. k6 R0 {* l8 k; I1 ?
  2. ls -la
复制代码

6 _, I7 P# N6 A/ r) f: R# G) l+ K  o& B9 \1 k6 q9 ?
返回如下信息
  1. total 16* e5 O. f2 W# P8 D6 ^$ f
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .( v/ e1 P+ ]  N6 p4 I" b
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    , L8 g2 I4 ~* S$ ]6 Q
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin" A9 W1 F% j0 V# Z' m
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    % H. s9 F, b( D% A
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev
    9 Y& g0 S! R8 E0 Q
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc
    . W# u, s2 Y& {* {$ b
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home. K! Y. L" @. t2 b' H- a  Q- s
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib4 P2 P+ h* L: E* ~8 t! e8 h
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    . O- j! j1 q* \* O1 a% I1 N
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media% b: K! H; \9 q( p5 {7 g1 T0 l
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    $ k9 n& _/ I+ j6 H. E" A+ K1 w% c
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    ; D% G2 |2 j  n4 O
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
    2 I( |: ^4 [! {! i# S
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root) {/ ^0 N' J5 d2 v
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    ; B. g, I& e9 ]' s0 G1 R
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin, U( d7 E( v8 Y. @$ N
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    , O, _: y2 y, L8 f0 l
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys. a) }& ?" {4 q& N, y
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp
    8 M: W9 G% @9 m) J% ?/ F' t0 _
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr
    1 P8 @8 |# p7 G7 O# J
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
7 [# m$ a3 @  m& x
  1. tar zcf /root/rootfs.tar.gz *
复制代码
0 U, n" a; v  u! W) S3 H1 o  B
查看打包后的文件,确认文件存在,大小一般是在几百 MB

& j1 Q, L3 M# z7 |, e  a6 V& B
  1. ll -h /root/rootfs.tar.gz
复制代码
9 R8 s; ~) t& U/ W/ G
至此,Rocky Linux 8 的文件系统基本上就制作完成了。1 Y1 P5 c+ O( m! w5 A

  [$ n+ ~7 _4 l7 S" n0 m

- f# d2 p( ?9 y/ x5 n# `" w3. 后续卸载挂载点: T! J" B" T" ^
  1. cd ~. ~$ ~+ `  j2 A% h( \& w
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统7 m& [3 B4 P& X& e9 P
  1. kpartx -d /dev/loop1
复制代码

$ ]: o- W4 @+ \8 s9 ^2 o6 I使用 losetup 卸载虚拟块设备
+ @6 Q: o5 z: X" O( N' D  B/ j
  1. losetup -d /dev/loop1
复制代码

7 E, w9 O: X. M  V4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
& [6 `% e4 ^0 x% W, [. M. K项目地址:https://github.com/yuk7/wsldl
( l4 t+ u  s% h下载最新版 Release 的 icons.zip 文件
1 `# O$ B( R- l) P/ c8 h解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:6 v5 B: C% Q( K2 g7 m" N

) N* o  k  y) B: b  M% g找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
4 _' p. T7 d9 G9 E: D& \' H
1 H+ e8 K* v% o双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
! |$ u1 @% U5 ?9 j# i* N其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。0 S0 I# ?* C5 @+ G" u0 w7 v
9 a: F4 J! l; B. [' [& n
5. 已制作好的 Linux 发行版下载链接如下:. i, L" Q7 J. J4 i9 }
CentOS 7.9
# F4 W" p7 ]9 e4 Q5 B. i  fCentOS 8.4% X5 ]9 W9 ?. p2 m+ Z/ s
Fedora 357 A$ h' [# d4 Q* b" |6 u3 w
Fedora 36
, j& Q7 w7 n& Q& YAlmaLinux 8
& Z7 h) m  L+ n6 wAlmaLinux 93 W4 Z# K  U3 P( u: m
Rocky Linux 8.5
/ i. F1 k. k! [Alpine 3.15
0 o9 B& {( |3 K) U3 o1 {* f2 M8 R3 zUbuntu 18.04
6 U/ Y# K6 k- ~% _7 i! x' OUbuntu 20.04
, B2 k0 i1 z8 n% ^/ r0 f  j; r7 sUbuntu 22.04* @1 f6 k' Y$ B0 L4 j8 |! E2 X
Debian 103 `: q' L4 r+ I# L  L( I; |
Debian 11" x8 P$ c$ w+ U
Amazon Linux 24 n! y2 I% s+ A9 A" F$ R7 n# n

! v: Z4 F' D! k4 b) x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-6-20 02:40 PM , Processed in 0.119109 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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