先日、microSDカードにFedora 38 Serverをインストールしました。
こちらの環境を使用して。Raspberry Pi 4用のFedora CoreOS起動メディアの作成手順を記録させて頂こうと思います。
※23.6.24追記:/bootディレクトリの作成手順を見直しました。その結果、Raspberry Pi 3/4でFedora Linuxを起動し、Fedora CoreOSのブートメディアを安定して作れるようになりました。パーティション構成の変更にも対応しました。
目次
Raspberry Pi 4向けFedora CoreOS起動メディアの作成手順
コンテナ環境では作るのは難しい?
Fedora Linuxを直接起動するのではなく、Raspberry Pi OSのコンテナの中でFedora Linuxを起動してみました。
coreosのインストーラーは、ブロックデバイスにアクセスする必要があるのですが。コンテナからうまくアクセスできず、失敗した状況です。
コンテナの知識が豊富な方でしたら、うまく作れる可能性も御座います。
Raspberry Pi 3でもFedora Linuxは起動可能
aarch64版のFedora Linuxですが、どうもかなり多くのシングルボードコンピュータに対応している感じです。
Raspberry Pi 3で起動することも可能です。
シングルボードコンピュータについては、Fedora CoreOSはRaspberry Pi 4のみサポートしていますが。
インストーラーの作成は、他のシングルボードコンピュータでも可能だと思います。私は実際、Raspberry Pi 3でブートメディアを作成しています。
公式インストール手順は2通りの方法
公式ドキュメントはこちらになります。
U-Bootを使用する方法と、EDK2を使用する方法の2種類があるそうです。
ここでは、Fedora ServerをRaspberry Pi 4で起動して、CoreOS環境を作成しますが。Fedora Serverが起動した時点で、すでにU-bootが起動するように、Raspberry Pi 4を設定済みです。
こちらの記事の手順で、ブートローダーを更新することで。
ハードウェア設定上は、Fedora Serverと、Fedore CoreOSをU-bootで起動する準備ができている状態になります。
まずは、Fedora Serverを起動しましょう
メディア構築環境としてFedora Serverを起動
Fedora ServerはmicroSDカードにインストールしました。
インストール手順はこちらになります。
インストール後、最新版にOSを更新後、ルートパーティションを拡張しました。
こちらを使用して、USBストレージでFedora CoreOSが起動するように、起動メディアを作成する流れになります。
必要なツールのインストール
coreosのインストーラーのほか、JSON操作のためのjqをインストールしました。
sudo dnf install -y jq coreos-installer cpio
Ignitionファイルの準備
CoreOS初回起動時に使用するIgnitionファイルを作成しておく必要があります。
もしも起動するだけの最低限のIgnitionファイルを用意する場合は、CoreOSの管理ユーザ、coreのパスワードを設定するファイルが良さそうです。
Ignitionはjsonフォーマットの拡張子.ignファイルですが、直接作成するのは難しいため、yamlフォーマットの拡張子.bu Butaneファイルを作成した後、トランスパイルして作成します。
ユーザ設定 users.bu
ユーザ認証は、キーまたはパスワードのハッシュを作成しておき、設定ファイルに記載しておく感じです。
ハッシュの生成は次のコマンドになります。
podman run -ti --rm quay.io/coreos/mkpasswd --method=yescrypt
cat <<EOF | tee users.bu
variant: fcos
version: 1.5.0
passwd:
users:
- name: core
password_hash: <生成したパスワードのhash>
EOF
コマンドで生成したところ、ハッシュの部分が書き換わった気がしますが・・・テキストエディタでusers.buを開いて確認しておきましょう。
Butaneファイルをトランスパイル
作成したusers.buをトランスパイルしてみましょう。
butaneコマンドのエイリアスを作っておきました。
#エイリアスを作っておきます
alias butane='podman run --rm --interactive \
--security-opt label=disable \
--volume ${PWD}:/pwd --workdir /pwd \
quay.io/coreos/butane:release'
butane --pretty --strict users.bu > users.ign
最低限、こちらのignファイルでCoreOSを動かして、コンソールにログインすることが可能です。
ちなみにこちらでcoreユーザでコンソールにログインできますが、SSHは既定ではパスワード認証に対応していないそうです。SSHログインしたい場合は、パスワードハッシュではなくキーを作成するか、SSHでパスワードハッシュを有効にするignファイルを作成しておく必要があります。
他のIgnitionファイルの作成
そのSSHログイン時にパスワードハッシュを有効にする設定を含めて、初期設定の基本的なButaneファイルをこちらに記載してみました。
config.buはmergeとlocal:を使用しているため、トランスパイル時に-dオプションが必要のようです。
butane --pretty --strict -d . config.bu > config.ign
ここでは、先程の記事の内容から、config.ignというIgnitionファイルを作成しておきました。
複数のbuファイルをmergeでまとめた場合、圧縮されて入るのですね。このような内容ですが、うまく動くのでしょうか?(試してない⇒試しました!個別のignファイルを作ってmergeすれば正しく動きます
CoreOS用/bootディレクトリ生成
Ignitionファイルの準備ができたところで。
本格的に起動メディアを作成します。
下記のコマンドで、CoreOS用の/bootディレクトリを、/tmp/RPi4bootに作成します。
※23.6.24追記: 確実にrpmからRaspbery Pi 4のbootディレクトリを作成できるように、手順を修正しました
BOOTDIR=`pwd`/RPI4boot
mkdir -p $BOOTDIR/boot/efi/
RELEASE=37
sudo dnf install -y --downloadonly --installroot $BOOTDIR --release=$RELEASE --forcearch=aarch64 --destdir=$BOOTDIR uboot-images-armv8 bcm283x-firmware bcm283x-overlays
dnfオプションを調整し、rpmパッケージを指定したディレクトリにダウンロードしました。
続いてパッケージから必要なファイルを抽出します。
for rpm in $BOOTDIR/*rpm; do rpm2cpio $rpm | sudo cpio -idv -D $BOOTDIR/; done
sudo mv $BOOTDIR/usr/share/uboot/rpi_4/u-boot.bin $BOOTDIR/boot/efi/rpi4-u-boot.bin
sudo chmod -R go-xrwx $BOOTDIR/boot
以上でRaspberry Pi 4の実機でFedora CoreOSの起動に必要な、/bootの準備ができました。
USBストレージの取り付け
Fedora Linuxを起動したRaspberry Pi 3/4に、Fedora CoreOS起動用のUSBメディアを接続します。
パーティションは消去しておきました。
MBRではなくGPTでパーティションが構成されているため、fdiskコマンドではなくgdiskコマンドを使用しましょう。画面キャプチャはfdiskですが!
sudo wipefs -a /dev/sda
# パーティションをすべて消去
sudo gdisk -l /dev/sda
Fedora CoreOSのインストール
取り付けたUSBメディアに、coreOSをインストールしますが。
先程作成した、Ignitionファイルのファイル名を控えておいてください。下記のコマンドでは、「config.ign」になっておりますので、必要があれば変更しておいてください。
下記のコマンドになります。
FCOSDISK=/dev/sda
STREAM=stable # or `next` or `testing`
sudo coreos-installer install -a aarch64 -s $STREAM -i config.ign $FCOSDISK
メタルイメージのダウンロードが開始され、終わると指定したUSBメディアにインストールされます。どうしても[究極]に目が行って気になってしまいます。
ダウンロードしてからインストールしたい場合
クラスタ用途等、大量にブートメディアを作成する場合はこちらを。xzファイル名は適宜変更してください。
coreos-installer download -a aarch64 -s stable
sudo wipefs -a /dev/sda
FCOSDISK=/dev/sda
sudo coreos-installer install --ignition-file config.ign --image-file ./fedora-coreos-38.20230527.3.0-metal.aarch64.raw.xz -- $FCOSDISK
/efiディレクトリのコピー
最後に、作成したメディアを一時的に/tmp/FCOSEFIpartディレクトリにマウントして、/efiディレクトリにコピーします。
※23.6.24追記:先程設定した$BOOTDIRを使用します。
FCOSEFIPARTITION=$(lsblk $FCOSDISK -J -oLABEL,PATH | jq -r '.blockdevices[] | select(.label == "EFI-SYSTEM")'.path)
mkdir /tmp/FCOSEFIpart
sudo systemctl daemon-reload
sudo mount $FCOSEFIPARTITION /tmp/FCOSEFIpart
sudo rsync -avh --ignore-existing $BOOTDIR/boot/efi/ /tmp/FCOSEFIpart/
sudo umount /tmp/FCOSEFIpart
以上で完了です。USBストレージにて、Fedora CoreOSを起動する準備ができました。
Raspberry Piの電源を切り、microSDカードを取り外して、USBメディアから起動しましょう。
起動しましたでしょうか?
バージョンは38.20230514.3.0、先程のButaneファイルを使用して、正しくSSHでパスワードログインできるようになりました。
手順の最後。/efiディレクトリのコピーは、Raspberry pi 4の/boot/efiを使用したため、そもそも/tmp/RPi4boot/boot/efi/を作る意味がなかった・・・のは置いておいて。
※23.6.24追記:Fedora Linux起動時の/bootディレクトリを使用せずに、/boot/efiディレクトリをrpmファイルから作成できる手順に変更しました。
もしも起動してcoreユーザでログインできるようでしたら、基本的な流れの部分はOKかと思います。
CoreOSを使用するにあたって、大切なのはIgnitionの作成かと思います。
私の作成した、複数のbuファイルをmergeを使用した、config.buですが。
- buファイルをmergeすると、うまく動かない。
- 個別にignファイルをトランスパイルで作成しておいて、config.buの中でignファイルをmergeすれば、正しく動きました。
いろいろと試して手順を調整した結果、ブートメディアを安定して作れるようになりました。
ご興味が御座いましたら、よろしければ、Raspberry Pi 4でFedora CoreOSを起動してみてください!