JFFS2/Squashfs 编程器固件修改:Ubuntu 22.04 下 3 种文件系统挂载与编辑实战

发布时间:2026/7/10 6:37:17

JFFS2/Squashfs 编程器固件修改:Ubuntu 22.04 下 3 种文件系统挂载与编辑实战 JFFS2/Squashfs 编程器固件修改Ubuntu 22.04 下 3 种文件系统挂载与编辑实战嵌入式设备固件修改是硬件开发者与极客们绕不开的挑战。当我们需要定制路由器、随身WiFi等设备的系统功能时直接操作编程器固件往往是最彻底的解决方案。本文将基于Ubuntu 22.04环境深入讲解JFFS2、Squashfs等嵌入式文件系统的实战处理方法。1. 环境准备与工具链配置工欲善其事必先利其器。在开始操作前我们需要配置完整的工具链。Ubuntu 22.04作为长期支持版本其软件仓库已包含大部分所需工具但仍需额外安装一些关键组件。首先更新软件源并安装基础依赖sudo apt update sudo apt install -y build-essential git python3-pip \ liblzo2-dev zlib1g-dev lzop mtd-utils针对不同文件系统需要分别准备工具Squashfs工具链sudo apt install -y squashfs-toolsJFFS2工具链git clone git://git.infradead.org/mtd-utils.git cd mtd-utils ./autogen.sh ./configure make -j$(nproc) sudo make install提示编译mtd-utils时若出现依赖错误可尝试先安装automake和libtool为方便后续操作建议创建一个专用工作目录mkdir -p ~/firmware_workspace/{original,modified,mount_points} cd ~/firmware_workspace2. MTD分区分析与固件拆分嵌入式设备的编程器固件通常由多个MTD分区组成每个分区可能采用不同的文件系统。我们需要先了解固件结构才能针对性地处理各个分区。使用hexdump快速查看固件头部信息hexdump -C full.bin | head -n 20典型输出可能包含以下关键信息Squashfs魔数hsqsJFFS2魔数0x1985UBI头UBI#更专业的分析可以使用binwalk工具sudo apt install -y binwalk binwalk full.bin示例输出DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 uImage header, header size: 64 bytes... 160 0xA0 LZMA compressed data... 131072 0x20000 Squashfs filesystem... 1048576 0x100000 JFFS2 filesystem...基于分析结果我们可以使用Python脚本精确拆分各分区。以下是一个实用的拆分脚本#!/usr/bin/env python3 import sys import os def split_firmware(input_file, partitions): with open(input_file, rb) as f: data f.read() for name, start, size in partitions: output_path f{name}.bin with open(output_path, wb) as out: out.write(data[start:startsize]) print(fExtracted {output_path} ({size} bytes)) if __name__ __main__: if len(sys.argv) 2: print(fUsage: {sys.argv[0]} firmware.bin) sys.exit(1) # 示例分区表需根据实际binwalk结果调整 partitions [ (kernel, 0x0, 0x20000), (rootfs, 0x20000, 0xE0000), (config, 0x100000, 0x10000) ] split_firmware(sys.argv[1], partitions)3. Squashfs文件系统处理实战Squashfs作为嵌入式设备常用的只读压缩文件系统其处理流程需要解压→修改→重新压缩的完整周期。3.1 解压Squashfs镜像使用unsquashfs工具解压分区unsquashfs -d rootfs rootfs.bin解压后的文件结构示例rootfs/ ├── bin ├── dev ├── etc │ ├── rc.d │ └── config ├── lib └── usr3.2 关键修改点典型修改操作包括删除不必要的系统服务rm -f rootfs/etc/rc.d/S50cloud_service修改启动脚本sed -i s/192.168.1.1/192.168.10.1/ rootfs/etc/config/network添加自定义文件cp ~/custom_script.sh rootfs/usr/bin/ chmod x rootfs/usr/bin/custom_script.sh3.3 重新打包Squashfs使用mksquashfs重新压缩mksquashfs rootfs new_rootfs.bin -comp xz -b 256k -noappend关键参数说明-comp xz使用XZ压缩算法平衡压缩率与速度-b 256k设置块大小为256KB与原始镜像保持一致-noappend强制创建新镜像而非追加注意块大小必须与原始设置一致否则可能导致设备无法启动4. JFFS2文件系统挂载与编辑JFFS2作为嵌入式设备常用的可读写文件系统需要通过特殊方式挂载才能修改。4.1 创建虚拟MTD设备首先加载内核模块并创建虚拟设备sudo modprobe mtdram total_size32768 # 32MB sudo modprobe mtdblock将JFFS2镜像写入虚拟设备sudo dd ifrootfs.jffs2 of/dev/mtdblock04.2 挂载文件系统创建挂载点并挂载mkdir -p ~/firmware_workspace/mount_points/jffs2 sudo mount -t jffs2 /dev/mtdblock0 ~/firmware_workspace/mount_points/jffs2挂载后可像普通目录一样修改内容sudo cp custom_config ~/firmware_workspace/mount_points/jffs2/etc/ sudo chown root:root ~/firmware_workspace/mount_points/jffs2/etc/custom_config4.3 卸载与保存修改完成修改后卸载文件系统sudo umount ~/firmware_workspace/mount_points/jffs2从虚拟设备提取新的JFFS2镜像sudo dd if/dev/mtdblock0 ofnew_rootfs.jffs2清理虚拟设备sudo rmmod mtdblock mtdram5. 固件重组与验证修改完各分区后需要将它们重新组合成完整的编程器固件。5.1 手动合并方法使用dd命令按原始偏移量合并dd ifkernel.bin offull_new.bin convnotrunc dd ifnew_rootfs.bin offull_new.bin seek131072 convnotrunc dd ifconfig.bin offull_new.bin seek1048576 convnotrunc5.2 自动化合并脚本以下Python脚本可实现智能合并#!/usr/bin/env python3 import sys import os def merge_firmware(output_file, partitions): with open(output_file, wb) as out: for name, offset in partitions: with open(name, rb) as f: data f.read() out.seek(offset) out.write(data) print(fMerged firmware saved as {output_file}) if __name__ __main__: partitions [ (kernel.bin, 0), (new_rootfs.bin, 0x20000), (config.bin, 0x100000) ] merge_firmware(full_new.bin, partitions)5.3 固件验证步骤检查文件大小ls -lh full*.bin验证文件头file full_new.bin使用binwalk确认分区结构binwalk full_new.bin6. 常见问题与调试技巧在实际操作中可能会遇到各种意外情况。以下是几个典型问题的解决方案问题1Squashfs解压失败症状unsquashfs: Unknown filesystem type解决方案unsquashfs -f -d rootfs rootfs.bin或尝试不同压缩算法unsquashfs -comp lzo rootfs.bin问题2JFFS2挂载后文件损坏症状挂载后出现乱码或缺失文件解决方案检查镜像大小是否与MTD设备匹配尝试不同的擦除块大小sudo modprobe mtdram total_size32768 erase_size128问题3设备刷入后无法启动排查步骤确认各分区偏移量正确检查文件系统是否对齐到擦除块大小验证bootloader参数是否匹配对于复杂问题可以使用QEMU模拟运行sudo apt install qemu-system-arm qemu-system-arm -M versatilepb -kernel zImage -dtb versatile-pb.dtb -drive filerootfs.ext2,ifscsi -append root/dev/sda consolettyAMA0,115200修改嵌入式固件既需要耐心也需要精确的操作。建议在每次修改前备份原始文件并使用版本控制工具管理修改历史git init git add . git commit -m Initial firmware backup

相关新闻