17 votos

Intentando flashear un sistema.img que tomé con dd - fallando

Un viejo amigo de UNIX, pero relativamente nuevo en el mundo de Android. Sigue leyendo.

EPISODIO 1: Una nueva copia de seguridad (esperaba)

Recientemente he comprado un Asus MemoPAD (ME103K); luego me convertí en Root, y tomé un dd la imagen de la lectura de sólo system de la partición de la tarjeta SD externa:

$ su
# dd if=/dev/block/platform/msm_sdcc.1/by-name/system \
         of=/storage/MicroSD/system.img bs=1M
# ls -l /storage/MicroSD/system.img
-rw-r--r-- 1 root root 2147483648 Sep 27 13:15 system.img

El tamaño (exactamente 2GiB) era un poco sospechoso - ¿podría ser que esto se debiera a la partición FAT32 de la tarjeta SD?

No, no fue tune2fs -l reveló que esta era, de hecho, una imagen EXT4 válida, con un tamaño exacto de 2GiB, que pasó fsck -f sin ningún tipo de error. Y fastboot (de la máquina de linux conectada a la tablet) coincidió, después de una adb reboot bootloader :

linuxbox# fastboot getvar all
(bootloader)  version-bootloader: 3.03
(bootloader)  version-hardware: rev_c
(bootloader)  variant: LEOPARDCAT 16G
(bootloader)  version-baseband: H00_0.16.F_0521
(bootloader)  serialno: 0a3dXXXX
...
(bootloader)  partition-type:system: ext4
(bootloader)  partition-size:system: 0x0000000080000000

Ese tamaño, es de hecho 2GB:

linuxbox# python2 -c 'print 0x0000000080000000'
2147483648

Así que todo está bien, tengo una copia de seguridad de la imagen. Ahora para probar la restauración.

Trato de flashear el system.img de vuelta a la tablet - para asegurarme de que puedo recuperarme de cualquier cosa, el tipo de respaldo a prueba de balas que hacemos en el mundo Unix ( por ejemplo, restaurar el contenido de una unidad a través de dd if=backup.image of=/dev/sdXXX ).

Todo lo relacionado con adb y fastboot trabajar sin problemas, así que intento...

linux_box# fastboot devices
0a3dXXXX     fastboot

linux_box# mount /dev/sdcard /mnt/sdcard
linux_box# cp /mnt/sdcard/system.img .
linux_box# fastboot flash system system.img
error: cannot load 'system.img'

Hmm. Descargo y construyo el android-tools-5.1.1 de mi distribución de fuentes, agregando información de depuración - y paso en el depurador, para ver este fallo:

linuxbox# gdb --args fastboot flash system system.img
...

Failure due to negative size!

