Buildroot
一、什么是 Buildroot
- 最常用的嵌入式 Linux 构建系统
- 一键生成 rootfs、内核、bootloader、工具链
- 简单、易懂、入门首选
- 缺点:大规模产品不如 Yocto 灵活
二、获取与配置
git clone https://git.buildroot.net/buildroot
cd buildroot
# 选择 defconfig
make raspberrypi4_64_defconfig
make imx6ull_myboard_defconfig # 自己提供
make qemu_aarch64_virt_defconfig
# 自定义
make menuconfig
三、目录结构
buildroot/
├── board/ 板级支持(自定义配置、rootfs overlay)
├── boot/ boot loader
├── configs/ defconfig
├── docs/ 文档
├── fs/ 文件系统制作
├── linux/ 内核 patch(运行下载的缓存)
├── output/ 输出目录
│ ├── build/ 各个包源码
│ ├── host/ 主机工具
│ ├── images/ 最终镜像
│ ├── staging/ sysroot
│ └── target/ 目标 rootfs
├── package/ 软件包(busybox、systemd、...)
├── system/ 系统框架(skeleton)
├── toolchain/ 工具链
├── utils/ 辅助
├── Config.in
├── Makefile
└── README
四、核心配置项
make menuconfig
Target options
- Target Architecture (ARM / ARM64 / x86 / RISC-V)
- Target ABI (EABI / EABIHF)
- Target Architecture Variant (cortex-A9)
Build options
- Parallel jobs
- Strip
Toolchain
- Toolchain type (Buildroot toolchain / External toolchain)
- C library (glibc / musl / uClibc-ng)
System configuration
- Hostname, banner
- /dev management (mdev / eudev / devtmpfs only)
- (e)glibc dynamic library
- Port to run a getty
- System hostname, System banner
Kernel
- Linux Kernel → <*> Linux Kernel
- Kernel version
- Configuration (Using defconfig / Using custom config file)
- Device Tree support
- Kernel binary format (zImage / uImage / Image)
Target packages
- 选择要安装的包
- 分类:Audio, Graphic, Network, ...
Filesystem images
- ext2/3/4 rootfs
- squashfs
- cpio
- tar
- ubifs
- jffs2
五、自定义
1. 板级文件
board/myvendor/myboard/
├── kernel-patches/
├── linux.config # 覆盖内核 config
├── busybox.config # busybox 配置
├── readme.txt
├── rootfs_overlay/ # 覆盖 rootfs(直接 cp 过去)
│ ├── etc/
│ ├── usr/
│ └── ...
├── post_build.sh # 编译后脚本
├── post_image.sh # 生成镜像后脚本
└── myboard_defconfig # defconfig(放 configs/)
2. 自定义 defconfig
make myboard_defconfig
cp .config configs/myboard_defconfig
3. 内核补丁
# board/myvendor/myboard/kernel-patches/
0001-my-driver.patch
4. post_build.sh
#!/bin/sh
# 添加自定义文件
cp ${BOARD_DIR}/my_config $TARGET_DIR/etc/
# 设置权限
chmod 755 $TARGET_DIR/etc/init.d/S99myapp
六、编译
make myboard_defconfig
make -j$(nproc)
# 输出
ls output/images/
├── rootfs.ext4 # ext4 镜像
├── rootfs.tar
├── rootfs.cpio.gz
├── vmlinux
├── zImage / uImage / Image
├── myboard.dtb
└── sdcard.img # 完整 SD 卡镜像(部分板级)
七、清理与重编
make clean # 清 build/
make distclean # 完全清空
make mypackage-dirclean # 单个包清
make mypackage-rebuild # 单个包重编
make linux-rebuild
make busybox-rebuild
八、外部工具链
如果已经有工具链:
Toolchain --->
[*] External toolchain
Toolchain path: /opt/gcc-arm-9.3
Toolchain prefix: arm-linux-gnueabihf
External toolchain C library: (glibc) / (musl)
九、自定义软件包
1. 使用 Buildroot 包系统
package/myapp/
├── Config.in
├── myapp.mk
└── myapp-1.0.tar.gz
2. Config.in
config BR2_PACKAGE_MYAPP
bool "myapp"
depends on BR2_PACKAGE_LIBUV
help
My awesome application.
https://example.com/myapp
3. myapp.mk
MYAPP_VERSION = 1.0
MYAPP_SITE = /path/to/source
MYAPP_SITE_METHOD = local
MYAPP_LICENSE = GPL-2.0
MYAPP_LICENSE_FILES = COPYING
MYAPP_DEPENDENCIES = libuv
MYAPP_CONF_OPTS = -DCMAKE_BUILD_TYPE=Release
define MYAPP_BUILD_CMDS
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
endef
define MYAPP_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/myapp $(TARGET_DIR)/usr/bin/myapp
endef
$(eval $(generic-package))
十、典型流程
# 1. 配置
make myboard_defconfig
make menuconfig
# 2. 编译
make -j$(nproc)
# 3. 测试
sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress
# 4. 调整
make mypackage-rebuild
make
十一、与 U-Boot、内核关系
Buildroot 同时构建:
- toolchain
- bootloader(U-Boot)
- kernel
- rootfs
- 镜像
一键完成。
十二、文档
make manual生成 PDFmake docs-html生成 HTML- 在线:buildroot.org/documentation.html