Concatenar archivos con dd seek=$offset desde xml y luego convertirlos en sparse con img2simg
rawprogram0.xml
contiene
- nombre de partición: filename="system.img"
- tamaño de partición: num_partition_sectors="8388608"
- desplazamiento de partición: start_sector="1312768"
rawprogram_unsparse.xml
contiene system_1.img - system_53.img
- nombre de archivo: filename="system_1.img"
- tamaño de archivo: num_partition_sectors="262160"
- desplazamiento de archivo: start_sector="1312768"
Nota: no deseamos el desplazamiento, así que restaremos de start_sector
1312768 - 1312768 = 0
- nombre de archivo: filename="system_1.img"
- tamaño de archivo: num_partition_sectors="262160"
- desplazamiento de archivo: start_sector="0"
1576968 - 1312768 = 264200
- nombre de archivo: filename="system_2.img"
- tamaño de archivo: num_partition_sectors="16"
- desplazamiento de archivo: start_sector="264200"
1581024 - 1312768 = 268256
- nombre de archivo: filename="system_3.img"
- tamaño de archivo: num_partition_sectors="256048"
- desplazamiento de archivo: start_sector="268256"
Ahora use el parámetro dd seek
para pegar datos en los desplazamientos adecuados
(el sparse se llena con ceros)
bs=$TAMAÑO_SECTOR_EN_BYTES
seek=$start_sector
count=$num_partition_sectors
dd if=system_1.img count=262160 seek=0 bs=512 of=system_ext4.img
dd if=system_2.img count=16 seek=264200 bs=512 of=system_ext4.img
dd if=system_3.img count=256048 seek=268256 bs=512 of=system_ext4.img
...
dd if=/dev/zero count=0 seek=8388608 bs=512 of=system_ext4.img
el resultado es una imagen de partición ext4 montable
mkdir system
sudo mount -t ext4 -o loop system_ext4.img system
ls system
finalmente este archivo puede ser convertido en sparse con img2simg
sudo apt install -y f2fs-tools android-tools-fsutils android-sdk-platform-tools-common
img2simg system_ext4.img system.img
Script de bash de GNU con sed
#/bin/bash
shopt -s extglob
bs=512
label=system
input=rawprogram0.xml
output=rawprogram_unsparse.xml
source <(sed -nr "s,.*\s(filename=.${label}\.img.)\s.*\s(num_partition_sectors=.[0-9]+.)\s.*\s(start_sector=.[0-9]+.).*,\1; \2; \3;,p" "$input" | head -n1)
out=$filename
off=${start_sector:-0}
end=${num_partition_sectors:-0}
printf '%s\n' "${label}"_+([0-9]).img | cut -d. -f1 | sort -t_ -k2n | xargs -n1 -I_ echo _.img | \
while read -r file
do
source <(sed -nr "s,.*\s(filename=.${file}.)\s.*\s(num_partition_sectors=.[0-9]+.)\s.*\s(start_sector=.[0-9]+.).*,\1; \2; \3;,p" "$output" | head -n1)
dd if="$filename" of="$out" bs=${bs:-512} count=${num_partition_sectors:-0} seek=$((start_sector-off)) status=none || exit 1
echo "filename=$filename num_partition_sectors=$num_partition_sectors start_sector=$((start_sector-off))"
done
dd if=/dev/zero of="$out" bs=${bs:-512} count=0 seek=$end status=none || exit 1
echo "filename=$out num_partition_sectors=$end start_sector=$off"
file "$out"
e2fsck -n "$out" | grep clean || exit 1
mv "$out" "${out%.*}.raw"
img2simg "${out%.*}.raw" "$out" || exit 1
file "$out"
echo "Hecho."
exit 0