从Ubuntu 16.04到自定义Rootfs:Firefly-RK3399系统镜像DIY全记录
从Ubuntu 16.04到自定义Rootfs:Firefly-RK3399系统镜像DIY全记录
在嵌入式开发领域,Firefly-RK3399凭借其强大的六核ARM架构和丰富的扩展接口,成为众多开发者的首选平台。然而,官方提供的Ubuntu 16.04镜像往往无法满足特定项目需求——要么包含过多冗余软件包,要么缺少关键开发工具。本文将带你从零开始,构建一个完全定制的根文件系统,摆脱预装系统的束缚,打造专属于你的高效开发环境。
1. 环境准备与基础概念
在开始构建自定义Rootfs之前,需要明确几个核心概念。Rootfs(根文件系统)是Linux系统中包含所有必要目录结构和文件的集合,从/bin、/lib到/etc,构成了操作系统运行的基础环境。与直接修改现有系统不同,我们将采用更彻底的方案——从Ubuntu Base开始全新构建。
所需工具清单:
- 运行Ubuntu或Debian的x86_64主机(物理机或虚拟机)
- 至少20GB可用磁盘空间
- 已安装的
qemu-user-static和binfmt-support - Firefly-RK3399的官方内核镜像(可从官网获取)
提示:虽然RK3399采用ARM64架构,但通过QEMU的用户态模拟,我们可以在x86主机上直接执行ARM64指令,极大简化了交叉编译的复杂度。
2. 构建基础Rootfs
2.1 下载Ubuntu Base
Ubuntu Base是最小化的根文件系统,去除了所有图形界面和大部分应用软件,只保留核心组件。访问Ubuntu官方仓库获取最新版本:
wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.4-base-arm64.tar.gz注意:虽然示例使用20.04版本,但实际应根据项目需求选择。较新版本通常有更好的硬件支持和更长的维护周期。
解压并进入Rootfs目录:
mkdir custom_rootfs sudo tar xzf ubuntu-base-20.04.4-base-arm64.tar.gz -C custom_rootfs cd custom_rootfs2.2 配置QEMU静态二进制
为了让x86主机能够执行ARM64环境下的操作,需要注册QEMU解释器:
sudo cp /usr/bin/qemu-aarch64-static usr/bin/ sudo mount --bind /dev dev sudo mount --bind /proc proc sudo mount --bind /sys sys3. 定制Rootfs内容
3.1 基础系统配置
使用chroot进入ARM64环境开始定制:
sudo chroot . /bin/bash在chroot环境中,首先配置APT源并安装基础工具:
echo "deb http://ports.ubuntu.com/ubuntu-ports focal main universe" > /etc/apt/sources.list apt update apt install -y sudo vim net-tools iputils-ping wget curl常用软件栈选择:
- 开发环境:
build-essentialcmakegitpython3-dev - 网络工具:
openssh-servertcpdumpnetcat - 调试工具:
gdbstraceltrace
3.2 用户与权限设置
创建管理员用户并设置密码:
useradd -m -s /bin/bash developer usermod -aG sudo developer passwd developer配置SSH服务允许远程登录:
mkdir /home/developer/.ssh chmod 700 /home/developer/.ssh4. 制作系统镜像
4.1 创建空白镜像文件
退出chroot环境后,使用dd创建适当大小的镜像文件:
dd if=/dev/zero of=rootfs.img bs=1M count=2048 mkfs.ext4 -F -L rootfs rootfs.img挂载镜像并复制Rootfs内容:
mkdir rootfs_mount sudo mount rootfs.img rootfs_mount sudo cp -a custom_rootfs/* rootfs_mount/ sudo umount rootfs_mount4.2 打包完整系统镜像
Firefly-RK3399使用Rockchip专有的镜像格式,需要下载官方打包工具:
wget https://github.com/rockchip-linux/rkbin/raw/master/tools/rkImageMaker chmod +x rkImageMaker准备内核镜像(假设为kernel.img)和参数文件,然后执行打包:
./rkImageMaker -RK3399 kernel.img rootfs.img update.img最终生成的update.img即可通过Firefly提供的刷机工具写入设备。
5. 高级定制技巧
5.1 系统服务优化
对于嵌入式设备,通常需要精简不必要的服务以提升启动速度。使用systemd分析工具:
systemd-analyze blame systemd-analyze critical-chain可以安全禁用的常见服务包括:
apt-daily.service:自动更新检查systemd-timesyncd.service:若无网络时间同步需求ModemManager.service:无蜂窝模块时
5.2 存储性能调优
针对eMMC/SD卡特性,可以调整文件系统挂载参数。编辑/etc/fstab:
LABEL=rootfs / ext4 defaults,noatime,nodiratime,commit=60,data=writeback 0 1关键参数说明:
noatime/nodiratime:减少元数据更新commit=60:延长日志提交间隔data=writeback:更激进的写入策略
6. 常见问题排查
6.1 启动失败分析
如果设备无法正常启动,可以通过串口控制台获取内核日志:
[ 1.200000] Initramfs unpacking failed: junk in compressed archive [ 1.210000] Failed to execute /init (error -2)常见原因及解决方案:
- Rootfs损坏:重新制作镜像并验证文件完整性
- 内核与Rootfs不匹配:确保使用相同架构(ARM64)的组件
- 缺少关键设备文件:检查
/dev目录下的console和null设备
6.2 网络配置问题
静态IP配置示例(/etc/network/interfaces):
auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1测试网络连通性:
ip link show eth0 ping -c 4 192.168.1.17. 自动化构建方案
对于需要频繁重建Rootfs的场景,可以编写脚本自动化整个过程。以下是一个简单的构建脚本框架:
#!/bin/bash # 定义变量 ROOTFS_SIZE=2048 UBUNTU_BASE_URL="http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.4-base-arm64.tar.gz" # 下载和解压Ubuntu Base wget $UBUNTU_BASE_URL mkdir -p custom_rootfs sudo tar xzf $(basename $UBUNTU_BASE_URL) -C custom_rootfs # 配置QEMU sudo cp /usr/bin/qemu-aarch64-static custom_rootfs/usr/bin/ # 挂载必要目录 sudo mount --bind /dev custom_rootfs/dev sudo mount --bind /proc custom_rootfs/proc sudo mount --bind /sys custom_rootfs/sys # chroot并安装软件 sudo chroot custom_rootfs /bin/bash <<EOF apt update apt install -y sudo ssh vim useradd -m -s /bin/bash developer exit EOF # 创建镜像文件 dd if=/dev/zero of=rootfs.img bs=1M count=$ROOTFS_SIZE mkfs.ext4 -F -L rootfs rootfs.img在实际项目中,我发现将构建过程分为多个阶段(基础系统、通用工具、项目特定组件)可以显著提高迭代效率。每次只需要重新构建变更的部分,然后通过文件系统快照快速组合成最终镜像。
