公司动态

从零搭建Buildroot最小系统?30分钟出rootfs,比Yocto快10倍

📅 2026/7/15 12:50:22
从零搭建Buildroot最小系统?30分钟出rootfs,比Yocto快10倍
从零搭建Buildroot最小系统30分钟出rootfs比Yocto快10倍嵌入式Linux开发绕不开的一件事搭环境。Yocto功能强大但第一次bitbake编译个core-image-minimal就得等两小时——还不一定一次过。Buildroot则是另一个极端30分钟出rootfs配置文件清爽编译快特别适合小团队和原型验证。今天这篇不废话直接手把手带你从源码拉取到rootfs烧录上板附我踩过的三个坑。为什么选Buildroot而不是Yocto先不说废话直接给结论对比项BuildrootYocto首次编译时间20-40分钟1.5-4小时配置复杂度一个make menuconfig搞定至少需要3层以上layer镜像大小可控制到4MB以下基础镜像通常100MB学习曲线入门级劝退级包管理不够灵活非常灵活但复杂适合场景单产品/原型验证大规模产品/多平台Buildroot适合你小团队、产品单一、需要快速验证、不想在构建系统上花太多精力。Yocto适合你大公司、多产品线、需要高度定制化、有专职的Build/DevOps团队。好吧我说人话如果你一个人要搞定整个嵌入式Linux开发先从Buildroot开始。第一步拉取源码# 我习惯用长期支持版本2025.02.x是最近的LTSgitclone-b2025.02.x https://git.busybox.net/buildrootcdbuildroot别用master分支。你永远不知道master上哪个commit会break你的编译。除非你想帮社区测bug。第二步配置目标平台Buildroot支持200官方板子但大多数人用的是非官方板。两种玩法方案A你用的是官方支持板# 看看有哪些板子支持lsconfigs/|grep-istm32# 直接选一个makestm32mp157_dk_defconfigRaspberry Pi、STM32MP1、i.MX、BeagleBone这些热门板都在列表里。方案B自己配多数人的场景makemenuconfig这个界面和Linux内核的menuconfig长得一模一样操作也一样。关键配置项Target options - Target Architecture ARM (little endian) // 选你的CPU架构 - Target Architecture Variant cortex-A7 // 选具体核 Toolchain - Toolchain type Buildroot toolchain // 用Buildroot自带的 - C library glibc / uclibc / musl // 选一个 System configuration - Root filesystem overlay directories // 你的自定义文件覆盖层 - /dev management Dynamic using devtmpfs mdev Filesystem images - ext2/3/4 root filesystem // rootfs格式 - tar the root filesystem // 打包备用 Bootloaders - U-Boot // 如果你用U-Boot Kernel - Linux Kernel // 勾上选你的内核版本 - Kernel binary format zImage - Defconfig name your_board_defconfig我的建议Toolchain用Buildroot自带的省事。C library选glibc兼容性最好体积大点没关系如果flash紧张就上musl。第三步选包make menuconfig里翻到Target packages这里可以加你需要的东西Target packages - Debugging - strace // 调试必备 - gdb // 板端调试 - lsof, ltrace, valgrind // 酌情加 - Networking applications - dropbear (SSH server) // 必选不然只能串口 - iperf3 // 网络性能测试 - tcpdump, iptables // 网络调试 - System tools - htop, procps-ng // 进程管理 - coreutils // 完整版命令工具 - Shell and utilities - bash // 比默认的ash好用 - Hardware handling - i2c-tools, spi-tools, gpio-tools // 外设调试重要提醒包越多编译越慢第一次编译只加必须要的。dropbearSSH和strace是最值得加的其余以后再说。第四步编译# 单线程编译make# 多线程推荐make-j$(nproc)第一次编译会下载工具链、内核源码、各种包的源码——确保网络通畅。我试过在国内某些内网环境下fetch源码能卡半小时。备好代理或者提前确认能访问sourceware.org、kernel.org这些域名。成功失败make menuconfig生成.configmake -jN 开始编译下载源码编译工具链检查网络或代理编译内核编译应用包打包rootfsoutput/images/ 目录zImage rootfs.ext4 dtb常见编译报错及解决报错1源码下载超时 host-pkgconf 2.2.0 Downloading --2026-07-13 01:00:00-- https://sourceware.org/... Resolving sourceware.org... failed: Connection timed out.解决办法在Buildroot根目录建一个dl/目录手动下载源码包放进去。或者配置代理makeBR2_DL_DIR/path/to/your/dl报错2编译器不匹配Selected architecture armv7-a does not match ...这是Toolchain variant选错了回menuconfig检查Target Architecture Variant是不是和你的CPU一致。报错3内核dtb编译失败一般是设备树文件路径不对。检查Kernel - Device tree source file paths填相对于内核源码的路径比如arch/arm/boot/dts/stm32mp157a-dk1.dts。第五步输出产物编译完去output/images/目录output/images/ ├── zImage # 内核镜像 ├── stm32mp157a-dk1.dtb # 设备树 ├── rootfs.tar # rootfs打包 ├── rootfs.ext4 # ext4格式rootfs └── u-boot.bin # Bootloader烧录到SD卡# 分两个区BOOTFAT32和ROOTFSext4sudofdisk/dev/sdb# 分区1: 64MB, FAT32 - 放zImage, dtb, u-boot# 分区2: 剩余空间, ext4 - 放rootfs# 格式化sudomkfs.fat-F32/dev/sdb1sudomkfs.ext4 /dev/sdb2# 挂载并拷贝sudomount/dev/sdb1 /mnt/bootsudocpoutput/images/zImage /mnt/boot/sudocpoutput/images/*.dtb /mnt/boot/sudoumount/mnt/bootsudomount/dev/sdb2 /mnt/rootfssudotarxf output/images/rootfs.tar-C/mnt/rootfssudoumount/mnt/rootfs踩坑合集三个让我浪费了一天的错误坑1文件系统覆盖层overlay权限问题你可能会想把自己写的程序放到rootfs里Buildroot的overlay机制很方便System configuration - Root filesystem overlay directories board/mycompany/rootfs-overlay/但要注意overlay目录里的文件权限会原样打包进rootfs。如果你在开发机上chmod 777了一个脚本它在rootfs里也是777。更坑的是——如果文件owner是你的开发机用户ID而不是root打包后可能无法执行。解决方案在Buildroot的post-build脚本里统一修正权限# board/mycompany/post-build.sh#!/bin/bash# 修正所有可执行脚本的权限find${TARGET_DIR}-name*.sh-execchmod755{}\;# 确保/etc/init.d下的脚本可执行chmod-R755${TARGET_DIR}/etc/init.d/然后在System configuration - Custom scripts to run before creating filesystem images里指向这个脚本。坑2内核模块没装进去编译完发现WiFi/网卡驱动没加载——很可能是内核模块没装到rootfs。makemenuconfig# Kernel - Linux Kernel - Kernel modules - 勾上你需要的# 或者直接修改内核defconfig加上:# CONFIG_XXX_DRIVERm然后Buildroot会自动把这些.ko拷贝到/lib/modules/下。如果还是没装检查/etc/modules-load.d/下有没有对应的.conf文件让模块自动加载。坑3Dropbear SSH连不上SD卡烧好、板子上电、串口有输出——但是SSH连不上。大概率是rootfs里没有/etc/init.d/S50dropbear这个启动脚本或者root密码没设置。System configuration - Root password your_password # 一定要设默认空密码dropbear会拒绝登录 - Enable root login with password # 必须勾上进阶外部包BR2_EXTERNAL当你产品定型后肯定不想每次都make menuconfig手动选包。用BR2_EXTERNAL把你的板级配置独立出来# 创建一个外部目录mkdir-pmy-board/mkdir-pmy-board/board/mycompany/mkdir-pmy-board/configs/mkdir-pmy-board/package/# 在my-board/目录下创建external.mk和Config.in# 然后makeBR2_EXTERNAL/path/to/my-board myboard_defconfig这样你就能把板子配置、自定义包、overlay、post-build脚本全部放在一个目录里git管理换人也能一把出。课后作业用Buildroot给树莓派3B做一个最小rootfs只包含dropbear strace iperf3记录最终镜像大小试着把libc从glibc换成musl看看镜像体积减少了多少跑一下你的程序测兼容性写出一个post-build.sh自动生成/etc/network/interfaces配置静态IP总结Buildroot不是万能的但在嵌入式Linux开发的早期阶段——原型验证、快速迭代、小批量生产——它比Yocto好用10倍。别被生产环境必须用Yocto的言论吓到我有两个量产项目就是用Buildroot跑的跑了三年稳如老狗。工具是拿来解决问题的不是拿来装逼的。