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

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

[复制链接]

979

主题

90

回帖

5万

积分

管理员

积分
53052
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。
  Z+ x9 s) N5 N5 \4 i' V. ?如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档1 g& x- }8 }+ z' K  ]
Microsoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
$ |9 ~6 U& ^+ \# S# n微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。% }4 l1 L, b2 D% t0 T
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。: a" m3 f+ Z1 H, P  `( I6 G

- Q1 T: q; j* E  V! k下面以 Rocky Linux 8 作为示例,介绍具体制作过程。
& j' N2 H/ b8 L- z! ]1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:2 C- G/ S" _/ \/ H" M/ ?
https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2
. S- P/ Q7 O) a) Q其他常见发行版的 qcow2 文件下载地址(节选). h! r/ G8 N3 f# B) g! \0 \
CentOS 7.90 h- J& Q. S: w2 f9 o5 a* v$ \+ @! l
CentOS 8.4
* r$ y! Y# C, UAlmaLinux 8% G: e  Y# w2 a# e8 Q) ?
Fedora 36
" d7 d5 S2 M4 }; Y6 k+ U4 B9 k8 }Debian 10
" ~% u( B, R: W) i1 C6 f5 tDebian 11/ X3 }2 _( I+ L- k0 G
Ubuntu 18.04
; k: V9 ]$ R& H9 H1 XUbuntu 20.04
7 H# X5 o. ^, Z+ F& N0 b4 }Amazon Linux 2
" _, c8 `7 D4 E5 J; |1 F  s2 _2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。
. i6 B7 g0 V: B% V转换 qcow2 文件到 raw 文件
1 l) V% m: }& [5 w' f3 J4 c
  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>
复制代码
" \) C, a( p) Y1 H' {
+ ?! r1 P: v* r! }
使用 losetup 将 raw 文件虚拟成块设备4 T# ?0 \2 ]* A% U: Z+ ?
  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$ ]- ^+ [) _& o2 ^3 P7 R5 u# @+ k$ W$ E0 H
使用 kpartx 挂载虚拟文件系统
( }3 |% Z- l4 \4 L" M8 N% N( Z
  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>
复制代码
' |/ ~% F4 t. y4 d2 o1 o, W

