嵌入式 Linux 入门:在 Allwinner H616 上跑 Buildroot

为什么选 Buildroot 而不是 Yocto?

搞嵌入式 Linux 的朋友大概都听过 Yocto 和 Buildroot 这两个名字。Yocto 功能强大但学习曲线陡峭,光是理解 BitBake 和 layer 机制就能让人头疼一周。Buildroot 就简单粗暴得多——make menuconfig 选完就 make,等一杯咖啡的时间,交叉编译工具链、Linux 内核、根文件系统全给你打包好了。

对于刚入门嵌入式 Linux 的开发者来说,Buildroot 是更好的起点。它的配置界面跟内核 menuconfig 一模一样,上手零门槛。而且 Buildroot 默认配置里就有不少开发板的预设,今天我们要用的就是全志 Allwinner H616 这块芯片。

Allwinner H616 芯片简介

H616 是全志推出的一款四核 Cortex-A53 处理器,主频最高 1.5GHz,内置 Mali-G31 MP2 GPU。它通常搭配 1GB 或 2GB DDR3 内存,支持 eMMC、SD 卡、千兆以太网、USB 2.0、HDMI 输出等接口。市面上很多低价开发板和机顶盒方案都在用这颗芯片。

选择 H616 作为入门板子的理由很简单:便宜、开源社区支持好、Buildroot 官方就有对应的 defconfig。不用花几百块买树莓派,几十块钱的开发板就能跑起完整的 Linux 系统。

硬件清单

配件型号/规格参考价格
开发板Allwinner H616 开发板(如 OrangePi Zero2、R329 等)¥35-60
TF 卡16GB Class 10 以上¥15-25
串口转 USB 模块CH340 / CP2102(3.3V 电平)¥8-15
5V 电源USB-C 或 Micro USB,≥2A¥10-20
网线Cat5e 以上(用于网络下载包)¥5-10
主机Ubuntu 20.04/22.04 虚拟机或物理机(建议 ≥8GB 内存,50GB 磁盘)

注意:串口模块必须是 3.3V 电平版本!5V 电平直接接到 H616 的 TTL 串口上会把芯片烧掉,这不是开玩笑。

主机环境准备

Buildroot 需要在 Linux 环境下编译。推荐 Ubuntu 20.04 或 22.04,以下命令一次性装好所有依赖:

sudo apt update
sudo apt install -y build-essential bc cpio python3 python3-pip \
  git wget curl unzip rsync bzip2 gzip file patch \
  libncurses5-dev libssl-dev flex bison

确认 GCC 版本 ≥ 4.8:

gcc --version

获取 Buildroot 源码

推荐使用最新的稳定版本:

# 下载最新稳定版 tarball(2026 年可用版本)
wget https://buildroot.org/downloads/buildroot-2026.02.tar.xz
tar xf buildroot-2026.02.tar.xz
cd buildroot-2026.02

# 或者直接从 Git 克隆(开发版)
# git clone https://git.buildroot.org/buildroot
# cd buildroot

配置 Buildroot

Buildroot 提供了很多预设的 defconfig。查看跟全志相关的配置:

make list-defconfigs | grep -i orange

输出大概长这样:

orangepi_one_defconfig
orangepi_pc_defconfig
orangepi_zero_defconfig
orangepi_zero2_defconfig

H616 对应的就是 orangepi_zero2_defconfig。加载这个预设:

make orangepi_zero2_defconfig

接下来用 menuconfig 进一步定制:

make menuconfig

几个关键配置项值得注意:

Target options:

  • Target Architecture 选 AArch64 (little endian)
  • Target Architecture Variant 选 cortex-A53

Toolchain:

  • Toolchain type 保持 Buildroot toolchain(让 Buildroot 自己生成交叉编译工具链)
  • C library 选 glibc(功能最全)或 musl(更轻量)
  • Kernel Headers 选与你要编译的内核版本匹配

System configuration:

  • System hostname 改成你想要的名字,比如 h616-board
  • Root password 设置一个(否则串口登录没密码,不安全)
  • Run a getty 选上 ttyS0 作为串口控制台

Kernel:

  • 勾选 Linux Kernel
  • Kernel version 选 Custom Git repository,填 linux-sunxi 的仓库地址
  • Defconfig name 填 sun50i-h616

Target packages: 按需勾选你需要的软件包,比如:

  • sshopenssh(远程登录)
  • Networking applicationsiproute2, ethtool, iperf3
  • Development toolsgcc, make, strace(调试用)

配置完成后保存退出,Buildroot 会自动生成 .config 文件。

开始编译

make

