1.什么是sparse格式
常用系统镜像格式为原始镜像,即RAW格式。镜像体积比较大,在烧录固件或者升级固件时比较耗时,而且在移动设备升级过程时比较耗费流量。为此,将原始镜像用稀疏描述,可以大大地缩减镜像体积,省时省流量。
原始镜像:即raw image,完整的ext4分区镜像,包含很多全零的无效填充区
稀疏镜像:即sparse image,将raw ext4进行稀疏描述,因此尺寸比较小,制作目录有多少文件就计算多少,没有全零填充
原理图如下:
稀疏镜像格式图如下:
稀疏镜像数据格式:首先是sparse_header占用28byte,然后是12byte的chunk_header,同样这chunk_header的类型决定了后面跟着的数据,如果读到数据是0xCAC1意味着后面是本身的raw_data,如果是0xCAC3,则后面num为0,接着再0xCAC2意味着后面填充4byte的内容。
2.sparse格式镜像的生成和烧录
make_ext4fs用于Android平台上制作ext4文件系统的镜像 make_ext4fs -l 128M -s roofs.ext4.img rootfs -l 128M:ext4文件系统分区大小 rootfs.ext4:生成ext4文件系统的目标文件 rootfs:生成ext4文件系统的源目录 -s sparse格式 -a root 是指这个img用于Linux根文件系统 挂载点为/。 -a system 即表示为android系统,挂载点即是/system。使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限。 -L 设置标签 -T 时间戳(需要给个数字)
可以使用simg2img将simg(sparse ext4 image)还原为raw ext4 image,再像raw image 那样烧写。 simg2img roofs.simg rootfs.ext4
生成sparse格式的命令 dd if=/dev/zero of=fs.img bs=1M seek=1024 count=0 另外使用truncate命令可以随意调节文件大小(如果该文件不存在则会自动创建),比如: truncate --size 1T fs.img 烧录镜像 sudo dd if=boot.img.raw of=/dev/sda2 status=progress oflag=direct conv=sparse 与sparse相关的命令
- cp: $ cp --sparse=always file file.sparse cp缺省使用--sparse=auto,会自动探测源文件中是否有空洞,以决定目标文件是否为稀疏文件;使用--sparse=never会禁止创建稀疏文件。
- cpio: $ find file |cpio -pdmuv --sparse /tmp 如果不加--sparse参数,稀疏文件中的空洞将被填满。
- tar: $ tar cSf - file | (cd /tmp/tt; tar xpSf -) 如果不加 -S --sparse参数,稀疏文件中的空洞将被填满。
3.差分的验证
make_ext4fs -l 500M boot.img.raw.old boot_LS_arm64_lts_5.10/ 修改boot_LS_arm64_lts_5.10这个目录 make_ext4fs -l 500M boot.img.raw.new boot_LS_arm64_lts_5.10/
sudo dd if=boot.img.raw.old of=/dev/sda1 status=progress conv=sparse
bsdiff boot.img.raw.old boot.img.raw.new boot.patch
sudo bspatch /dev/sda1 /dev/sda1 boot.patch
mount sda1后验证文件修改是对的