3 votos

Cómo restaurar una imagen de la partición de Android desde mi PC linux

He creado una imagen de mi disco flash de mi Nexus 4 como se describe en esta pregunta haciendo

# adb pull /dev/block/mmcblk0 mmcblk0.img

La imagen es totalmente funcional, pero me gustaría empujar esta imagen a mi teléfono y el comando inverso no funciona ya que se queda allí para siempre y no se hace ningún cambio.

# adb push mmcblk0.img /dev/block/mmcblk0

¿Cómo puedo enviar esta imagen a mi teléfono?

5voto

dmars Puntos 11

Tuve este problema tratando de empujar una copia de seguridad de mi Samsung Galaxy S2, utilizando ADB con la herramienta de recuperación CWM (clockworkmod). Al empujar a un archivo de dispositivo, ADB simplemente elimina el archivo de dispositivo de bloque y crea un archivo regular en su lugar, y por lo tanto no hay datos en realidad termina en el dispositivo mmcblk0.

Desgraciadamente, la canalización de la salida de un comando en "adb shell" tampoco está implementada, y la función de sockets unix "adb forward" tampoco parece funcionar, por lo que es difícil recuperar la copia de seguridad en el dispositivo.

La solución es canalizar el archivo de imagen a netcat, y utilizar el reenvío de puertos TCP de ADB para dirigir el flujo a su dispositivo. Sin embargo, si tu CWM/busybox no tiene herramientas de red, también tendrás que descargar la versión binaria estática arm-v7 de busybox con todos los applets desde http://www.busybox.net/downloads/binaries/latest/ para poder ejecutar netcat en su dispositivo.

# wget "http://www.busybox.net/downloads/binaries/latest/busybox-armv7l"

# adb push busybox-armv7l /tmp/busybox

# adb forward tcp:6789 tcp:9876

# adb shell

~ # chmod +x /tmp/busybox

~ # /tmp/busybox nc -l -p 9876 > /dev/block/mmcblk0

Entonces, en un nuevo caparazón:

# dd if=your-image-file.img | nc localhost 6789 &

"dd" es mejor que "cat" porque puedes comprobar el progreso de la copia a intervalos (sustituye 5647 por el PID del comando DD):

# kill -USR1 5647

48+0 records in
47+0 records out
49283072 bytes (49 MB) copied, 17.6145 s, 2.8 MB/s

Tenga en cuenta que escribir en mmcblk0 (o el equivalente en su dispositivo Android) borrará incluso las particiones de arranque y recuperación, por lo que es una gran manera de brickear su dispositivo. Para que conste, mi restauración funcionó bien ;-)

2voto

hongo Puntos 41

He encontrado una solución. Necesitas tener acceso Root para hacerlo. Lo mejor sería arrancar tu Nexus usando una imagen insegura de arranque.

1) He dividido la imagen en trozos más pequeños de esta manera:

# dd bs=4096 count=983040 if=mmcblk0.img of=mmcblk0-0.img
# dd bs=4096 count=983040 skip=983040 if=mmcblk0.img of=mmcblk0-1.img
# dd bs=4096 count=983040 skip=1966080 if=mmcblk0.img of=mmcblk0-2.img
# dd bs=4096 skip=2949120 if=mmcblk0.img of=mmcblk0-3.img

2) He bzip2ado todos los trozos:

# bzip2 -k mmcblk0-0.img
# bzip2 -k mmcblk0-1.img
# bzip2 -k mmcblk0-2.img
# bzip2 -k mmcblk0-3.img

3) He creado un ramdisk en mi Nexus 4:

# adb shell mount -o size=1G -t tmpfs tmpfs /dev/ramdisk

4) He copiado dd y bunzip2 en /dev/ramdisk/

5) He empujado, bunzip2ed y escribió los trozos de imagen en la partición en pedazos

# adb push mmcblk0-0.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-0.img.bz2 | /dev/ramdisk/dd bs=4096 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-0.img.bz2

# adb push mmcblk0-1.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-1.img.bz2 | /dev/ramdisk/dd bs=4096 seek=983040 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-1.img.bz2

# adb push mmcblk0-2.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-2.img.bz2 | /dev/ramdisk/dd bs=4096 seek=1966080 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-2.img.bz2

# adb push mmcblk0-3.img.bz2 /dev/ramdisk
# adb shell "/dev/ramdisk/bunzip2 -c /dev/ramdisk/mmcblk0-3.img.bz2 | /dev/ramdisk/dd bs=4096 seek=2949120 conv=notrunc of=/dev/block/mmcblk0"
# adb shell rm /dev/ramdisk/mmcblk0-3.img.bz2

2voto

wbob Puntos 31

El patrón inicial adb pull/push by-partition-id en la pregunta tiene mérito para entornos de recuperación . Aunque no probé para toda la flash ("mmcblk0"), una copia de seguridad y restauración por partición userdata sí funcionó en un adb activado dentro de un recovery de lineage y "/e/".

El dispositivo es un moto-g4-play "harpia" con cifrado de disco completo de la partición userdata y un esquema de partición de la era Android 6 (sin particiones A/B). El pie de página criptográfico vive en los últimos bytes de la partición y la clave se deriva del hardware, por lo que esto sólo puede ser utilizado para la copia de seguridad / restauración del dispositivo único.

Activar adb en el "Menú Avanzado" del recovery, luego

adb shell ls -l /dev/block/by-name
# note down links for your partition
adb pull /dev/block/by-name/userdata userdata.img
# ... more partitions
# restore userdata again
adb push userdata.img /dev/block/mmcblk0p41

Al pulsar sobre las rutas /dev/block/by-name/ se encontrará con un mensaje de "No hay espacio en el dispositivo" tan pronto como se alcance el tamaño de tmpfs. Necesitaba dirigirme directamente a la partición-id adecuada.

0 votos

¿Qué tal si 'adb pull /dev/block/dm-0' para obtener los datos de usuario descifrados

0 votos

En la recuperación userdata aún no está descifrado+montado, sólo un busybox environ. A continuación, puede montar la partición /system y chroot o LD_LIBRARY_PATH para llegar a un funcional(?) vdc . Cuando lo intenté no pasé de vdc, lo volveré a revisar. Entiendo que querría hacer esto para hacer una migración en lugar de restaurar

0 votos

No sabía que lineageos tuviera esa limitación (nunca he usado ese recovery). sólo conozco el stock recovery (donde adb debe estar deshabilitado) o el twrp recovery (y los clones) con soporte de encriptación

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