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

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

[复制链接]

989

主题

92

回帖

5万

积分

管理员

积分
55362
发表于 2022-7-4 16:04:34 | 显示全部楼层 |阅读模式
WSL,Windows Subsystem for Linux 的缩写,意为适用于 Linux 的 Windows 子系统。可让开发人员按原样运行 GNU/Linux 环境,包括大多数命令行工具、实用工具和应用程序,且不会产生传统虚拟机或双启动设置开销。  w4 x+ z$ q' X5 n+ \
如何在 Windows 10 版本 2004 及更高版本或 Windows 11 上安装 WSL,可以参考微软的官方文档
7 Q2 {- d$ b* n6 ~: |$ C2 lMicrosoft Store 上已存在一些 Linux 发行版,比如 Ubuntu 等,基本上寥寥无几,或者版本比较古老。
2 l" `! r! ?* C- U" W7 C微软官方有文档示例,通过使用 tar 文件导入任何 Linux 发行版。通过使用 Docker 容器获取 Linux 发行版的 tar 文件来将它导入 WSL。  \% H1 g. v* x* z0 D3 G  E( U+ t
本文则是介绍另一种制作适用于 WSL 的任意 Linux 镜像的方法,基于各个 Linux 发行版官方提供的 qcow2 镜像来制作。/ ~0 o, O3 R. H7 i

4 @) Y+ ^& c' j3 a下面以 Rocky Linux 8 作为示例,介绍具体制作过程。+ v3 \3 H! v+ Q' h: }
1. 下载官方提供的 qcow2 文件Rocky Linux 提供最新版的 qcow2 文件下载地址:
) J5 C5 X- p6 D' T  ?https://download.rockylinux.org/pub/rocky/8/images/Rocky-8-GenericCloud.latest.x86_64.qcow2! e" h3 B2 y& {' q) b: d8 I, b
其他常见发行版的 qcow2 文件下载地址(节选)
4 f" D- I# U9 P# FCentOS 7.9) i& J! K- M% x! l- {
CentOS 8.4. i! L! Z" E) J3 L) P, D
AlmaLinux 88 F" N. @2 `: C6 }8 W
Fedora 367 T8 [% |: @0 C
Debian 10
9 f% O; y$ w3 b* F" U# JDebian 11. A/ b' B% K5 v: V
Ubuntu 18.04/ b: a! K& e5 {) d  i" W! `% o7 h# g
Ubuntu 20.04+ u6 G$ X1 m6 c) `
Amazon Linux 2! g/ x  b. F- C, b& `
2. 制作 rootfs.tar.gz以下所有的操作依赖的命令有:kpartx、qemu-img、losetup、fdisk、mount、umount,如果命令不存在,请自行安装之。8 P" N* X1 K, N; V
转换 qcow2 文件到 raw 文件/ f# T$ S: X0 n! ]6 A8 H, I4 K% y
  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>
