当前位置: 首页 > news >正文

从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-staticbinfmt-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_rootfs

2.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 sys

3. 定制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/.ssh

4. 制作系统镜像

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_mount

4.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)

常见原因及解决方案:

  1. Rootfs损坏:重新制作镜像并验证文件完整性
  2. 内核与Rootfs不匹配:确保使用相同架构(ARM64)的组件
  3. 缺少关键设备文件:检查/dev目录下的consolenull设备

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.1

7. 自动化构建方案

对于需要频繁重建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

在实际项目中,我发现将构建过程分为多个阶段(基础系统、通用工具、项目特定组件)可以显著提高迭代效率。每次只需要重新构建变更的部分,然后通过文件系统快照快速组合成最终镜像。

http://www.jsqmd.com/news/848689/

相关文章:

  • 数智协同,赋能康养服务高效升级
  • 半导体全产业链展会推荐:甄选半导体全产业链展会构建完整发展生态 - 品牌2025
  • 江浙沪区域集装箱模块化建筑服务商综合实力排行:温州大波浪箱、温州大波浪集装箱、温州定制集装箱、温州快拼箱、温州快拼集装箱选择指南 - 优质品牌商家
  • Tampermonkey显示某些URL受到浏览器或设置限制!
  • 鸿蒙数学108篇 第二篇
  • 机器人企业如何用 CRM 优化线索、商机与客户管理
  • Altium Designer 21 多通道设计保姆级教程:用Repeat语句快速搞定4路蜂鸣器模块
  • 高效手机号逆向查询QQ号:Python实战解析与技术揭秘
  • 如何彻底掌控你的微信聊天记录:开源工具WeChatMsg的完整解决方案
  • 2026年4月废料的金回收企业推荐,铱粉回收,诚信经营回收价格很满意 - 品牌推荐师
  • 头歌模型构建 —— Inception
  • 用千问点外卖如何用8元券减免25元的,攻略方法全流程
  • 免费付费谁最值年省420块38小时,2026视频总结软件对比,选错一年白白亏好几百
  • 三分钟搞定安卓连接难题:Windows版ADB驱动一键安装终极指南
  • 深度解析:Copymanga第三方Android客户端架构设计与技术实现
  • OpenPLC Editor:开源工业自动化编程的完整解决方案,告别昂贵商业软件
  • 别再混淆了!一文理清华为云Stack里FusionStorage、OceanStor Pacific与存储服务的对应关系
  • 性能优化与profiling技术 - 打造极致性能
  • 从‘吻压’到‘冷压’:一张图看懂PCB多层板层压的全过程(附避坑点)
  • 【开源首发】双脑 AI 工作流:强制模型隔离 + 省 60% Token,完美替代 CrewAI,支持本地 Ollama 免费跑
  • 2026 AI低代码实测:原理拆解+主流形态,避坑指南
  • QGIS加载高德地图总对不上?手把手教你搞定GCJ02坐标偏移(附插件安装)
  • 国际半导体全产业链展会推荐:深化跨国产业合作拓宽资源对接渠道 - 品牌2025
  • Gmail收件箱正在被重写:Gemini智能回复已悄然启用“情境感知优先级排序”,你却还在手动点击“建议回复”?
  • 北京研华交通工控机
  • 【笔记】旧AI,新人类
  • 红茶哪款好喝?真实测评六款主流红茶,买红茶的避坑指南
  • 别再怪BGA了!从X光图到金相分析,手把手教你排查PCB上那颗‘时好时坏’的芯片
  • 包装草绳哪个好
  • 前端浏览器自动化