嵌入式 Linux 开发中,从源码构建一个系统并让它在硬件上跑起来,是最让人兴奋的时刻。这篇文章将带你一步步完成这个过程,以树莓派为目标硬件,使用 Buildroot 工具链打造一个高度定制的 Linux 系统镜像。这不仅是一篇技术分享,更是一个实操教程,让你真正感受到嵌入式开发的乐趣。无论你是用实体树莓派还是虚拟机,都能跟着本文把系统跑起来!
准备工作:开发环境与硬件
在动手之前,确保你已经准备好以下内容:
开发主机:需要一台运行 Linux 的主机,推荐 Ubuntu,简单易用。如果没有 Linux 环境,可以用虚拟机代替,但要确保虚拟机分配了足够资源(至少 15GB 磁盘空间和多核 CPU)。虚拟机虽方便,但编译速度可能会慢一些,做好心理准备。 硬件(可选):如果你选择用树莓派(比如 Zero W 或 Zero),需要准备一块 SD 卡和一个 FT2232 串口适配器,用于连接串口控制台。如果不想买硬件,虚拟机也能完成实验,我会在文中提供两种方案的指引。 时间:整个过程需要 2-4 小时,包括编译和调试。嵌入式开发是个慢工出细活的过程,边学边玩,别急。 Linux 基础:熟悉基本的 shell 操作,比如 cd
、ls
这些命令。嵌入式开发不要求你是 Linux 大神,但会用终端是必须的。磁盘空间:至少 15GB 空闲空间。编译整个系统镜像虽然最终产物很小,但中间过程会占用不少空间。
准备好这些,咱们就开干!
Buildroot:嵌入式开发的得力助手
Buildroot 是一个专门为嵌入式系统设计的工具链,功能强大又简单易用。它能自动化完成从源码下载到系统镜像生成的全流程,我们可以专注于更有趣的定制工作。相比其他复杂的构建工具,Buildroot 的哲学是 小而美,生成的镜像精简高效。

接下来,我们将通过几个简单步骤,用 Buildroot 给树莓派构建一个 Linux 系统镜像,整个过程只需要 六条命令。