复制代码
# A% o% Z2 u9 ^: x- w* I
5 \6 C8 c: ?1 y0 P1 P6 o& g9 f. R
使用 losetup 将 raw 文件虚拟成块设备& n/ f$ A5 [" M- J- x4 o+ J& @
  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>
复制代码
# h2 ~/ H  Q7 g

5 \. X1 U- U2 W$ V0 D" ]/ j使用 kpartx 挂载虚拟文件系统
( A: O7 {6 L: _( M
  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>
复制代码

- M/ i* n8 T; S2 d0 R4 E% b3 y7 |& S8 ^
使用 fdisk 查看挂载的分区情况
/ U* ~7 n- y! 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>
复制代码
, Z. Q0 d3 J# R1 {2 Z

+ v. N/ v: H# r' [0 Y返回如下信息( ~& V' E& U7 d( r: F& x+ O0 o
  1. Disk /dev/loop1: 10 GiB, 10737418240 bytes, 20971520 sectors9 k9 I: g0 l. U* x
  2. Units: sectors of 1 * 512 = 512 bytes
    : v& S% `" Y" ]$ |0 B
  3. Sector size (logical/physical): 512 bytes / 512 bytes# z, s" J- o, E1 }8 s
  4. I/O size (minimum/optimal): 512 bytes / 512 bytes
    2 x% t4 ]+ X! Z( I% b
  5. Disklabel type: dos
    ; h& H9 U9 m7 G+ P
  6. Disk identifier: 0x2cc9c27e
    # M+ U* U: t% z. k# b

  7. 8 g7 g0 k) F4 |2 f! ^
  8. Device       Boot Start      End  Sectors  Size Id Type& l) B8 ^7 D: \& I& e
  9. /dev/loop1p1 *     2048 16386047 16384000  7.8G 83 Linux
复制代码
4 S+ I0 i& v' b) Z& |( K. s+ y! }
9 ^7 h# K8 i( e1 q. m
1 y# r" q& A2 y! N+ n, y7 X
此处的/dev/loop1p1就是等下要 mount 的块设备具体的名称。
! ~, D* D0 ]2 ^- z9 b- t挂载块设备到本机路径* t; Q1 Q2 `8 U! O, Z% r; ~
  1. mount /dev/mapper/loop1p1 /mnt
复制代码

" p/ C' M! P+ c* w! p/ q! }0 s9 I& s. ~

  f6 r/ T* T0 ?+ D2 L, y进入挂载点 /mnt,查看文件( S  P9 ?* ]6 @# ]! h
, s. M' G" i+ p3 S( r2 U8 P5 M- b3 M, j
  1. cd /mnt
    / m  w6 r% _- M+ a1 z
  2. ls -la
复制代码
7 Z9 t6 g5 S/ B# y* C0 ~5 N  E3 h
* U6 y# ~4 U! V4 @! k, Z
返回如下信息
  1. total 16
    3 Y# D- I7 \* t% T$ Y4 b) N
  2. dr-xr-xr-x. 17 root root  224 Nov 15 03:17 .
    , F+ X2 B+ z" ^5 g+ e  S* c
  3. dr-xr-xr-x. 18 root root  256 Nov 17 09:09 ..
    ) q3 m' [! O; l' @, P8 O5 y
  4. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 bin -> usr/bin
    # D: H% T# X- s/ D  A
  5. dr-xr-xr-x.  6 root root 4096 Nov 15 03:24 boot! @0 [5 k7 Y+ X% |* _8 }% S
  6. drwxr-xr-x.  2 root root    6 Nov 15 02:50 dev! a  H6 ^" J# h! L$ B. @9 d  U) t
  7. drwxr-xr-x. 94 root root 8192 Nov 15 03:24 etc5 I1 S4 c) ?/ e; ]$ j6 h# h
  8. drwxr-xr-x.  2 root root    6 Oct 11 08:48 home
    ! p7 K3 D' a  g" q
  9. lrwxrwxrwx.  1 root root    7 Oct 11 08:48 lib -> usr/lib
    ; V& F4 `8 e: x0 Y
  10. lrwxrwxrwx.  1 root root    9 Oct 11 08:48 lib64 -> usr/lib64
    . t  ~- s, f3 @4 ]8 E7 f
  11. drwxr-xr-x.  2 root root    6 Oct 11 08:48 media6 `4 b: {4 @- i1 p& X# u/ F3 J% c
  12. drwxr-xr-x.  2 root root    6 Oct 11 08:48 mnt0 E* k3 Y, [2 t' E2 l, g) G
  13. drwxr-xr-x.  2 root root    6 Oct 11 08:48 opt8 W# z4 u; y; \7 F1 g8 m$ g1 d# |
  14. drwxr-xr-x.  2 root root    6 Nov 15 02:50 proc
    6 }: Z$ m" P- B9 y" ~9 H4 x+ P) {
  15. dr-xr-x---.  2 root root  114 Nov 15 03:47 root
    ' F# h) \7 `  I
  16. drwxr-xr-x.  2 root root    6 Nov 15 02:50 run
    3 ?% a& _8 m8 t0 k( J
  17. lrwxrwxrwx.  1 root root    8 Oct 11 08:48 sbin -> usr/sbin$ I7 u$ ?. W" V' A$ D3 ?3 y
  18. drwxr-xr-x.  2 root root    6 Oct 11 08:48 srv
    . V3 t6 I# d9 Z) I; d
  19. drwxr-xr-x.  2 root root    6 Nov 15 02:50 sys
    . v* @! b3 s+ k5 T" T+ N$ W
  20. drwxrwxrwt.  2 root root   84 Nov 15 03:47 tmp3 k1 Q0 D# [' w& U
  21. drwxr-xr-x. 13 root root  158 Nov 15 03:01 usr3 L; X+ O8 [  e; J
  22. drwxr-xr-x. 20 root root  262 Nov 15 03:00 var
复制代码
打包压缩 /mnt 整个目录为 rootfs.tar.gz,保存到 /root
) r) T/ B( W: x, K
  1. tar zcf /root/rootfs.tar.gz *
复制代码

: `0 r+ R1 y1 Q) D# n$ ]查看打包后的文件,确认文件存在,大小一般是在几百 MB

8 k# W& s+ B' T- B
  1. ll -h /root/rootfs.tar.gz
复制代码
" ?9 ^& @- }4 G" Q, j; y, o
至此,Rocky Linux 8 的文件系统基本上就制作完成了。
. O) C1 w: s) m
8 }, E( s- r; o: O) g. Z
; N1 V2 G8 v. b/ \* m! q* g
3. 后续卸载挂载点
, E! v% q7 [: w6 ~# T
  1. cd ~
    ) ^4 [/ K) D1 Y0 y, t2 f
  2. umount /mnt
复制代码
使用 kpartx 卸载虚拟文件系统
5 s* L! d& W- x& A' ?
  1. kpartx -d /dev/loop1
复制代码
; w1 \! g) \/ M3 E3 v3 K
使用 losetup 卸载虚拟块设备) u+ }% Y) p0 n! y! n1 E8 z: N
  1. losetup -d /dev/loop1
复制代码

- w; [& ]; n- B% X3 x: W$ v4. 搭配 wsldl 使用wsldl,Advanced WSL launcher / installer,是一个用 Go 编写的多功能和高级 WSL/WSL2 启动器和安装程序。它可用于安装任何 rootfs 软件包或充当现有已安装发行版的启动器。
! g$ Z5 y, }. m9 c0 W6 `4 B1 ^% B项目地址:https://github.com/yuk7/wsldl) h7 M$ s, I2 h5 d* l* [
下载最新版 Release 的 icons.zip 文件0 c6 |9 C( Z" k4 U! Y8 ~
解压 icons.zip 后,你会发现一系列的 Linux 发行版的 exe 文件。如下图:' }3 Z! ~7 q! t- i

: k0 p5 G5 C1 ?找到 Rocky.exe 文件,再将上一步打包压缩好的 rootfs.tar.gz 文件下载回本地。将这 2 个文件放到同一个目录下。& j$ K& R/ d! o

! i: u1 F* e9 a- p8 _; Y双击 Rocky.exe 即可安装 Rocky Linux 8,具体过程参考另一篇文章《在 Windows 10 上安装 Rocky Linux 系统
4 n4 O2 Z7 i4 U7 H其余发行版的制作过程大同小异。嫌麻烦的可以直接下载我已经制作好的一些常用的 Linux 发行版。
6 i; y$ }+ m1 o$ P. d8 k% R6 r4 F
% ?( R) ?7 L4 r4 ?, q5 v2 @
5. 已制作好的 Linux 发行版下载链接如下:. ?& `! _9 B6 T9 w( ~
CentOS 7.9
6 p7 d8 F/ [5 d  Y: oCentOS 8.4
( A, S* i: ]9 aFedora 356 D/ `* t5 y& M. u! c
Fedora 36
+ ?$ A8 _' i' U* D; J! B6 zAlmaLinux 8! S9 _1 l' Q0 d1 j
AlmaLinux 9
5 t  D" ~  r1 r/ j2 C/ i% KRocky Linux 8.5
# I/ n: _1 L* A  k$ aAlpine 3.15
5 O- V& O* m2 m$ s; O. tUbuntu 18.04, X. x. }8 B( p6 |+ ~* V8 [
Ubuntu 20.04
6 B4 ~. \  f7 ~+ aUbuntu 22.044 D% T3 L1 i9 \
Debian 10
: f2 H4 H. c: A9 ?+ R4 J2 n" ~Debian 11# u' z$ H9 m/ r
Amazon Linux 21 x& W8 P7 q8 p

1 S6 }, @1 e' |$ U
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-5-6 08:39 AM , Processed in 0.132047 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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