- smb/resources/embedded/rootfs-build-methods/README.md
- smb/resources/embedded/rootfs-build-methods/other-methods.md
- smb/resources/embedded/rootfs-build-methods/快速命令.md
RootFS 构建方法全景
构建 ARM64 嵌入式 Linux rootfs 的完整方法论
方法对比
| 方法 | 定位 | 复杂度 | 构建速度 | 定制粒度 | 学习价值 |
|---|---|---|---|---|---|
| Buildroot | 嵌入式事实标准 | ⭐⭐ | 快 | 包级别 | ⭐⭐⭐ |
| Yocto/OpenEmbedded | 商业级工业级 | ⭐⭐⭐⭐ | 慢 | 源码级别 | ⭐⭐⭐⭐ |
| Debootstrap | Debian系根文件系统 | ⭐ | 较快 | 系统级别 | ⭐⭐ |
| Busybox | 最小根文件系统 | ⭐ | 快 | 配置级别 | ⭐⭐ |
| Alpine + apk | 容器镜像主流 | ⭐ | 快 | 包级别 | ⭐ |
| 纯手工制作 | 教学理解原理 | ⭐⭐⭐⭐ | 慢 | 完全控制 | ⭐⭐⭐⭐⭐ |
配套实操教程:
核心概念
RootFS 是什么
根文件系统,Linux 启动后第一个挂载的目录 /,包含:
/bin/sbin/usr- 命令和工具/lib- 动态库/etc- 配置文件/dev- 设备节点/proc/sys/run- 虚拟文件系统
构建方式分类
┌─────────────────────────────────────────────────────────────┐
│ RootFS 构建方法 │
├─────────────────┬─────────────────┬─────────────────────────┤
│ 发行版构建 │ 嵌入式框架 │ 手工构建 │
│ (Debootstrap) │ (BR/Yocto) │ (busybox+交叉编译) │
├─────────────────┼─────────────────┼─────────────────────────┤
│ 基于 Debian APT │ 基于配方(recipe) │ 完全自定义 │
│ 直接 apt install │ bitbake/make │ 手动复制工具和库 │
│ 依赖生态完整 │ 高度可定制 │ 理解原理最佳 │
└─────────────────┴─────────────────┴─────────────────────────┘
交叉编译 vs Native 编译
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 交叉编译 | x86 机器编译 ARM64 程序 | 主流方式,效率高 |
| Native 编译 | ARM64 机器上直接编译 | 简单但慢 |
| CROOS-compile | 使用 qemu-user 模拟 | 教学/测试 |
环境说明
- 构建主机: Mac Mini M4 (ARM64)
- 构建环境: Docker 容器
- 目标架构: ARM64 (aarch64)
- 目标设备: RK3588 / RK3562 等
工具链版本(官方)
| 工具 | 版本 | 来源 |
|---|---|---|
| Buildroot | 2024.08 LTS | buildroot.org |
| Yocto/Poky | 5.0 (Scarthgap) | yoctoproject.org |
| Debian | 12 (Bookworm) | debian.org |
其他方法概览(概念了解)
Busybox
定位:最简根文件系统,适合超级资源受限设备
核心特点:
- 单一二进制提供大部分 Unix 工具(ls, cp, mv, cat, grep 等)
- 体积极小(约 1MB)
- 需要手动创建
/etc配置文件 - 适合教学和深度理解 Linux 启动流程
基本流程:
# 下载
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
# 静态编译
make defconfig
make CONFIG_STATIC=y
# 安装到 rootfs
make CONFIG_PREFIX=/path/to/rootfs install
适用场景:Bootloader 调试、最小化 initramfs、教学理解 Linux 启动、超低成本 MCU + Linux SoC
Alpine Linux + apk
定位:容器镜像主流选择,轻量、安全
核心特点:
- 极小基础镜像(约 5MB)
- musl libc(非 glibc)
- apk 包管理器
- 安全优先设计
- Docker 官方镜像基础
基本流程:
# 下载 Alpine minirootfs
wget https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/aarch64/alpine-minirootfs-3.19.1-aarch64.tar.gz
# 解压
mkdir -p /path/to/rootfs
tar -xzf alpine-minirootfs-3.19.1-aarch64.tar.gz -C /path/to/rootfs
# 进入
chroot /path/to/rootfs /bin/sh
# 使用 apk
apk add nginx python3
适用场景:Docker 容器、边缘计算、Kubernetes Pods、Serverless 函数
Ubuntu Base
定位:桌面/服务器标准系统
核心特点:完整 Ubuntu 系统、Canonical 官方支持、Snap 支持、标准化工具链
基本流程:
# 下载 Ubuntu base
wget https://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04.5-base-arm64.tar.gz
# 解压
mkdir -p /path/to/rootfs
tar -xzf ubuntu-base-22.04.5-base-arm64.tar.gz -C /path/to/rootfs
# 使用 qemu-debootstrap(跨架构)
apt-get install qemu-user-static
qemu-debootstrap --arch arm64 jammy /path/to/rootfs http://archive.ubuntu.com/ubuntu/
适用场景:桌面系统、服务器、需要完整 GNU 工具链、开发工作站
openWrt
定位:路由器和网络设备专用
核心特点:针对网络设备优化、opkg 包管理器、LuCI Web 配置界面、网络功能丰富、UCI 统一配置
基本流程:
# 安装 SDK
wget https://downloads.openwrt.org/releases/23.05.3/targets/armvirt/64/openwrt-sdk-23.05.3-armvirt-64_gcc-12.3.0_musl.Linux-x86_64.tar.xz
tar xJf openwrt-sdk-*.tar.xz
cd openwrt-sdk-*
# 配置并构建
make menuconfig
make -j$(nproc)
适用场景:路由器、交换机、防火墙、网络网关
纯手工制作
定位:教学理解原理
完全手动构建,理解 Linux 系统各组件:创建基础目录结构、编译或获取 static busybox、创建 /dev 设备节点、配置 /etc 文件、安装 C 库和编译器、配置网络和启动服务。
最小化示例:
# 1. 创建目录
mkdir -p rootfs/{bin,sbin,etc,proc,sys,dev,lib,usr/{bin,sbin},var/log}
# 2. 安装 busybox
cp busybox rootfs/bin/
ln -s busybox rootfs/bin/sh
ln -s busybox rootfs/bin/ls
# 3. 创建设备节点
mknod rootfs/dev/console c 5 1
mknod rootfs/dev/null c 1 3
# 4. 创建 init
cat > rootfs/sbin/init << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
exec /bin/sh
EOF
chmod +x rootfs/sbin/init
# 5. 复制 C 库
cp /path/to/arm64-glibc/lib/*.so* rootfs/lib/
适用场景:理解 Linux 启动原理、极端定制需求、教学演示、安全研究(最小攻击面)
方法选择指南
场景
│
├─ 商业产品/车规/工规
│ └─ Yocto/OpenEmbedded ⭐⭐⭐
│
├─ 快速原型/资源受限设备
│ └─ Buildroot ⭐⭐⭐
│
├─ 需要 Debian 生态
│ └─ Debootstrap/Multistrap ⭐⭐⭐
│
├─ Docker 容器镜像
│ └─ Alpine (apk) / Ubuntu Base ⭐⭐
│
├─ 路由器/网络设备
│ └─ openWrt ⭐⭐
│
└─ 教学/理解原理
└─ Busybox 手工制作 ⭐
构建命令速查
Buildroot
# 1. 下载
wget https://buildroot.org/downloads/buildroot-2024.08.tar.gz
tar xzf buildroot-2024.08.tar.gz
cd buildroot-2024.08
# 2. 配置
make <board>_defconfig # 使用预置配置
make menuconfig # 交互式配置
# 3. 编译
make -j$(nproc)
# 4. 产物
# output/images/rootfs.tar
# output/images/rootfs.ext4
Yocto/OpenEmbedded
# 1. 下载 Poky
git clone -b scarthgap https://git.yoctoproject.org/poky
# 2. 初始化
source poky/oe-init-build-env
# 3. 配置
# 编辑 conf/local.conf 设置 MACHINE
# 4. 编译
bitbake core-image-minimal
# 5. 产物
# tmp/deploy/images/<machine>/*.ext4
Debootstrap
# 1. 基础构建
debootstrap --arch arm64 bookworm /path/to/rootfs http://deb.debian.org/debian
# 2. 复制 QEMU(跨架构)
cp /usr/bin/qemu-aarch64-static /path/to/rootfs/usr/bin/
# 3. 进入 chroot
chroot /path/to/rootfs /bin/bash
# 4. 打包
tar --numeric-owner -cvzf rootfs.tar.gz -C /path/to/rootfs .
通用操作
# 挂载 rootfs
mount -o loop image.ext4 /mnt/rootfs
# 解压到 rootfs
tar -xzf rootfs.tar.gz -C /mnt/rootfs
# 进入 chroot
mount -t proc proc /mnt/rootfs/proc
mount -t sysfs sys /mnt/rootfs/sys
mount --bind /dev /mnt/rootfs/dev
chroot /mnt/rootfs /bin/bash
# SD 卡操作
dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=2048
fdisk /dev/mmcblk0 # 创建分区
mkfs.ext4 /dev/mmcblk0p2
mount /dev/mmcblk0p2 /mnt/rootfs
tar -xzf rootfs.tar.gz -C /mnt/rootfs
QEMU 测试
# ARM64 虚拟机
qemu-system-aarch64 \
-M virt \
-cpu cortex-a53 \
-m 512M \
-kernel Image \
-append "root=/dev/vda console=ttyAMA0" \
-drive file=rootfs.ext4,if=vda,format=raw \
-nographic
# 使用 runqemu (Yocto)
runqemu qemuarm64 nographic