Raspberry Pi OSでFedora CoreOSブートメディアの作成に挑戦しましたが

先日、Raspberry Pi 4でFedora 28 Serverを起動しまして。

Raspberry Pi 4でFedora 38 Serverを起動してみました
Raspberry Pi 4でFedora 38 Serverを起動してみました。 初期設定の基本的な部分は、前回のこちらの記事と同じ...

Raspberry Pi 4でFedora CoreOSを起動するためのUSBメディアを作成してみました。

Raspberry Pi 4向けFedora CoreOS起動メディアの作成手順覚書
先日、microSDカードにFedora 38 Serverをインストールしました。 こちらの環境を使用して。Raspberr...

これから、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が必要になります。

やりたいことですが。

  1. Fedora Core OSでAnsibleを動かすための初期設定Ignitionファイルを作成する
  2. Fedora Core OSのブートメディアを作成する
  3. Raspberry Pi 4でFedora CoreOSを起動して、Ansibleで設定可能な状態にする
  4. Raspberry Pi OSから、Ansibleで指令を出してプロビジョニングする

このうちの、1,2番と4番を行うことが目的となります。

まあ、おうちのすべてのPi 4をかき集めて、クラスタを作成。Pi 4は出払ってしまったため、その他のマシンでコントロール環境を作ったほうが良さそう。という極めて個人的な判断が理由です。


Raspberry Pi OS Lite(64ビット)内でFedora Linuxが起動するか確認

まずは、こちらの手順でFedora Linuxが動作することを確認しておきます。

64ビット版Raspberry Pi OSでコンテナ内でFedora Linuxを動かすには
先日、Raspberry Pi 4でFedora 28 Serverを起動しました。 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つも行いたいと思います。

  1. IPv4フォワーディング有効化
  2. Pythonのインストール

マシンの台数が多いと、手動で行う手間も大きくなるため、なるべくIgnitionで自動化しておくと、手間が大幅に減るというわけです。

Fedora CoreOSでPythonをインストールする手順は確認済みです。

Fedora CoreOSにPythonをインストールするには
23.6.11現在。 CoreOSのバージョンは、38.20230514.3.0 Pythonは標準で3.11.3がインストール...

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
  1. config.bu
    • メインの設定ファイル
    • 8つのignファイルをマージ
  2. users.bu
    • coreユーザのsshキー/パスワードハッシュ設定
  3. network.bu
    • ネットワーク設定
  4. hostname.bu
    • ホスト名設定
  5. timezone.bu
    • タイムゾーン設定
  6. keyboard.bu
    • 日本語キーボード
  7. enable-passwords.bu
    • パスワード認証でSSHログイン可能に設定
  8. sysctl.bu
    • IPv4フォワーディング有効
  9. rpm-ostree-python.bu
    • pythonの自動インストール

各buファイルの作成手順はこちらになります。

Fedora CoreOS用のButane初期設定ファイル覚書
先日、Raspberry Pi 4でFedora CoreOSを起動してみました。 CoreOSはMobyエンジンを搭載してお...

実際に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パターンを試してみました。

  1. ホスト側(Raspberry Pi OS)でループバックデバイスを作成し、コンテナから書き込み
  2. コンテナ内部でループバックデバイスを作成

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のコントロールノードにする方法が、いちばん無難かもしれません。

スポンサーリンク

フォローする

スポンサーリンク