Ubuntu Weekly Recipe

第678回 distrobuilderでLXD/LXC用のカスタムイメージを作成する

この記事を読むのに必要な時間:およそ 7.5 分

フォーマットの解説

ここまでの説明で薄々気づいたかと思いますが,distrobuilderのキモとなるのはYAMLファイルの内容です。そこで先ほど利用したubuntu.yamlを元に,具体的なフォーマットについて説明していきましょう。

image:メタデータ情報

imageにはイメージのメタデータを記録します。

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

必須なのはdistributionだけです。原則として任意の文字列を指定可能ですが,値によってはYAML上の別のデータから参照されることもあります。ちなみにarchitectureは未設定だとビルドホストのアーキテクチャーが使われます。

また,上記以外にvariantというフィールドでイメージの派生版を作成し,YAMLの中で派生版だけ特殊設定を行うといった使い方も可能です。

source:ベースシステムの構築方法

sourceにはベースシステムの構築方法とイメージファイルの取得方法を記載します。

source:
  downloader: debootstrap
  same_as: gutsy
  url: http://archive.ubuntu.com/ubuntu
  keyserver: keyserver.ubuntu.com
  keys:
  - 0x790BC7277767219C42C86F933B4FE6ACC0B21F32
  - 0xf6ecb3762474eda9d21b7022871920d1991bc93c

downloaderでベースイメージの取得方法を指定し,それ以外の設定はdownloaderの値に依存します。

上記の例だとdebootstrapコマンドをベースイメージの取得・構築に使います。same_asは/usr/share/debootstrap/scripts以下のどのファイルをビルドスクリプトとして利用するかを指定し,urlがミラーサーバーの指定,keyserverとkeysがリポジトリの鍵として使われます。

実はdebootstrapだけが特殊ケースで,他はHTTP/HTTPSからイメージを取得することになります。downloaderでサポートしているフォーマットは主に以下のような値が存在します。

  • almalinux-http
  • alpinelinux-http
  • alt-http
  • apertis-http
  • archlinux-http
  • busybox
  • centos-http
  • debootstrap
  • docker-http
  • fedora-http
  • funtoo-http
  • gentoo-http
  • opensuse-http
  • openwrt-http
  • oraclelinux-http
  • plamolinux-http
  • rockylinux-http
  • rootfs-http
  • sabayon-http
  • ubuntu-http
  • voidlinux-http

おおよそLXDのイメージサーバーでインストール可能なLinuxディストリビューションは,downloaderとurlとkeysを正しく設定することで構築可能です。具体的な記述方法はLXC/LXDのCIで使われている設定ファイルが参考になるでしょう。

busyboxはBusyBoxのソースコードをダウンロード・ビルドしてイメージを構築します。できるだけ小さい環境がほしいなら,busyboxを使うと良いかもしれません。

ちなみにdocker-httpの場合は,urlにdocker pullで渡す名前をかけば大丈夫です。独自のレジストリを利用したいなら,環境変数DOCKER_REGISTRY_BASEを設定しておいてください。ちなみにこれはSabayon Linuxのために導入された仕組みです。普通のDockerイメージをLXDに対応させるには,/sbin/initを適切に設定したり※1⁠,ネットワーク周りの設定をなんとかしたりと,いろいろな対応が必要になります。手間の割に得られるものは少ないため,よっぽど特殊な嗜好を持っている人以外はおすすめしません。

※1
原則としてENTRYPOINTとCMDを実行するスクリプトにすれば良いだけなのですが,その前にネットワーク設定等が必要な場合もあります。

targets: 特定のターゲット向けの細かい設定

targetsでは,LXDやLXCなどイメージをデプロイするターゲット用の設定を記述します。

targets:
  lxc:
    create-message: |-
      You just created an {{ image.description }} container.

      To enable SSH, run: apt install openssh-server
      No default root or user password are set by LXC.
    config:
    - type: all
      before: 5
      content: |-
        lxc.include = LXC_TEMPLATE_CONFIG/ubuntu.common.conf

    - type: user
      before: 5
      content: |-
        lxc.include = LXC_TEMPLATE_CONFIG/ubuntu.userns.conf

    - type: all
      after: 4
      content: |-
        lxc.include = LXC_TEMPLATE_CONFIG/common.conf

    - type: user
      after: 4
      content: |-
        lxc.include = LXC_TEMPLATE_CONFIG/userns.conf

    - type: all
      content: |-
        lxc.arch = {{ image.architecture_personality }}

ubuntu.yamlの例だとLXCの設定しか記述していませんね。create-messageではイメージ構築時に表示するメッセージを,configではコンテナの設定を記述しています。

LXDの場合は,仮想マシンインスタンスを作るときに利用します。バージョン1.3の時点では,sizeでファイルシステムのサイズを,filesystemでファイルシステムをext4もしくはbtrfsのいずれにするかを選べるだけです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。