RootFS 构建方法全景

2026/06/01

RootFS 构建方法全景

构建 ARM64 嵌入式 Linux rootfs 的完整方法论

方法对比

方法定位复杂度构建速度定制粒度学习价值
Buildroot嵌入式事实标准⭐⭐快包级别⭐⭐⭐
Yocto/OpenEmbedded商业级工业级⭐⭐⭐⭐慢源码级别⭐⭐⭐⭐
DebootstrapDebian系根文件系统⭐较快系统级别⭐⭐
Busybox最小根文件系统⭐快配置级别⭐⭐
Alpine + apk容器镜像主流⭐快包级别⭐
纯手工制作教学理解原理⭐⭐⭐⭐慢完全控制⭐⭐⭐⭐⭐

配套实操教程:

核心概念

RootFS 是什么

根文件系统,Linux 启动后第一个挂载的目录 /,包含:

构建方式分类

┌─────────────────────────────────────────────────────────────┐
│                     RootFS 构建方法                          │
├─────────────────┬─────────────────┬─────────────────────────┤
│   发行版构建      │   嵌入式框架     │   手工构建              │
│   (Debootstrap)  │   (BR/Yocto)    │   (busybox+交叉编译)     │
├─────────────────┼─────────────────┼─────────────────────────┤
│ 基于 Debian APT  │ 基于配方(recipe) │ 完全自定义              │
│ 直接 apt install │ bitbake/make    │ 手动复制工具和库         │
│ 依赖生态完整      │ 高度可定制       │ 理解原理最佳            │
└─────────────────┴─────────────────┴─────────────────────────┘

交叉编译 vs Native 编译

模式说明适用场景
交叉编译x86 机器编译 ARM64 程序主流方式,效率高
Native 编译ARM64 机器上直接编译简单但慢
CROOS-compile使用 qemu-user 模拟教学/测试

环境说明

工具链版本(官方)

工具版本来源
Buildroot2024.08 LTSbuildroot.org
Yocto/Poky5.0 (Scarthgap)yoctoproject.org
Debian12 (Bookworm)debian.org

其他方法概览(概念了解)

Busybox

定位:最简根文件系统,适合超级资源受限设备

核心特点:

基本流程:

# 下载
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

定位:容器镜像主流选择,轻量、安全

核心特点:

基本流程:

# 下载 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

参考链接

方法官网文档
Busyboxhttps://busybox.net/https://busybox.net/docs/
Alpinehttps://alpinelinux.org/https://docs.alpinelinux.org/
Ubuntu Basehttps://ubuntu.com/baseimagehttps://ubuntu.com/server/docs
openWrthttps://openwrt.org/https://openwrt.org/docs/
Yoctohttps://yoctoproject.org/https://docs.yoctoproject.org/
Buildroothttps://buildroot.org/https://buildroot.org/docs/