BuildrootでSBC用Linuxシステムイメージを作る

ラズパイなどのメジャーでハイパワーなSBC(Single Board Computer)であればUbuntu CoreやArmbianなどパッケージ管理ツール付きディストリビューションを選べるが、マイナーだったりメモリやプロセッサが貧弱なSBCの場合はBuildrootを使ってシステムイメージを作るのが簡単。

BuildrootでLinuxシステムイメージ作る手順を備忘録も兼ねてまとめる。

Buildroot Logo
スポンサーリンク

Buildrootでシステムイメージを作る3つのステップ

Buildrootでシステムイメージを作る手順は、ざっくり言えば以下の3ステップだ。

  1. make hogehoge_defconfig(“hogehoge”はSBCのボード名など)を実行して対象SBCのデフォルト設定を読み込む
  2. make menuconfigを実行してパッケージの追加や設定のカスタマイズをする
  3. makeを引数無しで実行してシステムイメージを作成

基本的に3.でmakeを実行した後はただ待ってれば良いのだが、この時実行される内容は以下のように非常に幅広く、結構な時間が掛かる。

  1. ツールチェーンのソースコードのダウンロードとビルド(以降のビルドはここで生成されたツールチェーンを利用)
  2. ターゲットシステムに配置されるパッケージのソースコードのダウンロードとビルド
  3. カーネル/ブートローダーのソースコードのダウンロードとビルド
  4. ルートファイルシステムのパーティション作成およびブートパーティションの作成
  5. ブートローダー設定とシステムイメージ生成

殆ど全てをソースコードからビルドするという力技な方法を採用していることもあって、大抵はトラブル無くシステムイメージの生成まで辿り着く。しかし、環境が汚れているとツールチェーンのビルドで躓くことがあり、Dockerなどの仮想環境を用意してクリーンなビルド環境で実行した方が失敗は少ない。

Buildrootの基本的な使い方

Buildrootを使ってシステムイメージを作成する基本的な手順は以下の通り。

ダウンロード

Buildrootは下記サイトでtarボールが配布されている。

Index of /downloads

安定版リリースは毎年2,5,8,11月の年4回(このうち2月のリリースはLong Term Support)。旧式のボードで古いカーネルにしか対応していないような場合(旧式の設定を引きずっているため最新環境で動かない時がある)でなければ、最新リリースで良いだろう。ダウンロードしたtarボールを展開し、展開先のディレクトリに移動しておく。

tar -xvzf buildroot-2022.05.tar.gz 
cd buildroot-2022.05

対象ボードのデフォルト設定を読み込む

tarボール展開先のconfigs/ディレクトリの下に、各種ボードの設定ファイル(*_defconfig)が置かれている。例えば、Lichee Pi Zero用のLinuxイメージを作成したい場合は、configs/licheepi_zero_defconfigファイルが存在するのを確認したうえで、以下を実行すればボードの設定が読み込まれ、.configに保存される。

make licheepi_zero_defconfig

各種設定方法

インストールするパッケージを選んだり、カーネルの設定を微調整したりといったカスタマイズには、ボードのデフォルト設定を読み込ませる操作(make licheepi_zero_defconfig)を行った後でmenuconfigを実行する。

  • パッケージの選択などBuildrootの全般設定
make menuconfig
  • カーネルの詳細設定
make linux-menuconfig

ビルド実行

makeを引数なしで実行すれば、Linuxシステムイメージ作成まで一気に自動実行される。

make

パッケージの選択画面

make menuconfigを実行しCUIベースのメニュー画面から”Target packages”メニューを選択してインストールしたいパッケージを選択する。パッケージはかなり充実しており、その気になればX Windowをインストールしてビデオ再生なんかも出来る筈。

パッケージ設定

ヘルプの表示と設定パラメータ検索

Buildrootはmakeコマンド中心で作られており、ヘルプメッセージもmake helpで表示出来る。

make help

menuconfigの中で設定パラメータの文字列検索も出来る。キーボードで”/”(スラッシュ)を打つと検索画面になるので、検索ワードを入力すると、設定パラメータの文字列とマッチする項目が一覧表示される。

ワード検索

カスタマイズ結果の保存方法

パッケージのカスタマイズ結果

“make menuconfig”実行によるパッケージのカスタマイズが終わったら、以下のコマンド実行で結果をdefconfigファイルに保存することが出来る。

make savedefconfig

このコマンド実行によって、最初に読み込んだdefconfigファイルが上書きされてしまうので注意。例えば、上記のように最初に”make licheepi_zero_defconfig”を実行していれば、configs/licheepi_zero_defconfigが上書きされる。

カーネルのカスタマイズ結果

“make linux-menuconfig”で行ったカーネルのカスタマイズは、上記の”make savedefconfig”では保存されないないので、以下を実行する。

make linux-savedefconfig

こちらは元々読み込んだ設定ファイルへの上書きは自動的には行われず、カーネルのソースコード展開先のトップディレクトリ(output/build/linux-<カーネルバージョン番号>)にdefconfigというファイル名で設定ファイルが生成されるので、適宜手動でコピーする。

リビルドの方法

設定を変更しながらビルドを繰り返すと、各種パッケージ間の設定に矛盾が発生してビルドが失敗したり、設定が反映されなかったり、という状態になる場合がある。そんな時、一番確実なリセット方法は、

make clean

を実行することなのだが、ツールチェーンのビルドから全てやり直しとなり、長時間待たされるので出来れば避けたい。以下、幾つか状況に応じたTips。

  • 問題パッケージが明確な場合は、それだけ狙ってcleanする
make <pkg>-clean
  • カーネルだけリビルド
make linux-dirclean
make linux-rebuild
  • デバイスツリー(dts)をアップデートしても反映されないとき
make linux-rebuild
  • u-bootのブートスクリプト(boot.cmd)を更新したとき
make host-uboot-tools-rebuild

まとめ

Buildrootの使い方をごくごく簡単にまとめた。パッケージ管理付きディストリビューションのような柔軟性は無いが、インストール可能なパッケージもかなり充実しており、SBC用のシステムイメージ作成ツールとしては必要十分ではないかと思う。

但し、設定が不完全だったり対象ボード用の設定がそもそも存在しなかったりでカスタマイズが必要なケースは結構ありそう。実際、必要に迫られてLichee Pi Nano用のカスタム設定を自力で作ってみたりしている(その顛末は別途メモにまとめた)。

コメント