『7x24小时有问必答』

Buildroot 快速入门:从零构建嵌入式 Linux 系统

前言

作为嵌入式工程师,你是否遇到过这些场景:               

- 需要为定制硬件快速搭建 Linux 系统               

- 想要精简根文件系统,减少启动时间               

- 希望统一管理交叉编译工具链和第三方库               

- 面对复杂的 Yocto/OpenEmbedded 学习曲线望而却步               

Buildroot 正是解决这些痛点的利器。它是一个基于 Make 的构建系统,能够通过简单的配置,自动生成交叉编译工具链、根文件系统、Linux 内核镜像,甚至 Bootloader。               

本文将带你从零开始,快速掌握 Buildroot 的使用方法,并在 30 分钟内完成第一个嵌入式 Linux 系统构建。

1. Buildroot 核心概念

1.1 什么是 Buildroot

**定义**:Buildroot 是一个针对嵌入式系统的自动化构建工具,通过 Makefile 和 Kconfig 机制,实现一键生成完整的 Linux 系统镜像。               

**核心特点**:               

- **简单高效**:基于 Make,无需复杂依赖               

- **高度可定制**:2000+ 软件包可选               

- **交叉编译友好**:自动生成工具链               

- **输出统一**:单个目录包含所有产物               

**与 Yocto 对比**:
特性
Buildroot
Yocto/OpenEmbedded
学习曲线
平缓
陡峭
构建速度
快
慢
包管理
Makefile
BitBake
适用场景
快速原型、小规模系统
企业级、大规模产品
灵活性
中等
极高

1.2 构建产物结构

Buildroot 的输出目录结构清晰:
output/               

├── build/                # 所有软件包的源码和构建中间文件               

├── host/                 # 主机端工具(交叉编译器、工具链)               

├── images/              # 最终镜像文件(rootfs.tar、内核、设备树)               

├── per-package/       # 每个包独立的构建缓存               

├── staging/             # 目标系统的 sysroot(头文件、库)               

└── target/              # 根文件系统(实际将部署到设备的文件)               

**关键目录说明**:               

