前回ラズパイでu-bootを動作させた。
今回はさらにu-bootからlinuxを起動する。
初めに
u-bootまで起動しているのでラスパイ特有の手順はほぼない。
せっかくu-bootを使用するので、linux kernelはFIT imageの形式にしたものを使用する。
FIT imageについては以下を参照。
Flattened Image Tree (FIT) Format — Das U-Boot unknown version documentation
作るもの
以下の内容になるように作成する。
実施環境
- ビルド環境
windows11のwslでubuntu24.04を使用してビルドなどを行い、sdカードの操作はwindows側で行った。 - 実機
ラズパイ4B - 対象バージョン
ラズパイOSの公式イメージ「2024-03-15-raspios-bookworm-arm64-lite.img.xz」と同等。
手順
以下の資材を準備していく。
資材 | 説明 | 取得元/作成方法 |
---|---|---|
FITImage | linux kernelとdevice treeを含んだイメージ | 自前で作成する |
boot.scr | u-boot用のスクリプトファイル | 自前で作成する |
sdカード | u-bootを起動できるように準備したものにlinuxを起動する設定を加える | 前回の記事のものを流用 |
linux kernelをビルドする
wget https://github.com/raspberrypi/linux/archive/refs/tags/stable_20240423.tar.gz tar xf stable_20240423.tar.gz cd linux-stable_20240423 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig make -j`nproc` ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
FIT imageを作成する
linux-stable_20240423/arch/arm64/boot/
ディレクトリに移動し、kernel.itsというファイルを作成する。cd arch/arm64/boot/ touch kernel.its
kernel.itsを以下の内容に編集する。
/dts-v1/; / { description = "fitImage for raspberrypi"; #address-cells = <1>; images { kernel { description = "Linux kernel"; data = /incbin/("./Image.gz"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "gzip"; load = <0x40480000>; entry = <0x40480000>; }; fdt { description = "Flattened devicetree blob"; data = /incbin/("./dts/broadcom/bcm2711-rpi-4-b.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; }; }; configurations { default = "config-1"; config-1 { description = "kernel with fdt configuration"; kernel = "kernel"; fdt = "fdt"; }; }; };
以下のコマンドでビルドする。mkimageコマンドがない場合はインストールすること。
mkimage -f kernel.its FITImage
FITImageが作成される。boot.scrを作成する
前回のu-bootの資材を使用する。u-bootをビルドしたディレクトリに移動し、boot_cmd.txtを以下の内容で作成する。
fatload mmc 0:1 ${loadaddr} FITImage setenv bootargs "console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rw rootwait" bootm
以下のコマンドでboot.scrを作成する。
tools/mkimage -A arm64 -O linux -T script -C none -d boot_cmd.txt boot.scr
カレントディレクトリにboot.scrが作成されていることを確認できる。
sdカードを作成する
u-bootが起動するsdカードの第一パーティションにFITImageとboot.scrを格納する。起動する
sdカードをラズパイにさして電源を入れる。
u-bootのメッセージが表示された後に、linuxが起動することを確認できる。
さらにラズパイ実機上でmountコマンドを実行すると、sdカードの第2パーティションがマウントされている様子を見れる。[!NOTE]
rootfsはラズパイOS公式のもののままなので、kernel moduleなどがうまく動いていないと思うが、それは動きとしては正常である。
この段階でkernel moduleを使用したい場合は、rootfsにlinux kernelをビルドした際に、make modules_install
でkernel moduleをインストールしておく必要がある。以下などが参考になる。
https://qiita.com/tetsu_koba/items/92f22fc6a302f0f66fe7
今回はu-bootからFIT形式にしたlinuxを起動できるかを確認したかっただけなので、この手順は省略した。
終わりに
ラズパイ上でu-bootからlinuxを起動できることを確認した。
次回はFIT imageにinitramfsも含めてlinuxを起動してみる。