Raspberry PiでNetworkブートする場合,ブートローダーにU-Bootを使用する方法がある。
U-Bootをソースコードからビルドする場合,Raspberry Piでセルフビルドすると時間がかなり掛かってしまうので,PCでクロスコンパイルしてみる。
Windowsマシン上でクロスコンパイラを使用しても,他のビルドツールの問題からかうまくビルド出来なかった。
なので,Ubuntuマシンで作業を行った。
U-Bootをビルドするためのクロスコンパイラ(GCC)はいくつかあるようだ。
パッケージでインストール出来るクロスコンパイラを使ってみた。
ARM用クロスコンパイラを以下のようにしてインストールした。
32bit ARM用のコンパイラの場合は,
$ sudo apt install g++-arm-linux-gnueabi device-tree-compiler u-boot-tools
のようにしてインストール。
64bit ARM用コンパイラの場合は,
$ sudo apt install g++-aarch64-linux-gnu device-tree-compiler u-boot-tools
のようにしてインストール。
両方インストールしても切り替えて使用できる。
インストール出来ているかの確認。(32bitコンパイラの場合)
$ arm-linux-gnueabi-gcc --version
として,バージョン表示されればインストールは出来ている。
ソースコードを取得する。
$ mkdir ~/rpi $ cd ~/rpi $ git clone git://github.com/swarren/u-boot.git(本家の場合:git clone git://git.denx.de/u-boot.git) $ cd ~/rpi/u-boot
環境変数CROSS_COMPILEをセットする。
$ export CROSS_COMPILE="arm-linux-gnueabi-" (32bit u-boot作成の場合) or $ export CROSS_COMPILE="aarch64-linux-gnu-" (64bit u-boot作成の場合)
それと,
export USE_PRIVATE_LIBGCC=yes
をセットしておく。これしないと,U-BootがRaspberry Piで動かない。
Raspberry Pi用のU-Bootをビルドする場合,makeにモデルを指定してビルドするようにする。
Raspberry Pi,zero用をビルドする場合は,
$ make clean $ make distclean $ make rpi_defconfig $ make all
とすると,Raspberry Pi,zero用のu-boot.binが作成される。
Raspberry Pi2用をビルドする場合は,
$ make clean $ make distclean $ make rpi_2_defconfig $ make all
とすると,Raspberry Pi2用のu-boot.binが作成される。
Raspberry Pi3用をビルドする場合は,
$ make clean $ make distclean $ make rpi_3_32b_defconfig $ make all
とすると,Raspberry Pi3用のu-boot.binが作成される。
この時指定する機種は,configsフォルダに定義ファイルが準備してある。Raspberry Piシリーズだと以下のようなファイルがあった。
作成したU-Bootを使って,デフォルトのブートローダーの代わりに使ってみます。(SDカードのカーネルとルートファイルシステムを使う)
使用しているRaspbianが入ったSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。
/boot/config.txtで,u-boot.binを使うように変更します。
kernel=u-boot.bin
これでリブートすると,U-Bootがブートローダーとして起動するようになる。
U-Bootで起動した後,コマンドを自動実行するスクリプトファイルを作成します。
boot.txtを作成する。
mmc dev 0 setenv bootargs "earlyprintk console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait" fatload mmc 0:1 ${kernel_addr_r} kernel.img fatload mmc 0:1 ${fdt_addr_r} bcm2708-rpi-b.dtb bootz ${kernel_addr_r} - ${fdt_addr_r}
boot.txtをU-Bootが認識できるファイルに変換します。
これには,mkimageコマンドを使います。(U-Bootをビルドした時にも,このコマンドもビルドされている。)
$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "SD Boot" -d boot.txt boot.scr.uimg
boot.scr.uimgが作成されます。 作成されたboot.scr.uimgをSDカードの/bootにコピーする。
これで,Raspberry PiをリブートするとU-Bootを使ってRaspbianが起動するようになる。
新しくコメントをつける