嵌入式 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: 按需勾选你需要的软件包,比如:
ssh→openssh(远程登录)Networking applications→iproute2,ethtool,iperf3Development tools→gcc,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 引脚 |
|---|---|
| TXD | RXD(通常是引脚 8) |
| RXD | TXD(通常是引脚 10) |
| GND | GND(引脚 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 settings → Download 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:串口无输出
检查以下几点:
- TXD/RXD 是否接反了(TX 接 RX,RX 接 TX)
- 串口模块是否为 3.3V 电平
- minicom/picocom 波特率是否设为 115200
- 有些开发板的串口默认被禁用了,需要在 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 重新编译。
后续进阶方向
成功跑起来之后,你可以继续探索:
- 添加自定义软件包:在 Buildroot 的
package/目录下创建新的*.mk和Config.in文件,把你的应用程序打包进根文件系统 - 优化体积:把 C library 换成 musl,去掉不需要的内核模块,根文件系统可以从几百 MB 压到几十 MB
- 构建外部树:使用
BR2_EXTERNAL机制把自定义配置和软件包与 Buildroot 源码解耦,方便版本管理 - CI 集成:Buildroot 完全支持无头编译,放到 Jenkins/GitLab CI 里做自动化构建
- 尝试其他芯片:Buildroot 支持超过 30 种架构,STM32MP1、Rockchip RK3568、NXP i.MX 系列都有对应配置
小结
Buildroot 是入门嵌入式 Linux 最友好的工具,没有之一。用 make defconfig + make menuconfig + make 三步走,就能从零构建出完整的交叉编译工具链、内核和根文件系统。配合 H616 这种便宜的 ARM 开发板,你可以用极低的成本学习嵌入式 Linux 的整个工具链。
下次我们讲讲怎么在 Buildroot 里添加自定义的 C 应用程序,以及如何优化根文件系统的体积。如果你已经成功跑起来了,欢迎在评论区分享你的经验!