概要
Buildrootは、組み込みLinuxシステムを構築するためのシンプルで使いやすいビルドシステムです。クロスコンパイルツールチェーン・Linuxカーネル・ブートローダー・ルートファイルシステムを一括してビルドできます。Yocto Projectと並んで組み込みLinux構築の定番ツールですが、よりシンプルな設計で学習コストが低く、プロトタイプから中規模の量産品まで幅広く使われています。
Buildrootの設計哲学は「シンプルさ」です。Makefileベースの単純な構成で、menuconfig(LinuxカーネルのKconfigと同じ仕組み)で必要なパッケージを選択するだけでビルドが可能です。2000以上のパッケージをサポートしており、Qt・Python・OpenCV・Busyboxなど一般的なミドルウェアはほぼ網羅されています。
歴史・背景
Buildrootは2001年ごろ、uClinux(MMUなしLinux)プロジェクトのビルドスクリプトとして生まれました。2003年頃に独立したプロジェクトとなり、OpenWrtのビルドシステムにも採用されました(OpenWrtは後に独自のビルドシステムを開発)。
2000年代後半からARMアーキテクチャの普及に合わせてサポートが充実し、Raspberry Pi・Beaglebone・Zylinqなど多くのボードのBSPが追加されました。2012年頃から活発なメンテナーが体制を整備し、3ヶ月ごとのリリースサイクル、長期サポート(LTS)版の提供が確立されました。
現在は年4回リリースされ、最新の安定版は2024.02 LTS系統です。開発はボランティアベースですが、BusyboxやLinuxカーネルなどの組み込みOSSコミュニティと深く連携しています。
技術仕様
サポートアーキテクチャ
| アーキテクチャ | 代表SoC |
|---|---|
| ARM(32bit/64bit) | Raspberry Pi、AM335x、i.MX |
| RISC-V(32bit/64bit) | StarFive VisionFive2 |
| MIPS | MediaTek MT7688 |
| x86 / x86_64 | Intel Atom、AMD |
| PowerPC | NXP LS系 |
| AArch64 | Rockchip RK3399 |
ディレクトリ構成
buildroot/
├── arch/ # アーキテクチャ固有設定
├── board/ # ボード固有設定・スクリプト
├── boot/ # ブートローダーパッケージ(U-Boot等)
├── configs/ # デフォルト設定ファイル(defconfig)
├── fs/ # ファイルシステム生成スクリプト
├── linux/ # Linuxカーネルビルド設定
├── package/ # 2000以上のパッケージ定義(.mk / Config.in)
├── system/ # rootfs骨格・init設定
├── toolchain/ # クロスコンパイルツールチェーン設定
└── output/ # ビルド生成物(.gitignore)
├── images/ # カーネル・dtb・rootfs等の最終イメージ
├── host/ # ホスト側ツール(クロスコンパイラ等)
├── staging/ # ターゲット用ライブラリ(開発用)
└── target/ # ルートFS内容
パッケージ定義(.mkファイル)
Buildrootのパッケージはpackage/<name>/<name>.mkとConfig.inで定義します:
# package/myapp/myapp.mk
MYAPP_VERSION = 1.2.3
MYAPP_SITE = https://github.com/myorg/myapp/archive
MYAPP_SOURCE = v$(MYAPP_VERSION).tar.gz
MYAPP_SITE_METHOD = wget
MYAPP_LICENSE = MIT
MYAPP_LICENSE_FILES = LICENSE
# 依存パッケージ
MYAPP_DEPENDENCIES = libgpiod openssl
# CMakeビルドインフラ使用
$(eval $(cmake-package))
# package/myapp/Config.in
config BR2_PACKAGE_MYAPP
bool "myapp"
depends on BR2_PACKAGE_LIBGPIOD
help
My embedded application for GPIO control.
https://github.com/myorg/myapp
設定ファイル(defconfig)
# configs/myraspberrypi4_defconfig(例)
BR2_aarch64=y
BR2_cortex_a72=y
BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_DEFCONFIG="bcm2711"
BR2_LINUX_KERNEL_DTS="broadcom/bcm2711-rpi-4-b"
BR2_PACKAGE_BUSYBOX=y
BR2_PACKAGE_PYTHON3=y
BR2_PACKAGE_PYTHON3_PIP=y
BR2_PACKAGE_OPENSSH=y
BR2_PACKAGE_MYAPP=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
主要なビルドターゲット
# 設定
make menuconfig # TUI設定メニュー
make raspberrypi4_64_defconfig # デフォルト設定を読み込む
# ビルド
make # 全体ビルド(初回は30分〜2時間)
make myapp # 特定パッケージのみビルド
make myapp-rebuild # パッケージを強制再ビルド
make linux # カーネルのみビルド
make linux-menuconfig # カーネル設定変更
# クリーン
make myapp-dirclean # パッケージの中間ファイル削除
make clean # outputディレクトリをクリア
make distclean # 設定ファイル含め全削除
動作原理
ビルドフロー
make実行
↓
1. ツールチェーン生成(arm-linux-gnueabihf-gcc等)
またはホストにインストール済みのものを使用
↓
2. 各パッケージのソースをダウンロード・解凍
↓
3. パッケージのconfigure(クロスコンパイル向け設定)
↓
4. クロスコンパイル(ホストPCでターゲット向けバイナリ生成)
↓
5. output/target/にインストール(ルートFS組み立て)
↓
6. Linuxカーネル・U-Bootのビルド
↓
7. rootfsイメージ生成(ext4 / squashfs / cpio等)
↓
8. 最終イメージ生成(output/images/)
クロスコンパイルツールチェーン
Buildrootはツールチェーンを3種類の方法で用意できます:
- Buildroot内蔵ビルド(推奨): crosstool-NG等でglibc/musl/uClibcを選択してビルド
- 外部ツールチェーン: Linaro・ARM公式などのプリビルドツールチェーンを使用
- ホストOS自身のツールチェーン: クロスコンパイルなし(x86ターゲットのみ)
# musl libc(軽量C標準ライブラリ)を使ったツールチェーン選択
BR2_TOOLCHAIN_BUILDROOT_MUSL=y
# または glibc
BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BusyBoxによるユーザーランド
BuildrootはBusyBoxを標準のユーザーランドツールとして使います。BusyBoxはls・cat・grep・vi・shなど数百のUnixコマンドを1つのバイナリに統合したもので、最小サイズで多機能な組み込みユーザーランドを実現します:
# BusyBoxのみで構成されるminimalルートFS例(サイズ約3MB)
$ ls output/target/
bin dev etc lib proc run sbin sys tmp usr var
$ ls output/target/bin/
busybox sh ash ...(全てbusyboxへのシンボリックリンク)
用途・ユースケース
プロトタイプ・PoC開発
Yoctoより学習コストが低く、ドキュメントも豊富なため、組み込みLinuxの初学者やプロトタイプ開発に最適です。Raspberry Pi・BeagleBoneなどのSBCに対応した公式defconfigが多数用意されています。
小規模〜中規模の量産品
単一製品ラインで要件が固まっているプロジェクトでは、Buildrootの単純な構成が管理しやすいです。工業用センサーゲートウェイ・デジタルサイネージ・スマートホーム機器などで採用されています。
OpenWrt・ルーター
OpenWrtはBuildrootから派生したビルドシステムを使っており、家庭用〜業務用ルーター・Wi-Fiアクセスポイントで広く使われています。
ネットワーク機器・セキュリティアプライアンス
PFSense・VyOSなど、ネットワーク専用ディストリビューションもBuildrootベースのものがあります。
実装・開発のポイント
カスタムパッケージのオーバーレイ
プロジェクト専用の設定をBR2_EXTERNALディレクトリに分離するのがベストプラクティスです:
my-product/
├── Config.in # 追加パッケージの定義
├── external.mk
├── external.desc
├── configs/
│ └── myboard_defconfig
├── package/
│ └── myapp/
│ ├── Config.in
│ └── myapp.mk
└── board/
└── myboard/
├── post-build.sh # ビルド後処理スクリプト
├── genimage.cfg # SDカードイメージ定義
└── rootfs-overlay/ # ルートFSに追加するファイル
└── etc/
└── myapp.conf
# BR2_EXTERNAL を指定してビルド
export BR2_EXTERNAL=/path/to/my-product
cd buildroot
make myboard_defconfig
make
post-build.shとrootfs-overlay
#!/bin/sh
# board/myboard/post-build.sh
# ビルド後に自動実行されるスクリプト
TARGET=$1
# 設定ファイルのコピー
cp ${BR2_EXTERNAL_MY_PATH}/board/myboard/my.conf ${TARGET}/etc/
# バージョン情報の埋め込み
echo "MyProduct-$(git describe --tags)" > ${TARGET}/etc/version
イメージ生成(genimage)
# board/myboard/genimage.cfg(SDカードパーティション定義)
image sdcard.img {
hdimage {
}
partition boot {
partition-type = 0x0c
bootable = "true"
image = "boot.vfat"
size = 64M
}
partition rootfs {
partition-type = 0x83
image = "rootfs.ext4"
size = 512M
}
}
他技術との比較
Buildroot vs Yocto
| 項目 | Buildroot | Yocto |
|---|---|---|
| 学習コスト | 低い | 高い |
| ビルド時間(初回) | 30分〜2時間 | 数時間 |
| パッケージ管理 | シンプル(makeターゲット) | 高機能(BitBake + sstate) |
| 複数製品管理 | シンプルだが管理が煩雑になりやすい | レイヤーで体系的に管理 |
| 再現ビルド | 部分的にサポート | 完全サポート |
| パッケージ数 | 2000以上 | 数千以上(OE含む) |
| 向く規模 | 小〜中規模 | 中〜大規模 |
Buildroot vs Alpine Linux
Alpine Linuxはmusl libcベースの軽量Linuxで、コンテナ用途に特化しています。組み込み機器の場合、カーネルやドライバのカスタマイズが必要なことが多いため、Buildrootが適しています。コンテナ(Docker)をエッジデバイスで使う場合は、Buildrootで作ったrootfs上にDockerを動かすアーキテクチャが一般的です。