OS・実行環境

Buildroot

シンプルに組み込みLinuxを構築するツール。

概要

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
MIPSMediaTek MT7688
x86 / x86_64Intel Atom、AMD
PowerPCNXP LS系
AArch64Rockchip 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>.mkConfig.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種類の方法で用意できます:

  1. Buildroot内蔵ビルド(推奨): crosstool-NG等でglibc/musl/uClibcを選択してビルド
  2. 外部ツールチェーン: Linaro・ARM公式などのプリビルドツールチェーンを使用
  3. ホストOS自身のツールチェーン: クロスコンパイルなし(x86ターゲットのみ)
# musl libc(軽量C標準ライブラリ)を使ったツールチェーン選択
BR2_TOOLCHAIN_BUILDROOT_MUSL=y
# または glibc
BR2_TOOLCHAIN_BUILDROOT_GLIBC=y

BusyBoxによるユーザーランド

BuildrootはBusyBoxを標準のユーザーランドツールとして使います。BusyBoxはlscatgrepvishなど数百の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

項目BuildrootYocto
学習コスト低い高い
ビルド時間(初回)30分〜2時間数時間
パッケージ管理シンプル(makeターゲット)高機能(BitBake + sstate)
複数製品管理シンプルだが管理が煩雑になりやすいレイヤーで体系的に管理
再現ビルド部分的にサポート完全サポート
パッケージ数2000以上数千以上(OE含む)
向く規模小〜中規模中〜大規模

Buildroot vs Alpine Linux

Alpine Linuxはmusl libcベースの軽量Linuxで、コンテナ用途に特化しています。組み込み機器の場合、カーネルやドライバのカスタマイズが必要なことが多いため、Buildrootが適しています。コンテナ(Docker)をエッジデバイスで使う場合は、Buildrootで作ったrootfs上にDockerを動かすアーキテクチャが一般的です。

関連用語

参考リンク