Interesante - aunque estoy en una máquina de 64 bits, aparentemente hay problemas que hacen que el tamaño del archivo sea "negativo" (en un mundo de 32 bits, el tamaño del archivo de mi imagen, 2^31, es de hecho considerado negativo - para ser exactos, -2147483648 .

Vale, bien ¿cómo hacen para mostrar grandes archivos de imagen en Android?

Buscando en Google, buscando resulta que usan esto make_ext4fs que crea imágenes flash. De hecho, es parte de lo que acabo de compilar, así que también podría usarlo:

linuxbox# mkdir /system
linuxbox# mount -o loop,ro system.img /system
linuxbox# ls -l /system
total 208
drwxr-xr-x 106 root root   8192 Sep 17 22:24 app
drwxr-xr-x   3 root 2000   8192 Sep 26 21:08 bin
-rw-r--r--   1 root root   6847 Sep 12 16:59 build.prop
drwxr-xr-x  19 root root   4096 Sep 26 21:08 etc
drwxr-xr-x   2 root root   4096 Aug 11 22:27 fonts
drwxr-xr-x   4 root root   4096 Sep 12 16:56 framework
drwxr-xr-x  10 root root  16384 Sep 12 16:59 lib
drwxr-xr-x   2 root root   4096 Jan  1  1970 lost+found
drwxr-xr-x   3 root root   4096 Aug 11 22:18 media
drwxr-xr-x  59 root root   4096 Aug 11 22:29 priv-app
-rw-r--r--   1 root root 126951 Aug  1  2008 recovery-from-boot.p
drwxr-xr-x   3 root root   4096 Aug 11 21:02 scripts
drwxr-xr-x   3 root root   4096 Aug 11 21:02 tts
drwxr-xr-x  11 root root   4096 Sep 26 21:08 usr
drwxr-xr-x   8 root 2000   4096 Aug 11 22:29 vendor
drwxr-xr-x   2 root 2000   4096 Sep 26 21:09 xbin

linuxbox# ../extras/source/extras/ext4_utils/make_ext4fs \
      -l 2048M new_system.img /system
Creating filesystem with parameters:
    Size: 2147483648
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 8192
    Label: 
    Blocks: 524288
    Block groups: 16
    Reserved block group size: 127
Created filesystem with 2666/131072 inodes and 375014/524288 blocks

Genial, así que aparentemente puedo construir imágenes del sistema a partir de simples carpetas. El cielo será mi límite. Podré añadir lo que quiera a esta imagen.

Quemémoslo...

linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [  0.064s]
sending 'system' (2088960 KB)...
^C

Esperé una hora antes de pulsar ese Ctrl-C. Y tuve que hacer un ciclo de energía con la tablet, que volvió a arrancar en modo de arranque rápido.

Esto no se ve bien.

¿Y si construyo una imagen más pequeña? Tal vez los 2 GB son de alguna manera un problema, y esta partición no se utiliza a plena capacidad - tiene espacio libre:

linuxbox# ../extras/source/extras/ext4_utils/make_ext4fs \
      -l 1536M new_system.img /system

linuxbox#  ./fastboot flash system system.img 
erasing 'system'...
OKAY [  0.065s]
sending 'system' (1572864 KB)...
OKAY [ 51.039s]
writing 'system'...
OKAY [235.080s]
finished. total time: 286.183s

OK, esto parece muy prometedor (y sólo tomó 5 minutos). Supongo que ahora puedo reiniciar y todo debería ser normal, ¿sí?

No :-)

enter image description here

No me importa un dispositivo de ladrillo temporal, siempre y cuando hacer llegar a controlarlo al final (las máquinas de las que no soy un maestro, son máquinas que no me importa operar ;-)

¿Alguna idea de lo que hice mal y de lo que puedo hacer para arreglar esto?

Gracias de antemano.

P.D. Revisé la página de soporte de Asus para mi tablet, sólo proporcionan las fuentes del núcleo, y el archivo .zip Over-the-air. Que a su vez contiene una copia de seguridad a nivel de sistema de archivos de root - es decir, el system existe allí como una carpeta, no una imagen, no una system.img que puedo tener un flash, así que eso no me ayuda mucho.

EPISODIO 2: Ataque de las botas personalizadas

En ausencia de cualquier tipo de recovery.img de Asus (¿por qué un fabricante se molestaría en publicar un flash de arranque rápido recovery.img ? ¿Por qué? y una ausencia similar en las imágenes de recuperación de los sitios CWM y TWRP... ...me quedo solo en la batalla.

Afortunadamente, el archivo de actualización de Asus incluye en su interior...

linuxbox# unzip -l /opt/Asus/firmware/UL-K01E-WW-12.16.1.12-user.zip |\
     grep boot.img$
7368704  2011-03-22 11:21   boot.img

...la imagen de la bota de mi tablet. Ahora tal vez - sólo tal vez - puedo hacer algo con esto.

linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage

Expandiendo el ramdisk...

linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop

Yo preparé default.prop para ser Root cuando el núcleo arranque:

ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled

También copié /system/bin/sh ( del archivo .zip de Asus en el aire ) en /sbin/sh . Hice lo mismo con busybox - una herramienta bastante práctica.

Y reempaquetó la bota...

busybox$ find . | cpio --create --format='newc' | gzip -9 > ../initrd.custom.gz
busybox$ cd ..
busybox$ abootimg --create ../new_boot_busybox.img \
    -f bootimg.cfg -k zImage -r initrd.custom.gz

abootimg en realidad falló la primera vez que dirigí esto, ya que bootimg.cfg tuvo que ser actualizado - el bootsize el parámetro tuvo que ser cambiado, ya que el paquete es más grande ahora. abootimg informa de lo que necesita, así que es bastante fácil.

Y ahora, arranco mi imagen personalizada...

linuxbox# fastboot boot new_boot_busybox.img

...y ser testigo de lo siguiente...

linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -

linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -

Hmm... ¿Tal vez el ADB no se ejecuta como Root?

linuxbox# adb root
restarting adbd as root

linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -

Bien... Hexedito adbd, y parcheo /sistema/bin/sh para que sea /sbin/sh (copié el /sistema/bin/sh de la imagen OTA a las root del initrd): Reiniciar, arrancar rápido...

linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -

Maldición. ¿Esta cosa es capaz de hacer algo?

linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)

