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

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

https://denor.jp/raspberry-pi-4%E3%81%A7fedora-38-server%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F

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

https://denor.jp/raspberry-pi-4%E5%90%91%E3%81%91fedora-coreos%E8%B5%B7%E5%8B%95%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E3%81%AE%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86%E8%A6%9A%E6%9B%B8

これから、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が動作することを確認しておきます。

https://denor.jp/64%e3%83%93%e3%83%83%e3%83%88%e7%89%88raspberry-pi-os%e3%81%a7%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e5%86%85%e3%81%a7fedora-linux%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%e3%81%ab%e3%81%af

実は、アーキテクチャ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をインストールする手順は確認済みです。

https://denor.jp/fedora-coreos%E3%81%ABpython%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF

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ファイルの作成手順はこちらになります。

https://denor.jp/fedora-coreos%e7%94%a8%e3%81%aebutane%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e8%a6%9a%e6%9b%b8

実際に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のコントロールノードにする方法が、いちばん無難かもしれません。[amazonjs asin=”B089GSG8Y1″ locale=”JP” title=”ラズベリーパイ 4 コンピューターモデルB 8GB Raspberry Pi 4 ラズパイ 4 TELEC認定取得済み (Raspberry Pi 4 8GB)”]

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です