You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将binwalk提取修改后的目录重新打包为.img镜像文件

binwalk提取后目录重打包为.img镜像的可行方案

完全可以实现,核心要抓两个点:匹配原镜像的文件系统格式和打包参数、完整保留原文件的权限、链接属性,不同场景的具体操作如下:

前置准备

  • 先确认原镜像的文件系统类型:如果之前binwalk的提取日志没存,重新跑binwalk 你的原.img文件路径,输出结果里会明确标注识别到的文件系统类型,嵌入式场景最常见的是SquashFS,Linux/安卓镜像常见EXT4、CPIO,引导分区常见VFAT。
  • 针对SquashFS格式,提前查好原镜像的打包参数:执行unsquashfs -s binwalk解出的原始squashfs块文件,记下输出里的压缩算法、块大小,参数不对打出来的镜像设备认不出来。
  • 算下你修改完的目录总大小,打包的时候多留10%~20%的冗余,别卡着大小做,容易写不下。

分场景打包操作

1. SquashFS格式(路由器、嵌入式固件最常用)

直接用mksquashfs工具打包,参数和之前查到的原镜像参数保持一致即可,示例命令:

# 命令格式:mksquashfs [修改后的文件目录] [输出img路径] -comp [压缩算法] -b [块大小] -noappend
mksquashfs ./squashfs-root ./new_firmware.img -comp gzip -b 131072 -noappend

注意:-noappend参数必须加,否则新内容会追加到已有镜像末尾,直接破坏镜像结构。

2. EXT2/EXT3/EXT4格式(Linux发行版镜像、安卓系统分区常用)

两种操作方式选一种即可:

  • 方式一(系统原生命令,所有Linux发行版自带):
    1. 生成指定大小的空镜像文件:
    # count参数对应镜像大小,单位为M,比如count=2048就是生成2G大小的空文件
    dd if=/dev/zero of=./new_system.img bs=1M count=2048
    
    1. 将空文件格式化为对应版本的EXT文件系统:
    # 按需替换为mkfs.ext2/mkfs.ext3,和原镜像的文件系统版本保持一致
    mkfs.ext4 ./new_system.img
    
    1. 挂载空镜像,拷贝修改后的文件(必须保留权限):
    sudo mkdir -p /mnt/temp_img
    sudo mount -o loop ./new_system.img /mnt/temp_img
    # -rp参数表示递归拷贝、保留原文件权限/所有者/时间戳/链接属性
    sudo cp -rp ./修改后的目录/* /mnt/temp_img/
    sync
    sudo umount /mnt/temp_img
    
  • 方式二(专用打包工具,操作更简便):
    安装make_ext4fs工具后直接执行单条命令即可,工具会自动处理格式化、权限保留流程:
    make_ext4fs -l 2048M ./new_system.img ./修改后的目录路径
    

3. CPIO/initramfs格式(系统引导镜像、initrd镜像常用)

进入修改后目录的根路径,直接执行打包命令:

# 未压缩格式
find . | cpio -o -H newc > ../new_boot.img
# gzip压缩格式(大部分发行版initrd默认用该格式)
find . | cpio -o -H newc | gzip > ../new_initrd.img

4. VFAT/FAT32格式(EFI引导分区、小容量存储镜像常用)

操作流程和EXT系列类似:

# 生成空镜像,示例为512M大小
dd if=/dev/zero of=./new_efi.img bs=1M count=512
# 格式化为vfat格式
mkfs.vfat ./new_efi.img
# 挂载后拷贝文件,同步写入后卸载即可
sudo mount -o loop ./new_efi.img /mnt/temp_img
sudo cp -rp ./修改后的目录/* /mnt/temp_img/
sync
sudo umount /mnt/temp_img

关键注意事项

  • 所有拷贝操作禁止用图形界面拖拽文件,很容易丢失权限、链接属性,优先用cp -rp或者rsync -a执行拷贝,否则镜像大概率无法正常启动。
  • 多分区合并的整包img不要直接把整个提取根目录打包:binwalk提取多分区镜像时会把每个分区单独解包,需要把每个分区对应的目录分别打包成分区镜像,再按原镜像的分区偏移用dd命令拼合为完整img,也可以直接替换原img中对应分区的块内容。
  • 如果打包后的镜像无法正常识别,优先核对打包参数(压缩算法、块大小、文件系统版本)和原镜像是否一致,90%以上的识别失败问题都是参数不匹配导致的。

内容的提问来源于stack exchange,提问作者Ahmadreza Vakil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:06:21