Es... veamos:

linuxbox# adb pull /proc/mounts
16 KB/s (1358 bytes in 0.079s)

linuxbox# grep system mounts
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0

Bien, entonces el sistema es montado. ¿Puedo ver lo que hay dentro?

linuxbox# adb pull /system
remote object '/system' does not exist

¿Qué...? Tal vez pueda comprobar lo que contiene /proc/kmsg (lo que "dmesg" produciría)

linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted

No, necesito ser Root para hacer eso.

linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied

Y eso también.

Esto está resultando ser todo un rompecabezas...

2 votos

Lo único bueno que no hiciste aquí (y que deberías haber hecho) es flashear un Recovery personalizado y luego tomar un nandroid copia de seguridad de las particiones de la misma. Ese es uno de los métodos a prueba de balas por ahí para recuperar los dispositivos de tal estado bricked. Ese Over-the-air.zip (OTA zip) es un zip flashable de recuperación, es decir, para ser flasheado cuando se arranca en la recuperación y siguen un formato de embalaje diferente, pero logra el mismo objetivo. Resumiendo, flashea un Recovery personalizado (o arranca en uno de stock), flashea la ROM de stock y luego experimenta todo lo que quieras.

1 votos

@Firelord: Esa es la cuestión, aunque fastboot sigue funcionando (responde a las peticiones sin problemas) y por lo tanto puedo grabar cualquier imagen de recuperación, (a) He buscado y no he encontrado ninguna imagen de recuperación CWM o TWRP para ME103K - Supongo que no hay una "genérica" a la que te refieres, ¿verdad? (b) Apagar, pulsar el botón de encendido + volumen hacia abajo no trae la imagen de recuperación - Yo todavía sólo llegar al estado fastboot. Ni idea de por qué. De hecho, nunca he visto el proceso de recuperación (un poco de curiosidad por verlo) ...

1 votos

Prueba otras combinaciones de botones como Power+Vol Up+Vol Down para arrancar en modo Recovery. Si tienes acceso al Recovery ZIP de stock, puede que haya un archivo de imagen del Recovery de stock en algún lugar que puedas flashear desde fastboot o arrancar directamente en él ( fastboot boot <FILE>.img ), y luego flashear todo el archivo ZIP de stock. Alternativamente, ver si existe (en la web) los archivos de la ROM de stock que se puede flashear usando fastboot.

8voto

Adrian Pirvulescu Puntos 3671

Episodio 3: El regreso de la concha.

Si alguna vez tenía alguna posibilidad de resolver esto, primero tenía que averiguar por qué el proyectil no funcionaba. adbd estaba respondiendo, así que empezó en el lado de la tablet - pero no pudo ejecutar el shell, incluso cuando lo parcheé para invocar un archivo ( /sbin/sh ) que yo mismo coloqué en la imagen de la bota - estando 100% seguro de que tenía los permisos adecuados y era accesible desde el shell (id=2000) cuenta que adbd usos.

Lo que dejó una sola explicación: las "jaulas" de SELinux.

Así que comprobé cómo adbd se inició a partir de la imagen de mi bota init.rc :

# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
    class core
    socket adbd stream 660 system system
    disabled
    seclabel u:r:adbd:s0

