Fedoraで始めるbootc入門:Bootable Container形式のOS構築とデプロイガイド

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

背景と解決する課題

サーバークラスターの運用が半年も経過すると、構成の不一致(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はバックグラウンドで新しいレイヤーを静かにディスクへプルします。稼働中のサービスを中断させることなく、次回のリブート時にアップデートが適用されます。

Share: