建造 Fedora 使用 Imagefactory 制作生皮图像

介绍

来源

图像工厂 是一个工具,建立在 盎司,即适用于生成各类操作系统和云镜像。 这些图像可以以各种不同的格式生成。 其中包括 Docker 镜像格式和 qcow2 镜像格式。

这篇文章告诉你如何构建一个 Fedora Imagefactory 中的 Rawhide 图像,然后通过 Docker 在容器中运行它。 在下一篇文章中,您将看到如何做同样的事情,除了为 VM 构建 qcow2 映像。

为什么要建立一个 Fedora 生皮图片?

Fedora 如您所知,生皮是 Fedora 具有夜间更新的操作系统。 虽然您可以在技术上将您的操作系统升级到 Rawhide,但大多数用户更愿意坚持使用最新的 Fedora 发布是因为 Rawhide 不能 100% 保证稳定。 不过,您可能想在 Rawhide 上测试各种工具和软件,或者甚至尝试使用 Rawhide 来看看它提供了什么。 在这些情况下,您可能会发现容器映像和 VM 有用且有吸引力。

关于图像工厂

本节简要概述 ImageFactory 及其工作原理。 这不是该工具的全面概述。 相反,本节的主要目的是让您熟悉该工具在高层次上的工作方式。

先决条件

在我们开始之前,请确保您已经安装了 ImageFactory 的工作版本。 如果您不确定如何安装和设置 ImageFactory,

$ sudo dnf install imagefactory imagefactory-plugins-TinMan imagefactory-plugins-Docker

我需要什么来构建图像?

您将需要两个文件: 启动 文件和一个 模板.

Kickstart 文件用于告诉 ImageFactory 安装什么以及如何安装它。 以下是用于创建(最小)的官方 Kickstart 文件 Fedora 码头基础图像: https://git.fedorahosted.org/cgit/spin-kickstarts.git/tree/fedora-docker-base.ks

要将文件下载到当前目录,

$ wget https://git.fedorahosted.org/cgit/spin-kickstarts.git/tree/fedora-docker-base.ks

该模板用于告诉 ImageFactory 您要安装哪个操作系统(版本、架构等)以及从哪里安装它。 它基本上描述了要构建的内容。 一个 example 模板如下所示:

<template>
    <name>fedora-rawhide</name>
    <os>
        <name>Fedora</name>
        <version>26</version>
        <arch>x86_64</arch>
        <install type="url">
            <url>https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Everything/x86_64/os/</url>
        </install>
        <rootpw>password</rootpw>
    </os>
</template>

模板可以具有 .tdl 或 .xml 扩展名。 (注意:您可能希望将 root 密码更改为更安全的密码。)

修改 Oz 以使用 ImageFactory

由于 ImageFactory 是在 Oz 上构建的,并且您在 Oz 中可能没有足够的可用 RAM 来生成图像,因此您必须修改位于 /etc/oz/oz.cfg 的 Oz 配置。

这是默认的 oz.cfg 文件:

[paths]
output_dir = /var/lib/libvirt/images
data_dir = /var/lib/oz
screenshot_dir = /var/lib/oz/screenshots
# sshprivkey = /etc/oz/id_rsa-icicle-gen

[libvirt]
uri = qemu:///system
image_type = raw
# type = kvm
# bridge_name = virbr0
# cpus = 1
# memory = 1024

[cache]
original_media = yes
modified_media = no
jeos = no

[icicle]
safe_generation = no

编辑 #memory = 1024 的行并将值更改为 2048。这应该足以构建图像。 您可以运行此命令来替换该行:

$ sudo sed -i -e 's/# memory = 1024/memory = 2048/' /etc/oz/oz.cfg

构建 Docker 容器镜像

构建基础镜像的一般命令是:

# imagefactory --debug base_image --file-parameter install_script <kickstart> <template> --parameter offline_icicle true
  • install_script 参数是不言自明的——它告诉 Imagefactory 它应该使用哪些文件来构建您的图像。
  • offline_icicle 参数告诉 Oz(通过 Imagefactory)使用 libguestfs 的功能来离线挂载映像,chroot 到其中,然后执行 RPM 命令。 (通常,Oz 通过启动镜像的一次性版本、ssh-ing 到其中,然后运行 ​​RPM 命令来获取此信息。但是,因为我们正在构建容器镜像,实际输出不是可以作为VM,这就是我们必须“离线”推导出 ICICLE 的原因。)

如果您在 ImageFactor 中没有 rpm 的缓存副本,则此过程将需要 10 多分钟才能运行。 否则,它应该需要 5-10 分钟才能完成。

该过程完成后,它会打印您刚刚创建的图像的 ID。 最终输出将如下所示:

============ Final Image Details ============
UUID: 17206f41-5bd8-4578-84b9-a3fffc1cd168
Type: base_image
Image filename: /var/lib/imagefactory/storage/17206f41-5bd8-4578-84b9-a3fffc1cd168.body
Image build completed SUCCESSFULLY!

笔记: 如果图像构建 失败,那么很可能 Rawhide 已损坏 – 在这种情况下,您可能希望使用最新的 Fedora 释放。 在撰写本文时,这是 Fedora 24. F24 存储库的 URL 是 https://dl.fedoraproject.org/pub/fedora/linux/releases/24/Everything/x86_64/os/. 您可以将此 URL 替换为上述模板中的 URL。 (一定要改 Fedora 版本号等,因此您的图像信息是准确的!)另一方面,如果您收到 SELinux 错误,请尝试运行

设置强制 0

在您的终端中。

为 Docker 准备映像

接下来,我们需要“docker compress”我们的镜像以准备将其加载到 Docker 中:

# imagefactory --debug target_image --id <UUID> docker --parameter compress xz

这一次,用打印出来的 UUID 替换 UUID, 不是 图像文件名。

一旦这个过程完成,你现在就有了你的 Docker 基础镜像!

要将新图像加载到 Docker 中:

docker load -i full/path/to/compressed/image/filename