背景と解決する課題
サーバークラスターの運用が半年も経過すると、構成の不一致(Configuration Drift)が発生しがちです。Ansibleスクリプトがあるノードでは成功しても、ベースパッケージの差異によって別のノードで失敗することがあります。Image-based OS(イメージベースOS)モデルは、OS全体を単一のアーティファクトとして固定(イミュータブル化)することで、この課題を根本から解決します。
従来、PackerやImage Builderによるイメージ作成は処理が重く煩雑でした。bootc(Bootable Containers)は、使い慣れたコンテナの概念をOSレイヤーへと持ち込みます。Containerfileを記述し、podman buildでビルドしてGHCRやQuay.ioにプッシュするだけで、サーバーはそのイメージをプルしてカーネルに直接ロードし、ベアメタルや仮想マシンを起動できます。
この仕組みにより、OSは明確なタグ(例: v1.0.4)が付与されたイミュータブル(不変)イメージとして動作します。アップデートでカーネル障害が発生した場合でも、1回のリブートだけで直前の状態にロールバック可能です。
環境の準備
作業には、Podmanがインストール済みのFedora WorkstationまたはFedora Serverが必要です。
1. bootcのインストール
# bootc CLIのインストール
sudo dnf install -y podman bootc
# バージョンの確認
bootc --version
2. イメージビルダーの取得
コンテナイメージを仮想ディスク(.qcow2、.raw、.amiなど)に変換するために、bootc-image-builderを使用します。
# 公式ビルダーイメージのプル
podman pull quay.io/centos-bootc/bootc-image-builder:latest
詳細な設定手順
1. OSを定義するContainerfileの作成
プロジェクトディレクトリを作成し、Containerfileを用意します。Fedora bootcのベースイメージを使用し、管理ツールのインストール、ユーザー設定、SSHの有効化を行います。
FROM quay.io/fedora/fedora-bootc:40
# 必要なパッケージを単一レイヤーでインストール
RUN dnf -y install \
tmux \
htop \
neovim \
curl \
git \
openssh-server \
&& dnf clean all
# 起動時にSSHサービスを有効化
RUN systemctl enable sshd
# 管理者ユーザーの作成とsudo権限の付与
RUN useradd -m -G wheel -s /bin/bash sysadmin && \
echo 'sysadmin:AdminSecret123!' | chpasswd && \
echo "%wheel ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/wheel-nopasswd
# ユーザーのSSH公開鍵を設定
RUN mkdir -p /home/sysadmin/.ssh && \
chmod 700 /home/sysadmin/.ssh && \
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... user@workstation" > /home/sysadmin/.ssh/authorized_keys && \
chmod 600 /home/sysadmin/.ssh/authorized_keys && \
chown -R sysadmin:sysadmin /home/sysadmin/.ssh
2. OSコンテナイメージのビルド
ビルド手順は一般的なWebアプリケーションのコンテナビルドと同様です。
podman build -t quay.io/myrepo/fedora-custom-os:v1.0 .
3. KVM / Proxmox用QCOW2仮想ディスクの出力
ビルダーコンテナを実行し、先ほどビルドしたイメージから仮想ディスクファイルを生成します。
mkdir -p ./output
sudo podman run \
--rm \
--privileged \
--security-opt label=type:unconfined_t \
-v ./output:/output \
-v /var/lib/containers/storage:/var/lib/containers/storage \
quay.io/centos-bootc/bootc-image-builder:latest \
--type qcow2 \
--local \
quay.io/myrepo/fedora-custom-os:v1.0
ディスクの出力処理には2〜3分程度かかります。完了すると ./output/qcow2/disk.qcow2(サイズ約2.2GB〜2.5GB)が生成され、Proxmoxやvirt-managerにインポートしてVMを起動できる状態になります。
イメージ設計における実践的なプラクティス
- パーティション設計:
/usrパーティションは読み取り専用(read-only)でロックされます。設定ファイルを保持する/etcおよびログ、データベース、コンテナボリュームを保持する/varのみが書き込み可能です。 - イメージサイズの最適化:
dnf installコマンドをまとめ、同一レイヤー内で必ずdnf clean allを実行してイメージ肥大化を防ぎます。 - ビルドステージの分離: マルチステージビルドを活用し、最初のステージでGoやRustのバイナリをコンパイルした後、クリーンなバイナリのみをbootcベースイメージにコピーします。
運用とモニタリング
1. デプロイ状態の確認
bootcサーバーにSSHログインし、状態確認コマンドを実行します。
sudo bootc status
現在実行中のイメージ(staged/booted)、SHA256ダイジェスト、連携先のリモートレジストリが表示されます。
2. OSのインプレースアップグレード
Containerfileを修正して新しいタグ v1.1 をレジストリにプッシュした後は、わずか2つのコマンドでOSをアップデートできます。
# 新しいビルドをステージング領域にダウンロード
sudo bootc upgrade
# 新しいOSを読み込むために再起動
sudo systemctl reboot
別のベースイメージ(標準イメージからNVIDIAドライバ導入済みイメージなど)へ切り替える場合は次のように実行します。
sudo bootc switch quay.io/myrepo/fedora-nvidia-os:latest
sudo systemctl reboot
3. トラブル時のロールバック
アップデート後にカーネルパニックやネットワークサービスのクラッシュが発生した場合は、即座に変更を取り消すことができます。
# 直前のデプロイ状態へロールバック
sudo bootc rollback
sudo systemctl reboot
サーバーのネットワークが不通になった場合でも、起動時のGRUBメニューから以前のカーネルエントリを直接選択して起動できます。
4. アップデートの自動確認
標準で用意されているsystemd timerを有効化することで、定期的に新しいイメージを自動チェックできます。
sudo systemctl enable --now bootc-fetch.timer
sudo systemctl list-timers | grep bootc
Timerはバックグラウンドで新しいレイヤーを静かにディスクへプルします。稼働中のサービスを中断させることなく、次回のリブート時にアップデートが適用されます。

