0%

kiwi分析


作者: 耗子007


1. kiwi简介

1.1 kiwi是什么

kiwi用Perl编写的,用于制作linux镜像的命令行工具。支持制作多种格式的镜像:

  • ISO
  • Live CD/DVD
  • PXEBoot
  • Hard Disk
  • USB
  • Amazon EC2 (.ami)
  • Docker
  • Google Cloud Format (..gce)
  • KVM/Qemu (.qcow2)
  • Open Virtualization Format (.ovf, .ova)
  • Vagrant (.vagrant
  • VirtualBox (.vdi)
  • Virtual Hard Disk (.vhd)
  • VMware (.vmdk)
  • XEN

1.2 kiwi工作流

kiwi的工作流分为两个流程:

  1. 准备。创建root目录,用于保存新文件系统的内容;然后从软件源(可以是安装镜像或者在线的仓库)安装请求的软件包;然后创建镜像描述文件(config.xml);
    最后可选的自定义配置。该流程会输出一个“unpacked root tree”。
  2. 制作。kiwi会自动使用上个流程的输出制作镜像,此流程没有交互,但是可以通过修改image.sh脚本,实现在制作镜像过程中执行用户定义动作。

1.3 kiwi使用方法

准备流程:kiwi –prepare
制作流程:kiwi –create

2 kiwi的基本流程

kiwi制作镜像的流程是自动的,制作需要的必要信息主要来自config.xml的配置文件。此外,kiwi可以通过config.sh和images.sh实现可选的自定义功能。

2.1 制作镜像

kiwi制作镜像分为两步。第一步,prepare操作,使用config.xml配置文件生成“unpacked image tree”。第二步,create操作,基于第一步生成的
“unpacked image”和config.xml配置文件提供的信息创建一个“packed image”(就是镜像)。

制作镜像架构图

注:
(1) Unpacked Image
Encapsulated system reachable via chroot
(2) Packed Image
Encapsulated system reachable via kernel file system/extension drivers such as loopback mounts, etc.

2.1.1 Prepare操作

只有prepare操作成功,才能进行下一步的create操作。
prepare操作,kiwi会创建一个unpacked image(也就是root tree)。这个root tree是通过–root参数或者config.xml的defaultroot元素指定的。
该目录会在create操作中用于安装软件。软件管理工具是通过config.xml的packagemanager元素指定的,
kiwi目前支持的软件管理工具有:smart、zypper(默认选项)、yum和apt。
Prepare操作主要包括以下步骤:

  1. 创建目标root目录。如果目标root目录存在,kiwi会退出并报错。可以使用–force-new-root参数,强制创建,如果指定目录存在,kiwi会先删除,
    然后重新创建。
  2. 安装软件包。把配置文件的bootstrap部分指定的软件安装到root目录。filesystem和glibc-locale(euler没指定此包)包是构建引导环境
    必需的软件。这两个包的依赖链足以在引导环境中填充所有必需的软件,以支持将软件包安装到新root目录中。软件包管理可能安装了一些不需要的软件包,
    可以通过”package_to_be_deleted“来删除多余的软件包。
  3. 应用overlay目录。软件包安装完成后,KIWI将名为root的overlay目录中存在的所有文件和目录拷贝到目标root tree。
    已经存在于目标root tree中的文件将被覆盖,其他将被添加。 这允许您覆盖在安装阶段期间软件包安装的任何文件。
  4. 安装archives。在上一步完成之后,把config.xml的archive元素指定的任何archive(可以使任何文件,以tar包形式保存),解开到目标root tree。
    可能覆盖掉已有的文件。
  5. 运行用户定义的脚本config.sh。prepare操作的最后,执行config.sh脚本,运行在root tree的顶层。该脚本的主要功能是完成系统配置,例如启动一些服务。
    更详细使用可参考 config.sh
  6. 管理新的root tree。你可以通过chroot操作新的root tree,此文件系统与常用的区别在于多一个image目录,用于保存kiwi在create步骤需要用到的信息,
    例如,config.xml配置文件的副本。

2.1.2 Create操作

Prepare操作的成功时Create操作的前提。保证unpacked root tree是完整的和一致的。create操作会创建一个packed image。利用unpacked root tree能够
创建多种类型image,例如,OEM image或者虚拟机的images。
Create操作主要执行以下步骤:

  1. 运行用户自定义脚本images.sh。如果images.sh存在,首先在root tree的顶层执行此脚本。该脚本主要作用是删除最终镜像不需要的文件。
    更详细使用方法可参考 images.sh
  2. 创建请求类型镜像。创建config.xml的type元素指定的image类型,配置文件必须包含至少一个type元素。下图显示当前支持的镜像类型。
    支持镜像类型