Raspberry Pi 用のシンプルなブートローダーを書きたいと思っています。このブートローダーの主な目的は、リモートの場所にある Raspberry Pi を有効にして、カーネル パニックの結果としてデバイスを起動できなくするカーネル アップデートから回復することです。カーネルを更新する手順は次のようになります。
デフォルトの Linux カーネルは/boot/rpi-kernel.img
で、文字列 'rpi-kernel.img' が に書き込まれ/boot/default-kernel.txt
ます。の「cmdline=」にカーネル パラメータ「panic=10」が追加されました/boot/config.txt
。
- SSH 経由で Raspberry Pi に接続します。
/boot/rpi-kernel.img
にコピー/boot/rpi-kernel-fallback.img
- 空のファイルを作成
/boot/kernel_update
- カーネル アップデートをダウンロードし、次の場所に移動します。
/boot/rpi-kernel.img
- リブート
これは、疑似コードで考えたブートローダーの設計です。
read kernel parameters passed from start.elf
if empty file '/boot/kernel_update' does not exists
boot kernel defined in '/boot/default-kernel.txt' with kernel parameters passed from start.elf
else
if empty file '/boot/boot_kernel_update' exists
write string 'rpi-kernel-fallback.img' to file '/boot/default-kernel.txt'
delete file '/boot/kernel_update'
delete file '/boot/boot_kernel_update'
create empty file '/boot/kernel_update_failed'
boot kernel 'rpi-kernel-fallback.img' with kernel parameters passed from start.elf
else
create empty file '/boot/boot_kernel_update'
boot kernel '/boot/rpi-kernel.img' with kernel parameters passed from start.elf
ブート プロセスの最後のステップとして、シェル スクリプトは が/boot/kernel_update
存在するかどうかを確認し、ネットワークが機能しており、環境が正常であるかどうかを確認してから、 を削除し/boot/kernel_update
ます。
HDMI、USB、イーサネット、シリアルなどをサポートせずに、ブートローダーをできるだけクリーンでシンプルにしたいと考えています。問題は、これを開始する方法がわからないことです。
主な課題は、SD カードの FAT32 ファイルシステムの読み取りと書き込み、および Linux カーネルの起動です。Raspberry Pi のベアメタルからすべてを実行する必要があります。
コード例、リソース、提案など。これを行うと非常に役立ちます。