2 votos

¿Cómo crear un archivo de imagen dispersa a partir del firmware original?

Accidentalmente borré la partición /system y ahora tengo mi teléfono Gionee S10C brickeado.

Descargué el firmware original, pero solo puedo ver una serie de archivos de imagen del sistema. (Este firmware debe ser utilizado por Qualcomm Flash Image Loader)

system_1.img, system_2.img, ..., system_53.img

Cuando intento instalar el firmware original utilizando QFIL colocando el teléfono en modo EDL, obtengo un error de sahara fail. (Mismo error que se encuentra aquí y he probado la mayoría de las soluciones que he encontrado, pero nada funciona)

Ahora, ¿hay alguna forma de utilizar las 53 imágenes del sistema mencionadas anteriormente para restaurar mi teléfono utilizando el comando fastboot flash?

Estoy seguro de que solo es necesario restaurar la partición system para que mi teléfono vuelva a funcionar, ya que no he modificado ninguna otra partición.

3voto

alecxs Puntos 29

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

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X