这步是纯等待。第一次编译会下载所有源码并生成交叉编译工具链,耗时大概 30 分钟到 2 小时不等(取决于网络速度和 CPU 核心数)。Buildroot 不支持 make -jN 顶层并行,但内部编译子项目时会自动并行。

编译完成后的产物目录:

output/images/
├── Image              # Linux 内核镜像
├── rootfs.ext4        # ext4 根文件系统
├── rootfs.tar         # tar 格式根文件系统
├── sdcard.img         # 完整 SD 卡镜像(包含分区表)
└── sunxi-boot.bin     # 引导加载程序

核心就是 sdcard.img,直接烧到 TF 卡就能用。

制作启动 SD 卡

插入 TF 卡后,先确认设备名(千万别搞错,否则可能把系统盘擦掉):

lsblk
# 假设你的 TF 卡是 /dev/sdb

烧录镜像:

sudo dd if=output/images/sdcard.img of=/dev/sdb bs=4M status=progress conv=fsync

烧录完成后安全弹出:

sudo sync
sudo eject /dev/sdb

连接串口并首次启动

把 TF 卡插到 H616 开发板上,连接串口线:

串口模块引脚H616 引脚
TXDRXD(通常是引脚 8)
RXDTXD(通常是引脚 10)
GNDGND(引脚 6)
VCC不接! 只用 USB 供电

打开串口终端(波特率 115200):

# 方式一:使用 minicom
minicom -D /dev/ttyUSB0 -b 115200

# 方式二:使用 screen
screen /dev/ttyUSB0 115200

# 方式三:使用 picocom(推荐,轻量)
picocom -b 115200 /dev/ttyUSB0

接通开发板电源,你应该能看到 U-Boot 加载、内核解压、文件系统挂载的完整启动日志。看到 login: 提示符就说明成功了!

默认用户名为 root,密码是你之前在 menuconfig 里设置的那个。

常见问题排查

问题 1:编译报错 “gcc: Command not found”

主机没装 build-essential,补装:

sudo apt install build-essential

问题 2:下载超时,部分源码包拉不下来

Buildroot 会尝试从多个源下载源码,但有些源在国内访问很慢。可以在 menuconfig → Global build settingsDownload location 里添加镜像源,比如设置环境变量:

export BR2_DL_DIR=$HOME/buildroot-dl

或者手动下载缺失的包放到 dl/ 目录下。

问题 3:编译中途 OOM(内存不足)

Buildroot 编译过程比较吃内存,尤其是同时编译 GCC 和 Glibc 时。如果虚拟机内存只有 4GB,建议加到 8GB 以上。临时方案是增加 swap:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

问题 4:串口无输出

检查以下几点:

  1. TXD/RXD 是否接反了(TX 接 RX,RX 接 TX)
  2. 串口模块是否为 3.3V 电平
  3. minicom/picocom 波特率是否设为 115200
  4. 有些开发板的串口默认被禁用了,需要在 U-Boot 里确认

问题 5:内核启动后卡住(Kernel panic)

通常是因为设备树(DTB)不正确。H616 有多个板型变种,确认你选的 defconfig 与实际硬件匹配。可以在 U-Boot 命令行检查 DTB:

=> fatls mmc 0:1
# 查看 boot 分区里的 dtb 文件

问题 6:无法通过 SSH 登录

默认配置可能没勾选 OpenSSH。回到 make menuconfig → Target packages → Networking applications → 勾选 openssh,然后 make 重新编译。

后续进阶方向

成功跑起来之后,你可以继续探索:

  1. 添加自定义软件包:在 Buildroot 的 package/ 目录下创建新的 *.mkConfig.in 文件,把你的应用程序打包进根文件系统
  2. 优化体积:把 C library 换成 musl,去掉不需要的内核模块,根文件系统可以从几百 MB 压到几十 MB
  3. 构建外部树:使用 BR2_EXTERNAL 机制把自定义配置和软件包与 Buildroot 源码解耦,方便版本管理
  4. CI 集成:Buildroot 完全支持无头编译,放到 Jenkins/GitLab CI 里做自动化构建
  5. 尝试其他芯片:Buildroot 支持超过 30 种架构,STM32MP1、Rockchip RK3568、NXP i.MX 系列都有对应配置

小结

Buildroot 是入门嵌入式 Linux 最友好的工具,没有之一。用 make defconfig + make menuconfig + make 三步走,就能从零构建出完整的交叉编译工具链、内核和根文件系统。配合 H616 这种便宜的 ARM 开发板,你可以用极低的成本学习嵌入式 Linux 的整个工具链。

下次我们讲讲怎么在 Buildroot 里添加自定义的 C 应用程序,以及如何优化根文件系统的体积。如果你已经成功跑起来了,欢迎在评论区分享你的经验!