& t6 U9 p; V! P. N9 E使用 fdisk 查看挂载的分区情况
3 w9 l3 `% Q8 E3 ^9 U2 _: L
  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>
复制代码
0 h" |, f$ N0 Y( q9 Y8 d
0 @. Y; \/ t% z9 D" f* @
返回如下信息
/ {4 r5 Y; F! \, ~+ G4 X
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors
    7 l9 R7 r' ~1 [# Z$ W8 j
  2. Units: sectors of 1 * 512 = 512 bytes* ?. g: _. P" ~0 ~
  3. Sector size (logical/physical): 512 bytes / 512 bytes
    3 n% s4 `$ ^! J! |; O+ W* O
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    6 v% G% s0 O+ r' y( w; e( X* [% @
  5. Disklabel type: dos
    8 K3 j7 }8 Z7 Z9 r. L, h9 O) y* L  D
  6. Disk identifier: 0x2cc9c27e9 [4 P+ q3 V3 v: @" \! Q& I
  7. * h2 ^6 s: x' o: b8 v" M
  8. Device       Boot Start      End  Sectors  Size Id Type
    * L' q& `  {2 n* Q1 o' h7 ^
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码

; Q" R4 k0 c) H& V4 _) l8 K( k6 j4 A- _- V5 I- w

$ s( F' b2 k4 ^# T3 `此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
7 x  F8 f7 t+ w9 S0 A: F- s+ I- S挂载块设备到本机路径/ e' b' }3 o+ n$ V, x  S- c
  1. mount /dev/mapper/loop1p1 /mnt
复制代码
( j7 w8 g  O% V$ L& O* m
. @2 o( _7 R7 |, E
( e4 h+ _6 ]1 r9 n
进入挂载点 /mnt,查看文件
# J% W# s8 ?5 x2 n  N2 l7 x
2 }. Y2 A+ p1 ^3 J# @
  1. cd /mnt
    " G! v0 n! J0 g/ `& m
  2. ls -la
复制代码

# F0 e; E. ]+ ?1 D# [9 ?& c! Y9 t  n+ N6 a! t
返回如下信息
  1. total 16& l  Z2 m' k' j; ^# \) u4 X7 {
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .3 j3 J8 e/ f) p/ J9 l% {7 F( J  _
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..: v; i+ h# Y2 s1 D& C1 X
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin- d. Q2 m3 z2 h7 D( L
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot
    ! w  s" c- Z. U3 v% @7 w
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev1 o, ^. I  h8 h% w1 Q9 ~  _9 @: }
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc5 I- M7 k/ I" _% Z" Q; U7 O& w* [. A
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home2 H8 ]# F! O; a% P1 [8 J& {
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib9 f$ I  l8 k7 A1 n$ B; B
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64. V; o0 i8 c, Y7 i# P, ?4 c7 _
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media  \# h' w9 Q( z: x2 x" U  e+ F
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt
    ( _1 [0 L. ?( D2 A2 W
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt
    3 x7 B- N3 D* f1 O
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc: ?: H& B% O  ~
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    ! z/ u( _/ {( C* S
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run+ C$ J( q- j( w0 B3 h; E, P
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin
    4 u7 r5 _/ }. s' n2 ~# A
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    " `, K5 a  [& K3 d5 F4 H# n" W8 e
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys) f% g9 Z3 h- e2 @1 a
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp/ P0 E* C) Q, H( y( z% u
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr0 q# H; p7 g1 I0 J
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root7 R7 ~/ e4 |; N3 z% f" q
  1. tar zcf /root/rootfs.tar.gz *
复制代码

" K* L5 `. `6 Y5 u查看打包后的文件,确认文件存在,大小一般是在几百 MB

, z6 _$ `) A# u4 F$ A1 Q/ \/ S
  1. ll -h /root/rootfs.tar.gz
复制代码
- n9 P- x& u4 X" O
至此,Rocky Linux 8 的文件系统基本上就制作完成了。% N+ R5 i* T- V5 B* I; r2 T5 Q; V
, J8 e$ D# X0 v3 o* d) t
) V  W) F; N' K5 K7 l% ^8 I  c
3. 后续卸载挂载点, J) J1 Z0 M7 ^8 H$ F* z# n
  1. cd ~
      O1 }8 G9 m2 L$ K) H; ~
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统% {' m# h0 a1 ~( o# H: J
  1. kpartx -d /dev/loop1
复制代码

3 c. s/ Q9 O4 t% i使用 losetup 卸载虚拟块设备
6 d. E8 j* K" x/ }" c+ U; ]9 F
  1. losetup -d /dev/loop1
复制代码
: g# h) O5 T- ~/ k) l
4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
) a5 ?2 v  H& m项目地址:https://github.com/yuk7/wsldl0 I, S. z8 M1 t9 ?6 ?! D3 N6 Q! X$ G
下载最新版 Release 的 icons.zip 文件( H8 t# y2 P" |. |
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:
7 H, ^- o4 j: k
" f9 F% O0 G' Q! s/ u找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。
/ U4 T& p! a1 E% G6 Q8 K6 O& s. _8 a% B+ d- R' o) |+ X0 b! b
双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
, |3 R9 ^9 X( E+ I  c4 {其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
: @5 s- r6 l) I: Y
, A! S  ?' f3 Y/ e9 }% }
5. 已制作好的 Linux 发行版下载链接如下:
( A% S$ G3 f1 ^  {- I. D8 y" DCentOS 7.9/ q# \, j4 h# g+ x5 h$ @$ s2 c  w
CentOS 8.4
2 j2 }& p+ z, q; H, e  YFedora 35
/ ?: f! z% G3 g; b  W% x* HFedora 36* u+ O% g; j/ x; f' a3 }0 X1 p
AlmaLinux 8+ c! C% z# @) R' R7 Z" I+ Y
AlmaLinux 9( C* G( Q7 V4 s, w0 d' n- @
Rocky Linux 8.5
+ j0 C+ D* G, B9 }* s1 D: RAlpine 3.15
2 a) n. Q) k4 d0 k: z; QUbuntu 18.04/ ]0 U! R' b( E: y
Ubuntu 20.045 A' F$ w* I$ r1 s( x+ D5 n" G) t
Ubuntu 22.048 }! v* Q  j; A
Debian 10
7 y! p' _7 x: U3 C+ F4 {- |Debian 11
. \, _0 R& c) r6 U) D3 AAmazon Linux 2" L# ?! {% n! I( l+ O* G# a8 c

0 r' d  d# d" b8 [- q% _# w
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-2-25 00:01 , Processed in 0.108562 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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