...e intentó un cambio obvio:

service adbd /sbin/adbd
    class core
    socket adbd stream 660 system system

Volví a empaquetar, y para mi intensa satisfacción, vi...

linuxbox# adb shell
$ 

Finalmente conseguí acceso a la tablet desde "dentro".

Comprobando el sistema de montaje, quedó claro que el proceso de parpadeo, aunque fastboot flash system ... informó que todo estaba bien - había fallado espectacularmente . Era una maravilla que la partición estuviera montada en primer lugar.

Eso explicaba por qué la tablet no arrancaba, y me dio la idea final que resolvía el problema.

Necesitaba arrancar la tablet para que usara mi copia prístina de la partición /sistema, pero en este punto, aunque tenía acceso al shell, no era Root - ( los cambios que hice en default.prop ...son aparentemente ignorados por el núcleo de Asus. Tendré que recomponerlo pronto... ) así que no pude montar la tarjeta SD externa y dd sobre mi copia buena.

Pero tenía mi propia imagen de arranque, lo que significaba que podía editar el /fstab.qcom dentro de ella, y hacer esto:

La línea original que le decía a la tablet cómo montar el sistema

/dev/block/platform/msm_sdcc.1/by-name/system  /system  ext4 ro,barrier=1 wait

Mi edición

/dev/block/mmcblk1p2  /system ext4  rw,barrier=1 wait

...y de vuelta en mi caja de linux, yo... dd -hizo la copia de seguridad prístina de la partición del sistema de la tablet a la 2ª partición de mi tarjeta SD externa -que creé a través de gparted para ser exactamente 2GB.

Eso fue todo, la tablet arrancó desde mi tarjeta SD externa.

EDITAR : El viaje continuó - yo eventualmente remendé y compilé mi propio núcleo y me convertí en Root .

2 votos

Lo juro por el episodio 4, habría ofrecido una recompensa si no se publicara esta respuesta, por la diversión de todos estos episodios. Es bueno ver que resolvió su problema por su cuenta. :D

2 votos

@Firelord: Gracias, amigo. En el proceso, creo que hice algo bastante genial - arranqué mi tablet sin tocar sus entrañas ... la imagen de arranque viene desde el exterior (sobre fastboot boot ... ) y el /system La partición está en la tarjeta SD, modificable a lo que yo quiera. Algo así como, arrancar un PC desde una memoria USB :-)

4voto

kittachami Puntos 31

Parece que ya has encontrado algún tipo de solución a tu problema (hay mucho texto para leer en esta página), pero parece que esto probablemente podría haberse resuelto de forma mucho más sencilla.

linuxbox# fastboot getvar all
(bootloader)  version-bootloader: 3.03
(bootloader)  version-hardware: rev_c
(bootloader)  variant: LEOPARDCAT 16G
(bootloader)  version-baseband: H00_0.16.F_0521
(bootloader)  serialno: 0a3dXXXX
...
(bootloader)  partition-type:system: ext4
(bootloader)  partition-size:system: 0x0000000080000000

Entre estas variables, ¿su tablet devolvió una max-download-size variable? Si es así, eso podría haber proporcionado una advertencia, directamente, de que el proceso de parpadeo podría tener algunos problemas con una imagen tan grande. El código de arranque rápido actual está hecho para trabajar alrededor de una max-download-size que es demasiado pequeño, pero he experimentado su mismo error incluso cuando la imagen es más pequeña de lo que el dispositivo dice que puede manejar, así que en realidad el punto es algo discutible, supongo.

linux_box# fastboot flash system system.img  
error: cannot load 'system.img'

Así que, de todos modos, parece aquí, que por cualquier razón, eres incapaz de flashear. Si tú y yo estamos en lo cierto, y se trata del tamaño (tu tablet sólo tiene 1 GB de RAM, y supuestamente la mayoría de los dispositivos tratan de leer toda la imagen en la RAM antes de parpadear ), aquí es donde creo que el mero ajuste de añadir el -S la opción de arranque rápido podría haber arreglado tu flash como lo ha hecho para mí:

fastboot -S 512M flash system system.img  

