Ubuntu Weekly Recipe

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

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

distrobuilderは,Linux Containersプロジェクトで開発されている「LXD/LXC用イメージを構築するツール」です。特にLXD用のイメージサーバーで公開している各種イメージを日々ビルドするのに使われています。今回はこのツールを使って,独自のイメージをビルドする方法を紹介しましょう。

distrobuilderのインストール

distrobuilder自体は単なるGo言語製のプログラムです。Ubuntuだけでなく,Fedora/CentOS/Springdale/Alma/Rocky,Gentoo/Arch/openSUSE/Plamoといった有名どころのイメージはもちろん,Apertis/openWRT/Alpineといった特別な用途のイメージやDocker Hubで公開されているイメージをカスタマイズできます。手順はシンプルで,カスタマイズ内容を記述したYAMLファイルを用意し,distrobuilderを実行するだけです。

インストールはUbuntuならsnapパッケージを使うのが一番確実でしょう。

$ sudo snap install distrobuilder --classic

ちなみに8月9日に最新の1.3がリリースされています。snap版は8月10日時点で1.3はまだcandidateチャンネルにしか存在しませんが,まもなくstableチャンネルに移行する予定です。

Ubuntu以外ならGo言語の環境を整えた上で,go getするのが簡単です。

$ go get -v -x github.com/lxc/distrobuilder/distrobuilder

distrobuilder自体はシンプルなコマンドです。

$ distrobuilder
System container image builder for LXC and LXD

Usage:
  distrobuilder [command]

Available Commands:
  build-dir      Build plain rootfs
  build-lxc      Build LXC image from scratch
  build-lxd      Build LXD image from scratch
  help           Help about any command
  pack-lxc       Create LXC image from existing rootfs
  pack-lxd       Create LXD image from existing rootfs
  repack-windows Repack Windows ISO with drivers included

Flags:
      --cache-dir   Cache directory
      --cleanup     Clean up cache directory (default true)
      --debug       Enable debug output
  -h, --help        help for distrobuilder
  -o, --options     Override options (list of key=value)
  -t, --timeout     Timeout in seconds
      --version     Print version number

Use "distrobuilder [command] --help" for more information about a command.

helpを除くと,主に6個のサブコマンドから構築されています。これらはいずれもdistrobuilder help サブコマンドで詳細なオプションを確認できます。

  • build-dir:指定したディレクトリにルートファイルシステムを構築します
  • build-lxc:LXC向けのイメージデータを構築します
  • build-lxd:LXD向けのイメージデータを構築します
  • pack-lxcbuild-dirで構築したルートファイルシステムをベースにLXC向けのイメージデータを構築します
  • pack-lxdbuild-dirで構築したルートファイルシステムをベースにLXD向けのイメージデータを構築します
  • repack-windows:WindowsのダウンロードISOイメージを,VM版のLXDのインストールイメージに作り変えます

なお,たとえばbuild-dirの実行にはbtrfs-progsパッケージが必要になるなど,サブコマンドによっては追加でパッケージが必要になることもあります。

主に使うのはLXDイメージを作成できるbuild-lxdでしょう。LXDイメージはそのままだとsquashfsとして構築します。また--vmオプションを付けると仮想マシンで利用可能なqcow2フォーマットで構築します。

「LXC/LXD」向けと言う場合,単なるルートファイルシステムのアーカイブだけでなく,メタデータも必要です。これらによりLXCならlxc-createでインスタンスを生成する際のベースイメージとして利用できますし,LXDならlxc imageでローカルのイメージリポジトリにインポートできます。

シンプルなUbuntuイメージを作る

まずは単にUbuntuのLXDイメージを構築してみましょう。イメージの元となる情報は,すべてYAMLファイルに記述します。distrobuilderのリポジトリにはサンプルのYAMLファイルがありますので,それをそのまま使いましょう。

$ mkdir -p ~/temp/images/ubuntu && cd $_
$ wget https://raw.githubusercontent.com/lxc/distrobuilder/master/doc/examples/ubuntu.yaml

distrobuilderの実行には管理者権限が必要です。

$ sudo distrobuilder build-lxd ubuntu.yaml

上記の設定ではdebootstrapを使っています。流れとしては「debootstrapでベースイメージを作り,YAMLに従ってルートファイルシステムをカスタマイズし,mksquashfsでアーカイブする」といった形になります。VMイメージなら最後はsqhuashfsではなくqcow2イメージファイルとなります。

構築には環境によって数分から十数分かかります。実際に作られるのは次のようなファイルです.

$ ls -sh1
合計 103M
4.0K lxd.tar.xz
103M rootfs.squashfs
8.0K ubuntu.yaml

$ tar tvf lxd.tar.xz
-rw-r--r-- root/root       481 2021-08-07 20:42 metadata.yaml
drwxr-xr-x root/root         0 2021-08-07 20:42 templates/
-rw-r--r-- root/root       140 2021-08-07 20:42 templates/hosts.tpl
-rw-r--r-- root/root        21 2021-08-07 20:42 templates/hostname.tpl

rootfs.squashfsがルートファイルシステムそのものです。それに対してlxd.tar.xzは,root.squashfsをLXDで利用するためのメタデータの集まりとなっています。

実際にLXDのイメージサービスにインポートしてみましょう。--aliasオプションで適当な名前を付けておきます。

$ lxc image import lxd.tar.xz rootfs.squashfs --alias ubuntu1st
Image imported with fingerprint: 99032636054e0162c217e9cb9515b9413b2d0fa32fb32e4e59394fafe36baf42

$ lxc image list ubuntu1st
+-----------+--------------+--------+--------------+--------------+-----------+----------+------------------------------+
|   ALIAS   | FINGERPRINT  | PUBLIC | DESCRIPTION  | ARCHITECTURE |   TYPE    |   SIZE   |         UPLOAD DATE          |
+-----------+--------------+--------+--------------+--------------+-----------+----------+------------------------------+
| ubuntu1st | 99032636054e | no     | Ubuntu focal | x86_64       | CONTAINER | 102.88MB | Aug 7, 2021 at 12:28pm (UTC) |
+-----------+--------------+--------+--------------+--------------+-----------+----------+------------------------------+

無事にイメージを取り込めました。image infoコマンドでその内容を確認できます。

$ lxc image info ubuntu1st
Fingerprint: 99032636054e0162c217e9cb9515b9413b2d0fa32fb32e4e59394fafe36baf42
Size: 102.88MB
Architecture: x86_64
Type: container
Public: no
Timestamps:
    Created: 2021/08/07 11:42 UTC
    Uploaded: 2021/08/07 12:28 UTC
    Expires: 2021/09/06 11:42 UTC
    Last used: never
Properties:
    serial: 20210807_1136
    variant: default
    architecture: amd64
    description: Ubuntu focal
    name: ubuntu-disco-x86_64
    os: ubuntu
    release: focal
Aliases:
    - ubuntu1st
Cached: no
Auto update: disabled
Profiles:
    - default

このイメージを使って新しいインスタンスを作るには次のように実行します。

$ lxc launch ubuntu1st test

これだけです。簡単でしたね。

著者プロフィール

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

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