distrobuilderは、
distrobuilderのインストール
distrobuilder自体は単なるGo言語製のプログラムです。Ubuntuだけでなく、
インストールはUbuntuならsnapパッケージを使うのが一番確実でしょう。
$ sudo snap install distrobuilder --classic
ちなみに8月9日に最新の1.
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を除くと、distrobuilder help サブコマンド
」
build-dir
:指定したディレクトリにルートファイルシステムを構築しますbuild-lxc
:LXC向けのイメージデータを構築しますbuild-lxd
:LXD向けのイメージデータを構築しますpack-lxc
:build-dir
で構築したルートファイルシステムをベースにLXC向けのイメージデータを構築しますpack-lxd
:build-dir
で構築したルートファイルシステムをベースにLXD向けのイメージデータを構築しますrepack-windows
:WindowsのダウンロードISOイメージを、VM版のLXDのインストールイメージに作り変えます
なお、build-dir
の実行にはbtrfs-progs
パッケージが必要になるなど、
主に使うのはLXDイメージを作成できるbuild-lxd
でしょう。LXDイメージはそのままだとsquashfsとして構築します。また--vm
」
「LXC/lxc-create
」lxc image
」
シンプルなUbuntuイメージを作る
まずは単にUbuntuのLXDイメージを構築してみましょう。イメージの元となる情報は、
$ 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を使っています。流れとしては
構築には環境によって数分から十数分かかります。実際に作られるのは次のようなファイルです.
$ 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.
実際に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
これだけです。簡単でしたね。
フォーマットの解説
ここまでの説明で薄々気づいたかと思いますが、
image:メタデータ情報
imageにはイメージのメタデータを記録します。
image:
name: ubuntu-disco-x86_64
distribution: ubuntu
release: focal
description: |-
Ubuntu {{ image.release }}
architecture: x86_64
必須なのはdistributionだけです。原則として任意の文字列を指定可能ですが、
また、
source:ベースシステムの構築方法
sourceにはベースシステムの構築方法とイメージファイルの取得方法を記載します。
source:
downloader: debootstrap
same_as: gutsy
url: http://archive.ubuntu.com/ubuntu
keyserver: keyserver.ubuntu.com
keys:
- 0x790BC7277767219C42C86F933B4FE6ACC0B21F32
- 0xf6ecb3762474eda9d21b7022871920d1991bc93c
downloaderでベースイメージの取得方法を指定し、
上記の例だとdebootstrap
コマンドをベースイメージの取得・/usr/
以下のどのファイルをビルドスクリプトとして利用するかを指定し、
実はdebootstrapだけが特殊ケースで、
- 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ディストリビューションは、
busyboxはBusyBoxのソースコードをダウンロード・
ちなみにdocker-httpの場合は、docker pull
で渡す名前をかけば大丈夫です。独自のレジストリを利用したいなら、DOCKER_
を設定しておいてください。ちなみにこれはSabayon Linuxのために導入された仕組みです。普通のDockerイメージをLXDに対応させるには、/sbin/
を適切に設定したり
targets: 特定のターゲット向けの細かい設定
targetsでは、
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.
LXDの場合は、
files: ルートファイルシステムのカスタマイズ
filesでは、
ubuntu.
files:
- path: /etc/hostname
generator: hostname
- path: /etc/resolvconf/resolv.conf.d/original
generator: remove
- path: /etc/user/profile
generator: copy
source: /etc/profile
- path: /var/lib/dbus/machine-id
generator: remove
- name: ext4
generator: fstab
types:
- vm
generatorにはhostnameやhosts、
このうち専用のものは主にコンテナの中で特殊扱いされるもの、
removeはイメージ作成時に自動生成されたファイルを確実に削除しておきたい場合に便利です。copyはホストから特定のファイルをイメージ内部にコピーしたい場合に使います。またmode/
dumpは特定の内容をファイルに書き出したい場合に利用します。
- path: /etc/machine-id
generator: dump
- path: /etc/netplan/10-lxc.yaml
generator: dump
content: |-
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp-identifier: mac
releases:
- bionic
- eoan
- focal
- groovy
types:
- container
variants:
- default
/etc/
のようにcontent未指定の場合は、
releases/
これらはimages
以下で設定された値が参照されます。またdistrobuilder実行時の末尾に-o image.
」
このフィルタリング機能はfilesだけでなく、
- name: network-config
generator: cloud-init
variants:
- cloud
- name: user-data
generator: cloud-init
variants:
- cloud
- name: vendor-data
generator: cloud-init
variants:
- cloud
これらはcloud-init用のテンプレートファイルを作成します。実際に作成されるのは、lxd.
の中になります。
packages: パッケージのインストールと削除
packagesでは、
packages:
manager: apt
update: true
cleanup: true
sets:
- packages:
- fuse
- language-pack-en
- openssh-client
- vim
action: install
- packages:
- cloud-init
action: install
variants:
- cloud
- packages:
- os-prober
action: remove
types:
- vm
またmanagerによってdnfやyum、
上記の例だとaptを使って、
repositories:
- name: sources.list
url: |-
deb http://archive.ubuntu.com/ubuntu {{ image.release }} main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu {{ image.release }}-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu {{ image.release }}-security main restricted universe multiverse
architectures:
- amd64
- i386
さらにrepositoriesでパッケージリポジトリを設定できます。Ubuntuならsources.{{ image.
」image.
はUbuntuのリリースコード名が記述されることを期待しているわけです。
actions: イメージビルドの各処理の途中で実施するコマンド設定
actionsではイメージビルドの処理の途中でフック処理として任意のコマンドを実行できるようになっています。
actions:
- trigger: post-update
action: |-
#!/bin/sh
set -eux
# Create the ubuntu user account
getent group sudo >/dev/null 2>&1 || groupadd --system sudo
useradd --create-home -s /bin/bash -G sudo -U ubuntu
variants:
- default
- trigger: post-packages
action: |-
#!/bin/sh
set -eux
# Make sure the locale is built and functional
locale-gen en_US.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にフックするタイミングを記述し、
バージョン1.
post-unpack
:ダウンロード・作成したベースイメージを展開したあとに実施 post-update
:packages.
がupdate true
のときのみ、パッケージ情報を更新したあとに実施 post-packages
:packages
で記述したパッケージ関連の処理を実施したあとpost-files
:files
で記述されたファイルの変更処理を実施したあと
実際にフックが叩かれるのも上記の順番になります。
mappings: アーキテクチャー名のマッピング
mappingsにはCPUアーキテクチャー名のマッピングテーブルを記述します。CPUアーキテクチャー名はディストリビューションによって
mappings:
architecture_map: debian
architecture_
また、distrobuider側の名前: ディストリビューション側の名前
」
- i686:Intel x86 32bit/
IA-32 - x86_
64:Intel x86 64bit/ AMD64/ Intel 64 - armv7l:ARMv7 32bit
- aarch64:AAarch64 64bit
- ppc:PowerPC 32bit
- ppc64:PowerPC 64bit Big Endian
- ppc64le:PowerPC 64bt Little Endian
- s390x:S/
390 Big Endian - mips:MIPS 32bit
- mips64:MIPS 64bit
- riscv32:RISC-V 32bit
- riscv64:RISC-V 64bit
実際のところ個々のディストリビューションのサポートアーキテクチャーが上記に完全に一致するわけではありませんが、
ここまでいろいろ述べましたが、