最終更新:

stub — VM 用マルチディストリビューションインストーラ兼 kexec ブートローダー

GitHub: genpack-artifacts/stub

概要

stub は genpack ツールチェーンで構築されるアーティファクトの一つで、他の Linux ディストリビューションを QEMU/KVM 仮想マシン上にインストールするための使い捨てブート環境です。

genpack イメージとして動作しつつも、最終的な目的は genpack 以外の OS を立ち上げることにあります。初回起動時はインストーラとして、2 回目以降は kexec を使ったブートローダーとして振る舞う、二段階構成のプロビジョニングツールです。

使い方

vm コマンドと組み合わせて使用します。

# 1. データ用仮想ディスクを作成 (8GiB)
vm allocate debian12.img 8

# 2. stub をシステムイメージ、debian12.img をデータディスクとして VM 起動
vm run -d debian12.img stub-$(uname -m).squashfs

# 3. VM 内で自動ログイン後、目的のディストリビューションのスクリプトを実行
./debian12.sh

# 4. インストール完了後に reboot → 以降は Debian 12 が直接起動する

動作の流れ

対応ディストリビューション

Debian / Ubuntu 系 (debootstrap 使用)

スクリプトディストリビューション
debian12.shDebian 12 (Bookworm)
debian13.shDebian 13 (Trixie)
ubuntu2004.shUbuntu 20.04 (Focal)
ubuntu2204.shUbuntu 22.04 (Jammy)
ubuntu2404.shUbuntu 24.04 (Noble)
ubuntu2604.shUbuntu 26.04 (Resolute)

RHEL / RPM 系 (rpmbootstrap 使用)

スクリプトディストリビューション
centos6.shCentOS 6
centos7.shCentOS 7
centos8stream.shCentOS Stream 8
centos9stream.shCentOS Stream 9
centos10stream.shCentOS Stream 10
almalinux9.shAlmaLinux 9
rocky8.shRocky Linux 8
miraclelinux8.shMIRACLE LINUX 8
fedora42.shFedora 42

その他

スクリプトディストリビューション
gentoo.shGentoo Linux (stage3 tarball から構築)

主要コンポーネント

kexec ブートプラグイン (files/usr/lib/genpack-init/00kexec.py)

genpack-init のプラグインとして毎回起動時に実行される Python スクリプトです。データディスク (/dev/vdb) または virtiofs 上にインストール済み OS のカーネルと initramfs が存在するかを検出し、見つかった場合は kexec でそのカーネルをロードして遷移します。

これにより、stub は初回のインストール作業後は透過的なブートローダーとして機能し、VM の起動フローは以下のようになります:

QEMU 起動 stub カーネル genpack-init kexec インストール済み OS カーネル OS 起動

ディストリビューションインストールスクリプト (files/root/*.sh)

各スクリプトは以下の共通パターンに従います:

  1. systemd-networkd-wait-online でネットワーク接続を待機
  2. データディスクにファイルシステムを作成 (XFS / Btrfs)
  3. debootstrap または rpmbootstrap でベースシステムをブートストラップ
  4. ホスト名、ネットワーク、SSH、タイムゾーンを設定
  5. SSH 公開鍵、LLMNRD (Link-Local Name Resolution)、QEMU ゲストエージェントを配置
  6. dracut で initramfs を生成 (virtiofs / 暗号化サポート含む)
  7. reboot

インストール直後から SSH によるリモート管理が可能な状態になります。

自動ログイン (files/build.d/autologin.sh)

hvc0 (virtio コンソール) と ttyS0 (シリアルコンソール) の両方で root の自動ログインを設定します。vm console でコンソール接続すると、ログインプロンプトなしで即座にシェルが使えます。

LLMNRD (files/build.d/build-llmnrd.sh)

Link-Local Multicast Name Resolution Daemon をソースからスタティックビルドします。インストール先の OS に配置され、DNS サーバーなしでのホスト名解決を可能にします。

含まれるパッケージ

パッケージ用途
genpack/paravirt準仮想化カーネルとベースシステム
sys-kernel/gentoo-kernelソースからビルドされた最小カーネル
sys-apps/kexec-toolsOS カーネルへの遷移に使用
dev-util/debootstrapDebian / Ubuntu 系のブートストラップ
dev-util/rpmbootstrapRPM 系のブートストラップ
sys-fs/cryptsetupディスク暗号化サポート
sys-devel/binutilsバイナリユーティリティ

カーネル最小化

stub は使い捨てのブート環境であり広範なハードウェアサポートが不要なため、kernel/config.d/unset.config で 1,757 のカーネルオプションを無効化しています。

無効化される主な機能:

対応アーキテクチャ

アーキテクチャカーネル設定出力ファイル
x86_64unset.config のみstub-x86_64.squashfs
aarch64savedconfig + unset.configstub-aarch64.squashfs
riscv64savedconfig + unset.configstub-riscv64.squashfs

設計上の位置づけ

stub は genpack エコシステムの中では異色の存在です。genpack イメージとして構築・起動されますが、目的は genpack 以外の OS を立ち上げることにあります。genpack-init のプラグイン機構 (pybind11 + Python) と vm コマンドの仮想ディスク管理を活用し、QEMU/KVM 環境で多数の異なるディストリビューションの VM を共通の手順でプロビジョニングする統一的な環境を提供しています。

ソースリファレンス

このドキュメントは以下のリポジトリのスナップショットに基づいて作成されました:

更新履歴