Squashfs中如何定位文件所在块及raw镜像内的字节偏移
获取Raw镜像中Squashfs文件系统内文件的字节偏移
前提
你已经知道Squashfs分区在Raw镜像中的起始偏移(记为PART_OFFSET)。
步骤1:提取Squashfs分区镜像
先把Raw镜像中的Squashfs分区单独导出,方便后续操作:
# 替换PART_SIZE为实际分区大小(可通过fdisk -l raw.img获取) dd if=raw.img of=squashfs.part skip=$PART_OFFSET bs=1 count=$PART_SIZE
步骤2:获取Squashfs关键参数
用unsquashfs -s查看文件系统的核心元数据:
unsquashfs -s squashfs.part
从输出中记录两个关键值:
Block size: 单个数据块的字节数(常见值为131072,即128KB)Data block start: 数据块区域在分区内的起始偏移(将十六进制值转为十进制,比如0x1000对应4096)
步骤3:定位目标文件的起始块号
用unsquashfs -ll列出所有文件的详细存储信息,过滤目标文件:
unsquashfs -ll squashfs.part | grep "/bin/ls"
输出示例:
-rwxr-xr-x root/root 18920 2021-09-01 12:00 bin/ls [block 0x45]
记录这里的块号(将十六进制0x45转为十进制69)。
步骤4:计算文件在分区内的偏移
结合前面的参数计算:
分区内偏移 = Data block start + (块号 × Block size)
示例计算:
分区内偏移 = 4096 + (69 × 131072) = 8948064
步骤5:计算文件在Raw镜像中的总偏移
总偏移为分区起始偏移加上分区内偏移:
总偏移 = PART_OFFSET + 分区内偏移
处理小文件(无独立数据块)
如果目标文件是小文件,unsquashfs -ll输出不会显示[block N],说明文件数据直接存储在inode中。这种情况需要用sqfsdump解析inode:
sqfsdump -i squashfs.part /bin/ls
从输出中找到inode内的数据偏移,再结合inode在分区内的位置计算最终偏移。
内容的提问来源于stack exchange,提问作者J.F.K. W
相关产品推荐
相关产品推荐

