先日、Raspberry Pi 4でFedora 28 Serverを起動しまして。
Raspberry Pi 4でFedora CoreOSを起動するためのUSBメディアを作成してみました。
これから、Raspberry Pi 4のFedora CoreOSでクラスタを作ろうと思うのですが。構築の初期設定は、Ansibleを使用したいと考えています。
その場合、Pi 4はマネージド・ノード(指令を受ける側)となり、別途コントロール・ノード(指令を出す側)のマシンが必要になります。
そのような理由から。(Pi 4ではない)少し暇そうなPi 3くんで64ビット版のRaspberry Pi OSを動かして、Fedora Core OSのブートメディアの作成ができないかどうか、試したいと思います。
目次
プロビジョニングのコントロール・ノードとしてRaspberry Pi OS(64ビット)を選択
冒頭に記載しましたように。Ansibleでマシンのプロビジョニング(初期設定)を行うための、司令塔であるコントロール・ノードの構築をメインとしています。
OSは、Raspberry Pi OS Lite(64ビット)を選びたいと思います。
Raspberry Pi OS Lite(64-bit)は、Raspberry Pi3/4/400が対象になります。
32ビット版は、後述のFedora環境が動かないため、選択できません。64ビット版が動作する対象PCが必要になります。
やりたいことですが。
- Fedora Core OSでAnsibleを動かすための初期設定Ignitionファイルを作成する
- Fedora Core OSのブートメディアを作成する
- Raspberry Pi 4でFedora CoreOSを起動して、Ansibleで設定可能な状態にする
- Raspberry Pi OSから、Ansibleで指令を出してプロビジョニングする
このうちの、1,2番と4番を行うことが目的となります。
まあ、おうちのすべてのPi 4をかき集めて、クラスタを作成。Pi 4は出払ってしまったため、その他のマシンでコントロール環境を作ったほうが良さそう。という極めて個人的な判断が理由です。
Raspberry Pi OS Lite(64ビット)内でFedora Linuxが起動するか確認
まずは、こちらの手順でFedora Linuxが動作することを確認しておきます。
実は、アーキテクチャaarch64のほか、x86_64もサポートされています。Windows版のPodman環境でも、Raspberry Pi 4用のブートメディアは作れそうです。(後述のとおりそれは・・・
Fedoraが動いたところで。Fedora CoreOS環境の構築に取り掛かりましょう。
コンテナ環境を使用したFedora CoreOSブートメディア作成手順
作業用ディレクトリ作成
あとでコンテナでの作業と共用できるように、coreosディレクトリを作成しておきました。
mkdir coreos
こちらのディレクトリに、Butaneファイルを作成し、Ignitionファイルにトランスパイルしたいと思います。
作成するButaneファイル
今回、Ansibleのマネージド・ノードとしてFedora CoreOSを使用したいと考えています。このため、ホスト名やネットワーク、タイムゾーンの設定のほかに、Ignitionで次の2つも行いたいと思います。
- IPv4フォワーディング有効化
- Pythonのインストール
マシンの台数が多いと、手動で行う手間も大きくなるため、なるべくIgnitionで自動化しておくと、手間が大幅に減るというわけです。
Fedora CoreOSでPythonをインストールする手順は確認済みです。
Ignitionの中で、systemdを使用して、rpm-ostreeコマンドでpythonをインストールする作戦になります。
またクラスタ構築を目的とするため、swapは作りません。
以上から、作成するbuファイルは9個になる予定です。
最低限でFedora CoreOSを起動して様子を見たい、という場合は、users.ignファイル1つを作成し、config.ignファイルとして扱えばOKです。
cat <<EOF |tee config.bu
variant: fcos
version: 1.5.0
ignition:
config:
merge:
- local: users.ign
- local: network.ign
- local: hostname.ign
- local: timezone.ign
- local: keyboard.ign
- local: enable-passwords.ign
- local: sysctl.ign
- local: rpm-ostree-python.ign
EOF
- config.bu
- メインの設定ファイル
- 8つのignファイルをマージ
- users.bu
- coreユーザのsshキー/パスワードハッシュ設定
- network.bu
- ネットワーク設定
- hostname.bu
- ホスト名設定
- timezone.bu
- タイムゾーン設定
- keyboard.bu
- 日本語キーボード
- enable-passwords.bu
- パスワード認証でSSHログイン可能に設定
- sysctl.bu
- IPv4フォワーディング有効
- rpm-ostree-python.bu
- pythonの自動インストール
各buファイルの作成手順はこちらになります。
実際にcoreosブートメディア作成に使用するのは、config.ignファイルになります。
今回の作り方では、mergeを使用したため、config.ignファイルの中に、他のignファイルが埋め込まれているかたちになりました。
ignファイルの準備ができたところで。Fedora CoreOS書き込み予定のUSBメディアを消去しておきます。
USBストレージのワイプ
Raspberry Pi 4でFedora CoreOSを起動する場合、microSDカードまたはUSBストレージから起動が可能です。
microSDカードは、使い方によっては半年程度で壊れる事がわかっています。長期間使用したい場合は向いていません。
よって、今回はUSB3.0に対応した、USBメモリーを使用したいと思います。容量は128GBです。
wipefsコマンドを使用する場合は、対象が正しいデバイスかどうか、十分に確認しましょう。消去したいストレージのみ、1つだけUSB端子にあることを、必ず確認しましょう。
sudo wipefs -a /dev/sda
sudo fdisk -l /dev/sda
消去が完了しましたら、いよいよブートメディアの作成に入ります。
Fedora Linuxコンテナにログイン
コンテナ内でFedora Linuxを起動、そちらでブートメディアを作成しますが。
コンテナから/dev/sdaにアクセスする必要があるため、sudoと–privilegedオプション付きでpodmanを起動します。
cd
sudo podman run -it --privileged -v ./coreos:/root/coreos quay.io/fedora/fedora:38 bash
先程作成したconfig.ignファイルを使用しつつ。/dev/sdaに書き込んでゆく感じです。
必要なパッケージのインストール
コンテナ内で、必要なツールをインストールします。
sudo dnf install -y jq coreos-installer copi
メモリー容量1GBのPi3でコンテナを動かしている 影響でしょうか。少し動作は遅いですが。インストールは問題なさそうです。
コンテナを終了すると、インストールしたツールは消えますのでご注意を。消えないようにするには、コンテナをデーモンとして起動し、execでシェル接続する必要があります。(ここでは保留
Raspberry Pi 4 CoreOS起動用/bootディレクトリ作成
作業用の/bootディレクトリは、coreosディレクトリ内に作成しておこうと思います。
RELEASE=37
cd ~/coreos
mkdir -p ~/coreos/boot/efi/
sudo dnf install -y --downloadonly --release=$RELEASE --forcearch=aarch64 --destdir=/root/coreos/boot/ uboot-images-armv8 bcm283x-firmware bcm283x-overlays
Raspberry Pi 4をu-bootで起動するためのrpmパッケージをダウンロードしました。
正常にダウンロードできたようです。これらを展開します。
for rpm in /root/coreos/boot/*rpm; do rpm2cpio $rpm | sudo cpio -idv -D /root/coreos/boot/; done
sudo mv /root/coreos/boot/usr/share/uboot/rpi_4/u-boot.bin /root/coreos/boot/boot/efi/rpi4-u-boot.bin
このような感じで、/bootディレクトリが構築できました。
Fedora CoreOSのインストール
coreos-installerコマンドで、/dev/sdaにブートイメージを書き込みます。
FCOSDISK=/dev/sda
STREAM=stable # or `next` or `testing`
cd ~/coreos
sudo coreos-installer install -a aarch64 -s $STREAM -i config.ign $FCOSDISK
コンテナでFedora Linuxを動かしているということで。これが最大の難関になります。うまく行くでしょうか?
Error!
udevの問題でしょうか。
podmanはsudoと–privilegedオプション付きで起動しているため、デバイスのアクセスは問題がありませんが。group関係の設定が不足しているのかもしれません。
ちなみに、–privilegedなしで、–deviceオプションを付けた場合は、このようなエラーになります。
ループバックデバイスに書き込めるか試してみました
コンテナ内から、/dev/sdaのアクセスがうまくゆかないため。
次の2パターンを試してみました。
- ホスト側(Raspberry Pi OS)でループバックデバイスを作成し、コンテナから書き込み
- コンテナ内部でループバックデバイスを作成
coreosディレクトリに、4GB程度の空のイメージを作成しました。
cd coreos
fallocate -l 4G coreos.img
sudo losetup -P /dev/loop0 coreos.img
作成したイメージを、ホスト側でマウントしてから、podmanからアクセスします。
ホスト側で/dev/loop0を作成した場合
Podmanは次のパターンで起動しました。
# sudoと--privilegedオプションつき
sudo podman run -it --privileged -v ./coreos:/root/coreos quay.io/fedora/fedora:38 bash
# sudoなしで--deviceオプション付き
podman run -it --device=/dev/loop0 -v ./coreos:/root/coreos quay.io/fedora/fedora:38 bash
この場合、どちらもコンテナ内から、/dev/loop0と/dev/sdaの両方にアクセス可能です。
しかし。coreos-installerで失敗します。
コンテナ内で/dev/loop0を作成した場合
sudoと–privilegedオプション付きでコンテナを起動後。
util-linux-coreをインストールして、losetupコマンドを使用できるようにしました。
dnf install -y util-linux-core losetup --show --find coreos/coreos.img # FCOSDISK=/dev/loop0 STREAM=stable # or `next` or `testing` cd ~/coreos sudo coreos-installer install -a aarch64 -s $STREAM -i config.ign $FCOSDISK
画面キャプチャは省略しますが、エラーでダメでした。
/bootディレクトリの書き込みは断念
もしも正常に/dev/sdaにブートイメージを書き込めた場合は。先程作成した、/bootの内容をrsyncでコピーして、メディア作成は完了になります。
FCOSEFIPARTITION=$(lsblk $FCOSDISK -J -oLABEL,PATH | jq -r '.blockdevices[] | select(.label == "EFI-SYSTEM")'.path)
mkdir /tmp/FCOSEFIpart
sudo mount $FCOSEFIPARTITION /tmp/FCOSEFIpart
# rsyncで/bootをコピー
sudo rsync -avh --ignore-existing /tmp/RPi4boot/boot/efi/ /tmp/FCOSEFIpart/
sudo umount $FCOSEFIPARTITION
残念。
なんだか、最後の方は、画面キャプチャがありませんが。
結局は失敗に終わった、ということです。(失望の画面キャプチャなし
coreos-installerから、ブロックデバイス(/dev/sdaや/dev/loop0等)にアクセスする必要があるのですが。
コンテナ内で動かしている都合から、udevの制御がうまくゆかず、アクセスに失敗している状況でした。
このあたりは、コンテナが苦手とするところのため、仕方がない感じもします。
とはいえ、Ansibleを使用するための環境と、Ignitionファイルは作成できてますので、あとはコンテナではないFedora Linuxを起動して、core-os-installerでメディアを作成できそうです。
供給が安定してきました、Raspberry Pi 4を買い足して、そちらでFedora Linuxを動かして、Ansibleのコントロールノードにする方法が、いちばん無難かもしれません。