根文件系统构建
1. 概述
1.1 功能简介
根文件系统(Rootfs)是 Linux 系统启动后挂载的第一个文件系统,包含操作系统运行所需的所有用户空间程序、库、配置文件和工具。RK3576 Linux SDK 支持两种根文件系统方案:Buildroot(轻量级嵌入式)和 Debian(通用桌面级),开发者可根据产品需求灵活选择。
1.2 应用场景
| 根文件系统 | 适用场景 | 特点 |
|---|---|---|
| Buildroot | 存储受限的嵌入式设备、IoT 终端、工业控制 | 体积小(~64MB~256MB),启动快,定制灵活 |
| Debian | 桌面级应用、多媒体终端、AI 边缘计算 | 生态丰富,apt 包管理,易于开发调试 |
1.3 工作原理
根文件系统构建的核心流程为:工具链 → 基础系统 → 软件包安装 → 文件系统镜像生成。Buildroot 使用 Makefile/Kconfig 系统自动下载源码、交叉编译并打包;Debian 使用 live-build 和 debootstrap 创建基础 Debian 系统,再叠加 Rockchip 定制的 deb 包。
原理类内容优先引用 RK 官方文档,此处仅做要点提炼。 详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 存储设备 | eMMC / SD 卡(16GB+) | 1 | 保存根文件系统 |
| 电源适配器 | 5V 电源适配器(Type-C 或 6pin 输入) | 1 | 空载最小 1000mA |
2.2 硬件确认
# 确认当前根文件系统信息
df -h
# 查看根文件系统类型
mount | grep " / "
# 查看分区表
cat /proc/partitions3. 软件准备
3.1 开发环境
- Ubuntu 20.04/22.04 LTS(64 位)
- RK3576 Linux SDK 已正确配置
- 磁盘空间充足(Buildroot 需 ~20GB,Debian 需 ~40GB)
3.2 依赖包安装
# Buildroot 通用依赖
sudo apt-get install sed make binutils build-essential gcc g++ bash \
patch gzip bzip2 perl tar cpio unzip rsync file bc wget python3
# Debian 构建额外依赖
sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i debian/ubuntu-build-service/packages/*
sudo apt-get install -f3.3 SDK 目录结构(根文件系统相关)
<SDK>/
├── buildroot/ # Buildroot 构建系统
│ ├── configs/ # 默认配置
│ │ └── rockchip_rk3576_defconfig
│ ├── output/ # 编译输出
│ │ ├── rockchip_rk3576/ # 目标镜像
│ │ └── build/ # 编译中间文件
│ ├── package/ # 软件包定义
│ │ ├── rockchip/ # Rockchip 专用包
│ │ └── ... # 上游包
│ └── dl/ # 下载的源码包
├── debian/ # Debian 构建脚本
│ ├── mk-base-debian.sh # 基础 Debian 系统构建
│ ├── mk-rootfs-bullseye.sh # Bullseye 根文件系统构建
│ ├── mk-image.sh # Ext4 镜像生成
│ ├── overlay/ # 板级覆盖文件
│ ├── packages/ # Rockchip 定制 deb 包
│ └── ubuntu-build-service/ # 构建服务工具RK3576 SDK 使用 Debian 11 bullseye,具体 Debian 版本以实际发布的 RK3576 SDK 为准。
4. 操作步骤
4.1 Buildroot 根文件系统构建
4.1.1 完整编译
cd <SDK_PATH>
# 选择板级配置
./build.sh device/rockchip/rk3576/BoardConfig-rk3576-xxx.mk
# 编译包括 Buildroot 根文件系统的完整系统
./build.sh all
# 或单独编译根文件系统
./build.sh rootfs编译完成后,根文件系统镜像位于:
buildroot/output/rockchip_rk3576/images/rootfs.ext4板级配置文件名称以实际发布的 RK3576 SDK 为准。
4.1.2 配置 Buildroot
# 进入 Buildroot 配置菜单
cd <SDK_PATH>
source envsetup.sh rockchip_rk3576
make menuconfig常用配置项:
| 配置路径 | 说明 |
|---|---|
Target options → Target Architecture | 目标架构(AArch64) |
Build options → Download dir | 源码下载目录 |
Toolchain → Toolchain type | 工具链类型(Buildroot 内部或外部) |
System configuration → Root password | 根用户密码 |
System configuration → /dev management | 设备节点管理方式(devtmpfs/udev/mdev) |
Filesystem images → ext2/3/4 rootfs | 根文件系统镜像格式 |
Target packages → | 选择需要包含的软件包 |
4.1.3 选择软件包
# 在 menuconfig 中,通过以下路径选择软件包
Target packages →
[*] Audio and video applications
[*] gstreamer1
[*] gst1-plugins-base
[*] gst1-plugins-good
[*] gst1-plugins-bad
[*] Debugging tools
[*] strace
[*] gdb
[*] Development tools
[*] git
[*] Networking applications
[*] openssh
[*] dhcpcd4.1.4 使用配置片段
RK3576 SDK 预定义了按功能分类的配置片段:
# 查看可用配置片段
ls buildroot/configs/rockchip/
# adbd.config audio.config base.config benchmark.config bt.config
# camera.config chromium.config debug.config display.config
# game.config gpu.config network.config ...4.1.5 单独编译/重新编译软件包
# 进入 Buildroot 环境
source envsetup.sh rockchip_rk3576
# 编译指定包
make <package>
# 重新编译
make <package>-rebuild
# 重新配置
make <package>-reconfigure
# 完全清理
make <package>-dirclean4.1.6 自定义根文件系统
方法一:添加覆盖文件
在 buildroot/board/rockchip/rk3576/overlay/ 目录下放置文件,这些文件会在编译时自动复制到根文件系统中:
# 创建覆盖文件目录
mkdir -p buildroot/board/rockchip/rk3576/overlay/etc
mkdir -p buildroot/board/rockchip/rk3576/overlay/opt/myapp
# 添加自定义配置文件
echo "my_custom_config" > buildroot/board/rockchip/rk3576/overlay/etc/my_config.conf
# 添加自定义启动脚本
cat > buildroot/board/rockchip/rk3576/overlay/etc/init.d/S99myapp << 'EOF'
#!/bin/sh
case "$1" in
start)
echo "Starting myapp..."
/opt/myapp/myapp &
;;
stop)
killall myapp
;;
*)
exit 1
;;
esac
EOF
chmod +x buildroot/board/rockchip/rk3576/overlay/etc/init.d/S99myapp方法二:使用 post-build 脚本
在 buildroot/board/rockchip/rk3576/post-build.sh 中添加自定义操作:
#!/bin/sh
# post-build.sh: 在构建完成后执行的自定义操作
# 设置 root 密码
echo "root:myrootpassword" | chpasswd -r $TARGET_DIR
# 修改 motd 消息
echo "Welcome to shimetapi RK3576" > $TARGET_DIR/etc/motd
# 移除不需要的文件
rm -rf $TARGET_DIR/usr/share/man
rm -rf $TARGET_DIR/usr/share/doc4.2 Debian 根文件系统构建
4.2.1 一键编译
cd <SDK_PATH>
# 设置环境变量选择 Debian 根文件系统
export RK_ROOTFS_SYSTEM=debian
# 编译完整系统(包含 Debian 根文件系统)
./build.sh all4.2.2 分步构建
cd <SDK_PATH>/debian
# 步骤 1: 构建基础 Debian 系统
sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f
# 64 位 Debian 11 Bullseye
RELEASE=bullseye TARGET=desktop ARCH=arm64 ./mk-base-debian.sh
# 步骤 2: 构建 RK 定制根文件系统
VERSION=debug ARCH=arm64 ./mk-rootfs-bullseye.sh
# 步骤 3: 生成 ext4 镜像
./mk-image.sh输出文件:debian/linaro-rootfs.img
Debian 版本(如 bullseye)与脚本路径以实际发布的 RK3576 SDK 为准。
4.2.3 配置 Debian 镜像源
编辑 debian/ubuntu-build-service/bullseye-desktop-arm64/configure,添加国内镜像源:
--mirror-bootstrap "http://mirrors.ustc.edu.cn/debian" \
--mirror-chroot "http://mirrors.ustc.edu.cn/debian" \
--mirror-chroot-security "http://mirrors.ustc.edu.cn/debian-security" \
--mirror-binary "http://mirrors.ustc.edu.cn/debian" \
--mirror-binary-security "http://mirrors.ustc.edu.cn/debian-security"4.2.4 自定义 Debian 根文件系统
添加软件包:编辑 debian/ubuntu-build-service/bullseye-desktop-arm64/configure,在 --packages 或 --package-lists 中添加所需包。
添加覆盖文件:将文件放入 debian/overlay/ 目录,构建时自动复制到目标系统。
添加启动脚本:编辑 debian/overlay/etc/rc.local 或创建 systemd 服务。
4.3 自定义根文件系统(手动制作)
4.3.1 使用 debootstrap 手动制作
# 安装 debootstrap
sudo apt-get install debootstrap qemu-user-static
# 创建根文件系统目录
mkdir rootfs
sudo debootstrap --arch=arm64 --foreign bullseye rootfs http://mirrors.ustc.edu.cn/debian
# 复制 QEMU 用户态模拟器
sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/
# 进入 chroot 环境完成安装
sudo chroot rootfs /debootstrap/debootstrap --second-stage
# 挂载必要的文件系统
sudo mount --bind /dev rootfs/dev
sudo mount --bind /proc rootfs/proc
sudo mount --bind /sys rootfs/sys
# 配置网络(可选)
echo "nameserver 8.8.8.8" | sudo tee rootfs/etc/resolv.conf
# 安装软件包
sudo chroot rootfs apt-get update
sudo chroot rootfs apt-get install -y openssh-server network-manager
# 生成 ext4 镜像
dd if=/dev/zero of=rootfs.img bs=1M count=2048
mkfs.ext4 rootfs.img
sudo mount rootfs.img /mnt
sudo cp -a rootfs/* /mnt/
sudo umount /mnt4.3.2 使用 BusyBox 制作最小根文件系统
# 下载并编译 BusyBox
wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xf busybox-1.35.0.tar.bz2
cd busybox-1.35.0
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
# 确保选中 "Build BusyBox as a static binary (no shared libs)"
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install
# 创建最小根文件系统
mkdir -p _install/{dev,proc,sys,etc,etc/init.d,lib,usr,var,root,tmp}
cat > _install/etc/inittab << 'EOF'
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
EOF
cat > _install/etc/init.d/rcS << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
mdev -s
EOF
chmod +x _install/etc/init.d/rcS5. 代码详解
5.1 Buildroot 软件包定义
Buildroot 中的每个软件包由三个文件定义:
Config.in - 配置选项:
config BR2_PACKAGE_MYAPP
bool "myapp"
help
My custom application for RK3576.myapp.mk - 构建规则:
MYAPP_VERSION = 1.0
MYAPP_SITE = /path/to/source
MYAPP_SITE_METHOD = local
define MYAPP_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D)
endef
define MYAPP_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/myapp $(TARGET_DIR)/usr/bin/myapp
endef
$(eval $(generic-package))5.2 Buildroot 构建流程
Buildroot 构建流程:
1. 下载源码包到 dl/ 目录
2. 解压到 output/build/<package>-<version>/
3. 配置(configure)
4. 编译(make)
5. 安装到 output/target/ 目录
6. 生成文件系统镜像(rootfs.ext4/rootfs.squashfs 等)5.3 Debian 构建流程
Debian 构建流程:
1. mk-base-debian.sh: 使用 debootstrap + live-build 创建基础 Debian 系统
2. mk-rootfs-bullseye.sh: 叠加 Rockchip 定制包(mpp、libmali、gstreamer 等)
3. mk-image.sh: 将根文件系统打包为 ext4 镜像 (linaro-rootfs.img)6. 常见问题
6.1 Buildroot 编译下载失败
现象: Buildroot 编译时卡在下载软件包,提示超时或连接失败
解决方案:
# 配置 BR2_PRIMARY_SITE 使用国内镜像
BR2_PRIMARY_SITE="https://mirrors.ustc.edu.cn/buildroot"
# 或手动下载并放入 dl/ 目录6.2 Debian 构建报 "noexec or nodev"
现象: Debian 构建时提示 Cannot install into target '.../chroot' mounted with noexec or nodev
解决方案:
mount -o remount,exec,dev /path/to/build/directory6.3 Debian 根文件系统镜像过大
现象: 生成的 linaro-rootfs.img 超过 2GB
解决方案:
# 使用 minimal 变体
RELEASE=bullseye TARGET=minimal ARCH=arm64 ./mk-base-debian.sh6.4 根文件系统无法挂载
现象: 内核启动后提示 VFS: Cannot open root device
解决方案:
# 确保内核配置包含以下选项
CONFIG_EXT4_FS=y
CONFIG_MMC_BLOCK=y相关文档
- Linux_SDK编译 — SDK 编译流程
- 内核配置与裁剪 — 内核配置
- SDK下载与编译环境搭建 — 环境搭建
- 核心板参数 — 硬件事实基线
