保姆级教程:在Firefly RK356x开发板上提取并替换Ubuntu根文件系统(附打包工具下载)
深度定制Firefly RK356x开发板从根文件系统提取到完整镜像打包实战指南当你拿到一块Firefly RK356x开发板时预装的Ubuntu系统可能无法满足你的特定需求。无论是需要精简系统、添加自定义软件包还是集成专有驱动替换根文件系统都是嵌入式开发中的常见操作。本文将带你完整走一遍从提取原始根文件系统到生成定制镜像的全过程避开那些官方文档没提到的坑。1. 准备工作与环境搭建在开始操作之前确保你已准备好以下工具和环境Firefly RK356x开发板已刷入官方Ubuntu固件至少32GB容量的U盘或移动硬盘用于存放提取的根文件系统一台x86架构的PC用于后续的镜像打包操作Ubuntu 20.04 LTS虚拟机推荐使用VirtualBox或VMware重要提示整个流程涉及两个不同的环境——开发板上的ARM环境和PC上的x86环境。混淆这两个环境是新手最容易犯的错误之一。安装必要的工具链# 在开发板的Ubuntu系统中执行 sudo apt update sudo apt install -y fireflydev e2fsprogsfireflydev是Firefly官方提供的开发工具包包含了我们需要的根文件系统导出脚本。而e2fsprogs则提供了后续处理镜像文件所需的工具。2. 提取原始根文件系统提取根文件系统是整个流程中最耗时的步骤可能需要1-3小时不等具体取决于你的存储设备速度。首先将U盘或移动硬盘插入开发板并确认挂载点lsblk假设你的设备挂载在/media/firefly/USB_DISK使用以下命令导出根文件系统sudo ff_export_rootfs /media/firefly/USB_DISK这个过程中有几个关键点需要注意存储空间导出的rootfs.img文件通常有2-4GB大小确保你的存储设备有足够空间稳定性建议使用有线网络连接避免在导出过程中断电进度监控虽然命令看起来会卡住但实际上是在后台运行可以通过另一个终端查看进度sudo tail -f /var/log/syslog | grep ff_export_rootfs导出完成后我们需要对镜像进行优化处理# 检查文件系统一致性 sudo e2fsck -p -f /media/firefly/USB_DISK/rootfs.img # 缩小镜像体积 sudo resize2fs -M /media/firefly/USB_DISK/rootfs.img注意resize2fs操作可能会失败如果遇到couldnt find valid filesystem错误尝试先运行e2fsck -y修复文件系统。3. 定制你的根文件系统现在你可以将rootfs.img复制到PC上进行定制。这里推荐使用qemu-user-static在x86环境下运行动臂架构的根文件系统# 在PC的Ubuntu虚拟机上执行 sudo apt install -y qemu-user-static # 挂载并chroot进入ARM环境 mkdir -p /mnt/rootfs sudo mount -o loop rootfs.img /mnt/rootfs sudo cp /usr/bin/qemu-arm-static /mnt/rootfs/usr/bin/ sudo chroot /mnt/rootfs在chroot环境中你可以像在开发板上一样安装软件、修改配置# 示例安装常用工具 apt update apt install -y vim tmux htop # 示例添加自定义用户 useradd -m myuser passwd myuser完成修改后退出并卸载文件系统exit sudo umount /mnt/rootfs4. 使用官方工具重新打包完整镜像Firefly提供了firefly-linux-repack工具用于固件的解包和重新打包。这个工具只能在x86环境下运行。首先下载并解压打包工具假设已下载到~/Downloadstar -xzf ~/Downloads/firefly-linux-repack.tgz cd firefly-linux-repack工具目录结构如下firefly-linux-repack/ ├── unpack.sh ├── pack.sh ├── output/ └── tools/关键步骤解析准备原始固件将官方下载的完整固件如Firefly-RK356x_Ubuntu20.04_20230810.img复制到工具目录并重命名为update.img解包原始固件./unpack.sh解包后会生成output目录其中包含固件的各个组成部分output/ ├── Image/ │ ├── boot.img │ ├── kernel.img │ └── rootfs.img # 这就是我们要替换的文件 └── update.sh替换根文件系统将你定制好的rootfs.img复制到output/Image/目录覆盖原有文件重新打包./pack.sh打包完成后会在当前目录生成new_update.img这就是包含你定制内容的完整固件。5. 烧录测试与问题排查使用RKDevTool将new_update.img烧录到开发板开发板进入Loader模式通常需要按住Recovery键同时按Reset在RKDevTool中选择固件文件点击升级按钮常见问题及解决方案表常见烧录问题排查指南问题现象可能原因解决方案设备无法识别驱动未安装安装Rockchip USB驱动烧录失败镜像损坏重新打包并验证MD5系统无法启动rootfs不兼容检查架构是否匹配ARM64启动卡在LOGO内核不匹配使用原版boot.img和kernel.img如果系统成功启动恭喜你完成了整个定制流程不过在实际项目中你可能还需要调整分区大小修改parameter.txt更新内核或U-Boot添加预装脚本/etc/rc.local6. 高级技巧与自动化方案对于需要频繁定制系统的开发者可以考虑以下优化方案批量处理脚本示例#!/bin/bash # 自动化打包脚本 set -e ORIGINAL_IMGupdate.img CUSTOM_ROOTFScustom_rootfs.img OUTPUT_IMGcustom_firmware_$(date %Y%m%d).img # 解包 ./unpack.sh # 替换rootfs cp $CUSTOM_ROOTFS output/Image/rootfs.img # 重新打包 ./pack.sh # 重命名输出文件 mv new_update.img $OUTPUT_IMG根文件系统瘦身技巧# 清理APT缓存 sudo apt clean # 删除文档和man页面 sudo find /usr/share/doc -type f -delete sudo rm -rf /usr/share/man/* # 清除日志 sudo journalctl --vacuum-size50M增量更新方案对于小型修改可以考虑只更新特定文件而非整个rootfs将修改的文件打包成tar.gz在开发板上创建启动脚本应用这些更改将更新包和脚本放入/etc/init.d/这种方法特别适合频繁更新的开发阶段可以节省大量烧录时间。7. 性能优化与系统调优定制系统不仅仅是替换文件还需要考虑性能优化。以下是一些针对RK356x的建议配置内存管理优化# /etc/sysctl.conf 添加 vm.swappiness10 vm.vfs_cache_pressure50IO调度器设置# 针对eMMC/SD卡优化 echo deadline /sys/block/mmcblk0/queue/schedulerGPU加速配置# 确保Mali驱动正确加载 apt install mali-bifrost-wayland-driver温度监控# 安装传感器工具 apt install lm-sensors sensors-detect在实际项目中我们还需要考虑开机自启动服务优化systemd-analyze blame安全加固禁用root登录、配置防火墙无线网络预配置/etc/netplan/这些调优可以使你的定制系统在RK356x开发板上运行得更加高效稳定。