- **host/**:交叉编译工具链所在目录,`bin/` 包含 `aarch64-linux-gcc` 等工具               

- **staging/**:开发时需要的头文件和库,用于编译用户程序               

- **target/**:完整的根文件系统,可直接烧录到设备

2. 快速开始

2.1 环境准备

**系统要求**:               

- Linux 主机(Ubuntu 20.04+ 推荐)               

- 至少 20GB 可用磁盘空间               

- 8GB+ RAM(构建大型包时)               

**安装依赖**:
sudo apt-get update               

sudo apt-get install -y \               

       build-essential \               

       git \               

       bc \               

       python3 \               

       unzip \               

       rsync \               

       wget \               

       cpio \               

       file               

**下载源码**:
# 克隆稳定分支(推荐 2023.02.x LTS)               

git clone https://gitlab.com/buildroot.org/buildroot.git               

cd buildroot               

git checkout 2023.02.x -b my-buildroot               

# 或下载发布版本               

wget https://buildroot.org/downloads/buildroot-2023.02.10.tar.gz               

tar xzf buildroot-2023.02.10.tar.gz               

cd buildroot-2023.02.10               

2.2 配置系统

**Step 1:选择 Defconfig**               

Buildroot 提供了多个预设配置,根据目标平台选择:
# 查看所有可用的 defconfig               

ls configs/               

# 常用平台               

qemu_arm_vexpress_defconfig        # ARM VExpress(QEMU 虚拟)               

raspberrypi4_defconfig                 # 树莓派 4               

raspberrypi4_64bit_defconfig        # 树莓派 4(64位)               

nxp_imx8mm_evk_defconfig             # NXP i.MX8MM               

**Step 2:加载配置并定制**
# 加载树莓派 4 配置               

make raspberrypi4_defconfig               

# 进入配置菜单               

make menuconfig               

**配置界面**(类似 Linux 内核 menuconfig):
────────────────────────────────────────────               

    Buildroot Configuration (2023.02.10)               

────────────────────────────────────────────               

    Target options    --->               

       Target Architecture (ARM (little endian))    --->               

       Target Binary Format (ELF)    --->               

       Target Architecture Variant (cortex-A72)    --->               

    Toolchain    --->               

      
  • Enable toolchain in /output/host               

          
  • Copy gdb server to target               

        System configuration    --->               

           System hostname (buildroot-box)               

           Root password (123456)               

        Kernel    --->               

          
  • Linux Kernel               

           Kernel version (Latest version (6.1.x))               

        Package selection    --->               

          
  • Show packages that are also provided by BusyBox               

           Core system    --->               

             
  • busybox               

           Networking applications    --->               

             
  • openssh               

           Hardware handling    --->               

             
  • i2c-tools               

        Filesystem images    --->               

          
  • tar (the rootfs tarball)               

          
  • ext2/3/4 (the rootfs filesystem image)               

    ────────────────────────────────────────────               

    **关键配置项**:               

    1. **Target options**:目标架构               

    - `Target Architecture`:ARM、AArch64、MIPS 等               

    - `Target Architecture Variant`:cortex-A7、A53、A72 等               

    - `Target ABI`:EABIHF(硬浮点)               

    2. **Toolchain**:工具链选项               

    - `Enable toolchain in /output/host`:生成独立工具链(推荐)               

    - `Copy gdb server to target`:方便远程调试               

    3. **System configuration**:系统配置               

    - `System hostname`:设备主机名               

    - `Root password`:root 用户密码               

    - `Root filesystem overlay`:自定义文件覆盖               

    4. **Kernel**:Linux 内核               

    - `Linux Kernel`:是否构建内核               

    - `Kernel version`:内核版本选择               

    - `Device Tree Source`:设备树文件路径               

    5. **Package selection**:软件包选择               

    - 2000+ 可选软件包               

    - 按功能分类(Core、Networking、Hardware handling 等)

    2.3 开始构建

    **完整构建命令**:
    # 查看可用 CPU 核心数               

    nproc               

    # 并行构建(加速)               

    make -j$(nproc)               

    # 构建特定阶段               

    make source             # 仅下载源码               

    make toolchain        # 仅构建工具链               

    make linux              # 仅构建内核               

    make all                 # 构建所有               

    **构建时间参考**(8核 CPU,16GB RAM):               

    - 首次全构建:30-60 分钟               

    - 仅工具链:10-15 分钟               

    - 仅内核:5-10 分钟               

    - 增量构建(修改配置后):5-15 分钟               

    **构建输出**:
    # 成功后查看镜像文件               

    ls -lh output/images/               

    # 典型输出文件               

    total 500M               

    -rw-r--r-- 1 user user    20M sdcard.img             # 完整 SD 卡镜像               

    -rw-r--r-- 1 user user 8.0M zImage                   # Linux 内核镜像               

    -rw-r--r-- 1 user user 100K rpi-firmware.dtb    # 设备树文件               

    -rw-r--r-- 1 user user 15M rootfs.ext4           # ext4 根文件系统               

    -rw-r--r-- 1 user user 12M rootfs.tar             # tar 格式根文件系统               

    3. 目录结构定制

    3.1 板级配置目录

    Buildroot 推荐使用 `board/` 目录管理项目特定配置:
    mkdir -p board/mycompany/myboard               

    cd board/mycompany/myboard               

    # 创建必要的配置文件               

    touch linux.config                # 内核配置               

    touch busybox.config             # BusyBox 配置               

    touch rootfs-overlay/etc/inittab               

    touch post-build.sh               

    touch patches/               

    **目录结构**:
    board/mycompany/myboard/               

    ├── linux.config                      # 内核 defconfig               

    ├── busybox.config                   # BusyBox 配置               

    ├── uboot.config                      # U-Boot 配置(可选)               

    ├── rootfs-overlay/                 # 根文件系统覆盖目录               

    │     ├── etc/               

    │     │     ├── inittab                 # Init 配置               

    │     │     ├── profile                 # 环境变量               

    │     │     └── fstab                    # 挂载配置               

    │     └── usr/bin/               

    │           └── my-script.sh          # 自定义脚本               

    ├── post-build.sh                    # 构建后脚本               

    ├── post-image.sh                    # 镜像生成后脚本               

    └── patches/                            # 补丁目录               

           ├── linux/               

           │     └── 0001-add-driver.patch               

           └── busybox/               

                 └── 0002-fix-bug.patch               

    3.2 在 menuconfig 中引用

    打开 `make menuconfig`,设置以下路径:
    System configuration    --->               

           Root filesystem overlay (board/mycompany/myboard/rootfs-overlay)               

    Kernel    --->               

           Kernel configuration (Using an in-tree defconfig file)               

           Defconfig name (myboard_defconfig)               

    Filesystem images    --->               

           Post-build script (board/mycompany/myboard/post-build.sh)               

    4. 高级配置技巧

    4.1 保存为 Defconfig

    完成定制后,保存为可复用的配置文件:
    # 生成最小化配置               

    make savedefconfig               

    # 复制到 configs/ 目录               

    cp defconfig configs/myboard_defconfig               

    # 使用该配置重建               

    make myboard_defconfig               

    make -j$(nproc)               

    **defconfig 示例**:
    BR2_arm=y               

    BR2_cortex_a72=y               

    BR2_ARM_FPU_VFPV4=y               

    BR2_PACKAGE_BUSYBOX_CONFIG="../board/mycompany/myboard/busybox.config"               

    BR2_LINUX_KERNEL=y               

    BR2_LINUX_KERNEL_DEFCONFIG="myboard"               

    BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="../board/mycompany/myboard/linux.config"               

    BR2_ROOTFS_OVERLAY="board/mycompany/myboard/rootfs-overlay"               

    BR2_ROOTFS_POST_BUILD_SCRIPT="board/mycompany/myboard/post-build.sh"               

    4.2 外部工具链

    如果已有预编译工具链,Buildroot 可直接使用:
    Toolchain    --->               

           Toolchain type (External toolchain)               

           Toolchain (Custom toolchain)               

           (/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu) Toolchain path               

           (aarch64-linux-gnu) Toolchain prefix               

    4.3 Init 系统

    Buildroot 支持多种 Init 系统:
    Init 系统
    特点
    适用场景
    BusyBox Init
    最小化、简单
    小型设备、快速启动
    SysVinit
    传统、稳定
    通用场景
    systemd
    功能强大、复杂
    桌面级、大型系统
    OpenRC
    轻量级、依赖少
    嵌入式友好
    **切换 Init 系统**:
    System configuration    --->               

           Init system (systemd)    --->               

    5. 实战演练

    5.1 目标

    为树莓派 4 构建一个最小化 Linux 系统,包含:               

    - SSH 服务器               

    - Python 3 运行环境               

    - I2C 工具               

    - 自定义启动脚本

    5.2 配置步骤

    # 1. 加载基础配置               

    make raspberrypi4_defconfig               

    # 2. 进入菜单配置               

    make menuconfig               

    # 3. 启用以下选项(在菜单中勾选)               

    # Toolchain    --->               

    #     
  • Enable toolchain in /output/host               

    # System configuration    --->               

    #     (pi4-box) System hostname               

    #     (root) Root password               

    #     
  • Enable root login               

    # Kernel    --->               

    #     
  • Linux Kernel               

    #     (Latest version (6.1.x)) Kernel version               

    # Package selection    --->               

    #     Core system    --->               

    #        
  • python3               

    #     Networking applications    --->               

    #        
  • openssh               

    #     Hardware handling    --->               

    #        
  • i2c-tools               

    # Filesystem images    --->               

    #     
  • ext2/3/4 (the rootfs filesystem image)               

    # 4. 保存并退出               

  • 5.3 构建与部署

    # 开始构建(首次约 30-60 分钟)               

    make -j$(nproc)               

    # 构建完成后,查看镜像               

    ls -lh output/images/               

    # 烧录到 SD 卡               

    sudo dd if=output/images/sdcard.img \               

           of=/dev/sdX \               

           bs=4M \               

           status=progress \               

           conv=fsync               

    # 插入树莓派 4,启动系统               

    # SSH 登录:ssh root@192.168.1.xxx               

    # 密码:root(配置时设置)               

    5.4 验证系统

    # 在树莓派上执行               

    uname -a                      # 查看内核版本               

    cat /proc/cpuinfo        # 查看 CPU 信息               

    python3 --version        # 验证 Python 3               

    i2cdetect -y 1             # 扫描 I2C 总线               

    6. 常见问题排查

    6.1 构建失败

    **问题**:某个包下载失败               

    **解决**:
    # 手动下载源码包               

    make
    -source         

    # 检查网络连接         

    ping dl.sourceforge.net         

    # 使用代理(如果需要)         

    export http_proxy=http://proxy.example.com:8080         

    make

    **问题**:编译错误               

    **解决**:
    # 查看详细日志               

    cat output/build/
    /.config.log         

    # 清理并重新构建         

    make
    -dirclean           

    make

    6.2 配置问题

    **问题**:menuconfig 图形界面无法启动               

    **解决**:
    # 安装 ncurses 开发库               

    sudo apt-get install libncurses5-dev libncursesw5-dev               

    # 或使用 nconfig 替代               

    make nconfig               

    6.3 部署问题

    **问题**:设备无法启动               

    **排查清单**:               

    - [ ] 检查 Bootloader 是否正确烧录               

    - [ ] 检查设备树文件(.dtb)是否匹配硬件               

    - [ ] 查看串口调试输出               

    - [ ] 检查根文件系统挂载点               

    **查看串口日志**:
    # 在开发机上               

    sudo screen /dev/ttyUSB0 115200               

    # 或使用 minicom               

    sudo minicom -D /dev/ttyUSB0 -b 115200               

    7. 总结

    Buildroot 是嵌入式 Linux 开发的利器,通过本文的学习,你应该掌握了:               

    **核心能力**:               

    -  理解 Buildroot 的基本原理和目录结构               

    -  能够独立配置和构建嵌入式 Linux 系统               

    -  掌握 board/ 目录的定制化方法               

    -  了解常见问题的排查思路               

    **下一步学习**:               

    - 添加自定义软件包(下一篇详细讲解)               

    - 根文件系统深度优化               

    - 内核与驱动定制               

    - 企业级项目实战               

    **参考资料**:               

    - Buildroot 官方文档:https://buildroot.org/docs.html               

    - Buildroot 手册:`docs/manual/`(源码目录)               

    - 邮件列表:buildroot@buildroot.org
    __________________________________________________           

    **系列文章**:               

    - 本文:Buildroot 快速入门               

    - 下一篇:Buildroot 添加外部包实战

    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    上一主题上一主题         下一主题下一主题
    QQ手机版小黑屋粤ICP备17165530号

    关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

    法律保护:PLC技术网,plcjs.com,plcjs.net等字样
    Copyright 2010-2030. All rights reserved. 


    微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码