Sin embargo, parece que ha intentado forzar su imagen de 2 GB a un tamaño en el que (1) podría no ser posible meterla y (2) no es el tamaño que se supone que tiene la partición del sistema de su dispositivo.

  • En cuanto al punto 1, en mi experiencia, no contaría con el Androids frágiles construyen herramientas para quejarse si les pides que hagan algo en lo que fallarán, y es posible que tengan aquí.

  • En cuanto al punto 2, no creo que no puedas hacer eso; se requerirían pasos adicionales para usar un sistema diferente tamaño de la partición.

Asumiendo que su tablet espera archivos de imagen escasos, creo que el comando que quería probar en lugar de make_ext4fs -l 1536M new_system.img /system fue make_ext4fs -l 2048M -s new_system.img /system . El comando ajustado haría una imagen que se infla al tamaño correcto, pero se almacena temporalmente despojada de cualquier exceso de grasa como grandes bolsas de datos vacías: un " escasos archivo de imagen" (ver la página a la que he enlazado antes para más información sobre ellos; no tengo suficiente reputación en este sitio para repetir el enlace).

Este viejo léeme que alguien escribió para una colección de herramientas debería ayudar a entender cómo va el proceso.

Salud.

1 votos

Gracias por responder. En cuanto a sus preguntas, (1) no, no había max-download- cualquier cosa en la salida de getvar . (2) Tendré en cuenta la -S en mis futuros flashes - tal y como está, una vez que arranqué, me convertí en Root (mediante la recompilación de mi kernel) y dd -ed sobre la antigua partición del sistema, así que si el flasheo con -S funcionaría tendrá que esperar a mis próximas pruebas (3) Lo intenté con imágenes dispersas, obtuve el mismo resultado (es decir. fastboot informó de que el flasheo estaba bien, pero la partición del sistema estaba estropeada).

1 votos

@ttsiodras No hay problema. He aprendido algunas cosas en el proceso. (1) Ah, vale. Dudaba que lo hiciera, ya que al menos en mi dispositivo usando la build de fastboot que tengo instalada, esa variable se imprime la primera en la lista (gracias, por cierto, por demostrarlo all se puede pasar a getvar eso es útil). (2) Ohh, vale. Si funciona, avísanos. (3) ¡Ups! No me había fijado en eso. Es mucho texto, lo siento. ¿Se mencionó eso en tus posts? (¿Era como el comando make_ext4fs que sugerí, con -s y la longitud total de 2 GiB especificada). Tal vez la tablet no lo hace tratar con archivos dispersos.

1 votos

(3) sí, he aprobado -s a make_ext4fs - fastboot reportó 'OK' para quemar, pero /system estaba desordenado. Mi teoría es que, como dijiste, cualquier cosa más grande que la memoria de la tablet (1GB) no funcionaría, y necesitaba el -S en fastboot para que funcione correctamente (lo que explica el estado medio roto - la partición estaba montada porque la primera parte de la imagen cabía en la memoria y estaba realmente quemada, lo que permitía montarla - pero los archivos dentro de ella estaban... corrompidos aleatoriamente, dependiendo de si sus sectores estaban quemados o no).

2voto

Metalx1000 Puntos 11

Con mi Moto G creé una copia de seguridad usando dd como tú lo hiciste. Necesitaba restaurar mi partición del sistema el otro día, así que arranqué el TWRP (no lo flasheé, sólo arranqué la imagen a la RAM). Luego usé adb para conectarme mientras TWRP se ejecutaba y sólo empujé la imagen que hice con dd a mi tarjeta SD y luego usé dd para escribir la imagen en la partición del sistema.

Mira los videos que he hecho sobre esto aquí: https://youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq

0 votos

Por desgracia, eso no me ayuda - no puedo llegar a la recuperación de mi tablet no importa qué combinación de teclas que he intentado (en contraste, lo conseguí inmediatamente en mi MotoG2 - por lo que la recuperación de esta tablet es hosed de alguna manera). Puedo flashear la partición de recuperación (ya que flashboot está operativo) pero no tengo recovery.img de Asus, y tampoco existe CWM o TWRP (para un ME103K).

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