六步构建系统镜像
1. 安装主机工具
首先,需要安装一些 Buildroot 依赖的工具,包括 Git、编译器和一些辅助工具。这些工具是 Buildroot 启动编译的必需品。
在 Ubuntu 上,运行以下命令:
sudo apt install -y git build-essential wget cpio unzip rsync bc libncurses5-dev screen
这条命令会安装 Git(用于下载 Buildroot 源码)、编译器(用于构建交叉编译工具链)、以及 screen
(用于串口调试)。如果是其他 Linux 发行版,命令可能略有不同,比如 CentOS 用 yum
或 dnf
,但核心工具包一致。如果遇到问题,建议查阅 Buildroot 官网的依赖列表。
2. 下载 Buildroot 源码
Buildroot 提供多种获取源码的方式,但最方便的是通过 Git 克隆:
git clone git://git.buildroot.net/buildroot
cd buildroot
这会把 Buildroot 的源码仓库下载到本地。进入 buildroot
目录后,我们需要切换到特定版本,这里用 2019.11.1(截至 2020 年 1 月的最新稳定版):
git checkout 2019.11.1
Git 可能会提示你处于 分离 HEAD 状态,别慌,这是正常现象,说明我们正在使用一个具体的版本标签,而不是某个分支。
3. 配置 Buildroot
Buildroot 提供了针对不同硬件的预置配置文件(defconfig),我们需要根据目标硬件选择合适的配置。对于树莓派 Zero W,运行:
make raspberrypi0w_defconfig
如果是树莓派 Zero 或虚拟机,分别用以下命令:
树莓派 Zero: make raspberrypi0_defconfig
虚拟机: make qemu_x86_64_defconfig
这些配置文件位于 configs/
目录下,定义了目标硬件的默认设置,比如内核版本、文件系统类型等。运行 make xxx_defconfig
后,Buildroot 会生成一个 .config
文件,记录所有配置选项。稍后如果需要调整配置,可以用 make menuconfig
打开图形化配置界面,类似 Linux 内核的配置方式。
4. 编译系统镜像
万事俱备,只欠编译!运行以下命令启动构建:
make
这一步会下载源码、构建交叉编译工具链、编译内核和根文件系统,最后生成 SD 卡镜像(或虚拟机镜像)。整个过程可能需要 2-3 小时,具体取决于你的电脑性能。编译期间需要联网,因为 Buildroot 会从网上下载各种软件包的源码。
Buildroot 工作原理
趁着编译的空档,我们来聊聊 Buildroot 是如何把一堆源码变成可运行的系统镜像的。理解这个过程,能帮你更好地定制系统。
编译流程概览
Buildroot 的核心工作可以分为以下几个阶段:
构建工具链:包括交叉编译器、链接器等,用于编译目标系统的软件。 下载源码:从网上获取内核、库和应用程序的源码。 编译与安装:根据配置,解压源码、打补丁、编译并安装到目标根文件系统目录( output/target/
)。添加配置文件:将设备特定的配置文件复制到根文件系统中。 生成镜像:将根文件系统打包成最终的固件镜像,比如 SD 卡镜像。
这些步骤看似复杂,但 Buildroot 通过脚本自动化完成,我们只需要关注配置和定制。
关键目录解析
Buildroot 源码树中有几个核心目录:
**board/**:存放目标硬件的特定支持文件和脚本。 **configs/**:存放预置配置文件,比如 raspberrypi0w_defconfig
。**package/**:定义了所有软件包的编译规则,Buildroot 2019.11 包含 2289 个软件包,从 Nginx 到游戏引擎一应俱全。 **output/host/**:主机上运行的工具,比如交叉编译器。 **output/target/**:目标系统的根文件系统内容。 **output/images/**:最终生成的镜像文件,比如 SD 卡镜像。
软件包与配置
Buildroot 的软件包(package)是其核心概念,每个软件包定义了如何下载、编译和安装某个软件(比如 BusyBox 或 Linux 内核)。软件包的配置选项用 Kconfig 语言写在 Config.in
文件中,控制是否编译该软件包以及启用哪些功能。
通过 make menuconfig
,你可以调整这些配置,比如添加一个 Web 服务器或禁用不需要的内核模块。配置文件最终保存在 .config
中,make
命令会根据这个文件计算依赖关系,自动按正确顺序编译所有软件包。
启动系统:点亮树莓派
编译完成后,output/images/
目录下会生成一个 SD 卡镜像(sdcard.img
),大小通常只有几十 MB,非常精简。接下来,我们将这个镜像烧录到 SD 卡并启动树莓派。如果用虚拟机,步骤会更简单。
烧录 SD 卡(树莓派)
确认 SD 卡设备名:插入 SD 卡,用
dmesg -w
查看内核日志,找到类似/dev/mmcblk0
的设备名。注意,设备名可能因系统不同而变化,比如可能是/dev/sdX
。务必确认清楚,避免误操作覆盖主机硬盘!烧录镜像:
sudo dd if=output/images/sdcard.img of=/dev/mmcblkX bs=1M status=progress
sync
dd
命令会将镜像写入 SD 卡,sync
确保数据完全写入。完成后,安全弹出 SD 卡并插入树莓派。
连接串口(树莓派)
树莓派的串口通信需要 FT2232 适配器。连接方式如下:
树莓派 GPIO 的 TXD(发送)连接到 FT2232 的 RXD(接收)。 树莓派 GPIO 的 RXD(接收)连接到 FT2232 的 TXD(发送)。 两者的 GND(地线)连接。
连接好后,将 FT2232 插入主机,用 dmesg -w
查看串口设备名,通常是 /dev/ttyUSB0
或 /dev/ttyUSB1
。
启动串口终端:
sudo screen -fn /dev/ttyUSBX 115200
这会以 115200 波特率打开串口控制台。退出 screen
时,按 Ctrl+a
后输入 \
。
启动虚拟机(虚拟机)
如果使用虚拟机,运行以下命令启动 QEMU 模拟器:
output/host/bin/qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda" -net nic,model=virtio -net user
虚拟机启动很快,通常几秒钟就能看到登录提示。
登录系统
无论是树莓派还是虚拟机,启动后你会在串口终端或虚拟机窗口看到类似以下输出:
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.19.66 ...
...
Welcome to Buildroot!
buildroot login:
输入用户名 root(无密码),即可登录。试试 ls /usr/bin
查看系统有哪些命令行工具。如果成功登录,恭喜!你已经从源码构建并启动了一个嵌入式 Linux 系统!
