MKOSI How To(一)

这是一系列MKOSI镜像构建器由浅入深的新手教程文本,我们会以一个客制化的Arch Linux发行版为例子,详细讲解MKOSI的使用方法。让我们开始构建镜像吧!

什么是MKOSI?

根据官方的说法,MKOSI是一个“客制化镜像构建器”,虽然话是这么说,但是实际上,MKOSI是一个和systemd生态高度相关的,以及围绕systemd的镜像生态编写的Linux发行版镜像构建器。

之所以这么说,是因为,MKOSI本身就是systemd高度依赖的CI基础设施,MKOSI的核心开发成员本身也是systemd的核心开发成员,MKOSI的Feature开发很大程度上也由systemd的开发进程直接控制,尤其是DDI(Discoverable Disk Image)格式的支持。

如前所述,和大家熟知的OCI镜像构建器不同,MKOSI是围绕DDI格式设计的(虽然确实也支持OCI的产品格式),简单来说,DDI是一类自包含的磁盘镜像,它自身包含了自己的一切元数据和校验信息,而不需要外部文件。

如果抛开这些设计思路和政治问题不谈,从技术本质上说,MKOSI就是各种发行版的包管理器的Wrapper(Debian的apt、Fedora的dnf、Arch的pacman、SUSE的zypper)。

这东西是怎么构建镜像的?

这就需要先讲一些基本知识了。

Linux发行版的本质,是三个部分的组合体:

  1. 一系列用于设定文件系统基准点的基础文件(Base Files,或称为Base Rootfs)。
  2. 一组能让系统基本可用(这在现代语境下,通常指的是,可以作为容器根文件系统从init启动)的核心包集合(Essential Packages)。
  3. 以及用于执行包安装的包管理器(Package Manager)。

如此说来,构建一个发行版镜像的过程,用最简单的话来说,无非也就是三步:

  1. 释放出Base Files,构建基本根文件系统框架。
  2. 调用包管理器,下载发行版的核心包集合,并安装到目标根文件系统中。
  3. 将根文件系统转换为目标格式(打包为Tar?整理为磁盘镜像?或是直接保持目录形式产出?)。

当然,实际情况要比这复杂一些。

我该怎么安装它呢?

这简单。大部分发行版的包仓库中已经对MKOSI进行了打包,所以你应该可以使用mkosi这个包名称直接安装:

1
2
3
4
5
apt install mkosi

dnf install mkosi

pacman -Sy mkosi

但是,MKOSI目前处于高速迭代的过程中,因此我更建议你去使用Git主线的版本。要安装一个Python应用程序,一个值得推荐的工具是pipx

1
pipx install git+https://github.com/systemd/mkosi.git

就这么简单。