返回新闻概述

Distrobuilder 1.0 已发布

2019年10月21日

简介

Distrobuilder 团队很自豪地宣布其初始版本 Distrobuilder 1.0 发布!

Distrobuilder 是一种生成根文件系统、LXC 和 LXD 镜像的工具。

它是 LXC template 脚本的替代品,并且逐渐接管了 LXC 和 LXD 使用的许多预构建镜像的生成,最终在几个月前接管了所有镜像的生成。

它使用 Go 编写,与 LXD 共享一些逻辑,并直接生成适合 LXC/LXD 使用或准备好在镜像服务器上托管的工件。

它不是依赖于 shell 脚本,而是使用声明性输入(YAML)和许多 sourcesgeneratorsmanagers 来满足大多数 Linux 发行版和用例。

您可以在 此处 看到它构建我们 每天发布 的许多镜像。

主要组件

镜像详细信息

此第一部分涵盖了常见的方面,例如镜像名称、发行版、版本、描述和架构。

示例

image:
  name: ubuntu-disco-x86_64
  distribution: ubuntu
  release: disco
  description: Ubuntu {{ image.release }}
  architecture: x86_64

镜像源

镜像源是特定于发行版的逻辑(在 Go 中),用于检索合适的最小基础镜像或使用常用工具(如 debootstrap)从头开始生成一个镜像。

示例

source:
  downloader: openwrt-http
  url: https://downloads.openwrt.org
  keys:
    - 0x6768C55E79B032D77A28DA5F0F20257417E1CE16
    - 0x54CC74307A2C6DC9CE618269CD84BCED626471F1
    - 0x6D9278A33A9AB3146262DCECF93525A88B699029

包和包管理器

Distrobuilder 目前支持:

  • apk
  • apt
  • dnf
  • ego
  • equo
  • opkg
  • pacman
  • portage
  • xbps
  • yum
  • zypper

它们执行包安装/卸载、清理、更新以及包存储库的添加/删除。

示例

packages:
    manager: yum
    update: true
    cleanup: true

    sets:
     - packages:
        - cronie
        - cronie-noanacron
        - curl
        - dhclient
        - initscripts
        - openssh-clients
        - passwd
        - policycoreutils
        - rootfiles
        - rsyslog
        - vim-minimal
       action: install

     - packages:
        - NetworkManager
       action: install
       releases:
        - 8

     - packages:
        - cloud-init
       action: install
       variants:
        - cloud

文件

Distrobuilder 可以生成常见文件,例如主机名/主机、一些初始化系统配置文件、cloud-init 模板以及更多用于 LXD 容器的模板生成。

示例

files:
 - path: /etc/hostname
   generator: hostname

 - path: /etc/hosts
   generator: hosts

 - path: /etc/resolvconf/resolv.conf.d/original
   generator: remove

 - path: /etc/resolvconf/resolv.conf.d/tail
   generator: remove

 - path: /etc/machine-id
   generator: remove

操作

操作实际上是一些挂钩点,可以在其中运行提供的 shell 脚本。这些挂钩点目前是:

  • post-unpack(在检索和解包源镜像后)
  • post-files(在生成文件后)
  • post-updates(在应用包更新后)
  • post-packages(在安装/卸载任何其他包后)

示例

actions:
  - trigger: post-packages
    action: |-
      #!/bin/sh
      set -eux

      # Make sure the locale is built and functional
      echo en_US.UTF-8 UTF-8 >> /etc/locale.gen
      locale-gen en_US.UTF-8 UTF-8
      update-locale LANG=en_US.UTF-8

      # Cleanup underlying /run
      mount -o bind / /mnt
      rm -rf /mnt/run/*
      umount /mnt

      # Cleanup temporary shadow paths
      rm /etc/*-

  - trigger: post-packages
    action: |-
      #!/bin/sh
      set -eux

      # Enable cloud-init units
      systemctl enable cloud-init

    variants:
     - cloud

架构映射

这些微小的内部细节之一,但几乎每个 Linux 发行版都有自己对各种硬件架构的命名方式。Distrobuilder 为大多数架构提供了映射,在内核架构和发行版使用的名称之间进行转换。

这允许在输出中使用一致的架构命名,以与 LXC 和 LXD 使用的模式保持一致。

示例

mappings:
  architecture_map: debian

条件

包、文件和操作都可以设置为仅应用于特定镜像变体、发行版版本或操作系统架构,从而可以为整个 Linux 发行版使用单个 YAML 文件。在前面的示例中可以找到一些此类示例。

示例

所有用于 我们的镜像服务器 的生产 YAML 文件都可以在 此处 找到。

它们都功能非常强大,通常用于为多个架构生成发行版的多个版本,并且通常用于两种变体(标准版和启用 cloud-init 的版本)。

支持的发行版

Distrobuilder 可以为以下发行版构建镜像:

  • Alpine Linux
  • Alt Linux
  • Apertis
  • ArchLinux
  • CentOS
  • Debian(及其衍生版本,Devuan、Kali、Mint 和 Ubuntu)
  • Fedora
  • Funtoo
  • Gentoo
  • OpenSUSE
  • OpenWRT
  • Oracle
  • Plamo
  • Sabayon
  • Ubuntu Core
  • Void Linux

最重要的是,还可以使用通用的 docker-http 源将 Docker 镜像用作 LXC/LXD 镜像的基础。

添加新的发行版通常非常简单,只需要添加一个新的包管理器包装器和逻辑来获取最小源镜像或直接生成该镜像。

架构支持

Distrobuilder 支持并在以下架构上积极使用:

  • aarch64
  • armv7l(带和不带硬件浮点)
  • i686
  • ppc64le
  • x86_64
  • s390x

目前仅支持原生镜像构建,不支持通过 qemu-user-static 或类似工具进行交叉构建。

安全

lxc-templates 中旧的 shell 脚本的一个常见问题是缺乏对下载的包和其他有助于镜像构建过程的工件的验证。这通常是由于缺乏用于下载这些文件的 HTTPS 服务器以及难以处理我们必须支持的众多发行版的 GPG 造成的。

Distrobuilder 通过使用通过 HTTPS 下载或 GPG 验证(支持密钥检索或内联密钥环)的预构建最小镜像来更改该模型,然后在该基础镜像之上添加内容,或者使用该基础镜像使用发行版的本机工具生成全新的镜像。

如何获取

此新的 LXD 版本已可供您在我们的 演示服务 上试用。

安装

使用 Snap 包

Snap 包提供了 stableedge 版本。

可以使用以下命令安装:

snap install distrobuilder --classic

或获取最新的上游快照:

snap install distrobuilder --classic --edge

从源代码构建

发行版 tarball 可以从我们的 下载页面 获取。这些包含构建 Distrobuilder 所需的所有 Go 依赖项的快照。

或者,可以使用以下命令构建当前的上游代码:

go get github.com/lxc/distrobuilder/distrobuilder

资源