2016年12月7日水曜日

Buildrootとは 紹介と使い方の入門

Buildrootとは,rootfsイメージを作成するためのオープンソースソリューションです。
主に組み込み系をターゲットとしています。
https://buildroot.org/

http://elinux.org/Buildroot

箇条書きに並べますと
  • 2008年頃に初回リリース
  • 3ヶ月に1度、リリースがされるタイムリーベースのリリースポリシー
  • 数個のMakefileでシステムが組み上げられている
  • ncursesとCONFIGによる設定
  • 理解しやすいシンプルなアーキテクチャ
  • 整理された必要十分なドキュメント
  • 特権権限(su)は不要
  • ccacheも使える
  • メーリングリストを使った古風な開発手法
  • メーリングリストへの投稿は増加傾向
  • 開発事態はgitを使っている
  • uLinuxのコミュニティでホスティングされてるっぽい
  • Buildroot Developer Daysが毎年開かれている

似たソリューションとしてはYoctoがあるかと思いますが、個人的にはこちらのほうが好きです。

百聞はは一見に敷かずだと思います。

ダウンロードする

ページを見るとリリースされたtarがあります。
私のオススメはgit-cloneになります。
理由としてはconfファイルや自前で変更した部分がgit-diffで一発で分かること。
気に入った場合に3ヶ月後のリリースもgit-rebaseで簡単に移行することができるからです。


ホスト環境をセットアップする

Buildrootの方針として、ホスト環境にできるだけ依存しないようにと設計されています。
そのため、ビルドに必要なものはできるだけ自前でセットアップするようになっています。
しかしながら、wgetなどダウンローダーなど一部ホストに依存するものがありますので、aptなどを使って導入しましょう

https://buildroot.org/downloads/manual/manual.html#requirement



Ubuntu16.04ならば、こんな感じです。
sudo apt install build-essential libncurses5-dev bc git mercurial python3 zip

configをロードする。
どのターゲットに。何をビルドするのか。などをセットアップします。
ここでは既にあるものをロードしてみたいと思います。
make qemu_x86_64_defconfig

他にも様々なものが用意されています。お使いのボードが登録されていたら、それをベースにすることをおすすめします。
例えば、raspberrypi3_defconfigなどがあります。。
https://github.com/buildroot/buildroot/tree/master/configs

ビルドする

make と実行することでビルドが開始されます。
具体的には次のようなプロセスが走ります。
.configを読み取る(上記のdefconfigは.configのロードをしています)
パッケージをビルドする
イメージを作成する

パッケージのビルドはこのようになっています。
tar ballのダウンロード、ソースの展開、パッチの適用、configure、make, make install
これらの進捗はスタンプファイルというシンプルな方法で管理されています。
% ls output/build/busybox-*/.stamp*
.stamp_downloaded .stamp_staging_installed
.stamp_built .stamp_extracted .stamp_target_installed
.stamp_configured .stamp_patched

テクニックとして、それぞれの処理で任意のスクリプトを実行することも可能です。
https://buildroot.org/downloads/manual/manual.html#hooks

実行する

ビルドが完了するとQEMUならこんな感じで~と表示されるので試してみてください!
outputイメージはいくつか選択することができてtarにする。とかsquashfsにするとか、NANDのubifsイメージにするとか色々選べます。
私はtarでNFSルートに使うのがお気に入りです。
https://buildroot.org/downloads/manual/manual.html#_boot_the_generated_images

カスタムする

今回は既にあるdefconfigをロードしてBusyboxベースの小さいrootfsを作成しました。
好きなソフトウェアをビルドしたりオプションを設定したりする方法をここでは紹介します。

make menuconfigとすると、メニュー形式でズルっと出てきます。
menuconfigだけでなくxconfig,gconfigも使えるらしいです。それぞれホストに必要なソフトウェアを導入しておいてください。
https://buildroot.org/downloads/manual/manual.html#requirement-optional

好きなソフトウェアを追加しましょう。
package selection~ -> となっているところを選択するとジャンルが出てきて更に掘るとアプリケーション名が並んでいます。
チェックを入れるとビルド対象になってアプリが入ります。この時、必要なinit.dスクリプトなども導入されるため起動時に自動で立ち上がってくるはずです。

他については、なんとなく雰囲気で掴んでください。たくさんあるので紹介しきれないのです。

更に使いこなすには

パッチを当てたい、無いパッケージを作りたい、こんなときはどうする?
まずはマニュアルに目を通しましょう。Buildrootのマニュアルはとてもわかり分かりやすいです。

膨大な量に見えますが、網羅していてセクション毎に切られているので必要に応じて見れば良いです。
今のところ半分はPart III. Developer guideです。
気になる用語とかをCtrl+Fでサーチすると良いでしょう。
ドキュメントも下記で以上なのでどこを見れば良いんだろう~?と悩む必要がなく素晴らしいです。
https://buildroot.org/downloads/manual/manual.html

使っているとバグとかを見つけることもあるかと思いますが見通しが良いコンパクトなプログラムなのでハマることは少ない印象です。

さいごに

Buildrootというシンプルで活発で勢いのあるrootfs生成ツールを紹介しました。
同梱されているルールを使ってrootfsを生成する方法とそれをカスタムする方法を示しました。
さらにエンジョイする方法としてマニュアルの存在を紹介しました。

以上です。

追記:
BuildrootとQtCreatorを使ってQtアプリを開発する方法という記事を書きました。ラズパイのようなクロスビルド開発するお話です。合わせてどうぞ。

0 件のコメント:

コメントを投稿