Hombre de UNIX desde hace mucho tiempo aquí, pero relativamente nuevo en el mundo de Android. Sigue leyendo.
EPISODIO 1: Una nueva copia de seguridad (esperaba)
Recientemente compré un Asus MemoPAD (ME103K); Luego me convertí en root y tomé una dd
imagen de la system
partición de solo lectura en 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 debió a la partición FAT32 en la tarjeta SD?
No, no se tune2fs -l
reveló que se trataba de una imagen EXT4 válida, exactamente del tamaño de 2GiB, que pasó fsck -f
sin ningún error. Y fastboot
(desde la máquina Linux conectada a la tableta) coincidió, después de un 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
Entonces, todo está bien: tengo una copia de seguridad de la imagen. Ahora para probar restaurarlo.
Intento actualizar el sistema .img de nuevo a la tableta, para asegurarme de que puedo recuperarme de cualquier cosa, el tipo de copia de seguridad a prueba de balas que hacemos en el mundo Unix ( por ejemplo, restaurar el contenido de una unidad a través dedd if=backup.image of=/dev/sdXXX
).
Todo lo relacionado adb
y fastboot
funciona perfectamente, 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 android-tools-5.1.1
mi distribución desde las fuentes, agregando información de depuración, y paso al depurador para ver este error:
linuxbox# gdb --args fastboot flash system system.img
...
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, se considera negativo, para ser exactos) -2147483648
.
Bien, bien, ¿cómo muestran archivos de imágenes grandes en Android?
Buscar en Google, buscar: resulta que usan esta make_ext4fs
herramienta, que crea imágenes flasheables. De hecho, es parte de lo que acabo de compilar, por lo que 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, por lo que aparentemente puedo construir imágenes del sistema a partir de carpetas antiguas simples. El cielo será mi límite. Podré agregar lo que quiera a esta imagen.
Vamos a quemarlo ...
linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [ 0.064s]
sending 'system' (2088960 KB)...
^C
Esperé 1 hora antes de presionar Ctrl-C. Y tuvo que apagar y encender la tableta, que se reinició en modo fastboot.
Esto no pinta bien.
¿Qué pasa si construyo una imagen más pequeña? Tal vez los 2GB son 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
Bien, esto parece muy prometedor (y solo tomó 5 minutos). Supongo que ahora puedo reiniciar y todo debería ser normal, ¿sí?
No :-)
No me importa un dispositivo de ladrillo temporalmente, siempre y cuando no llegue a controlarlo en el extremo (máquinas que no soy un maestro de, son máquinas que no me interesa para operar ;-)
¿Alguna idea sobre lo que hice mal y qué puedo hacer para solucionar esto?
Gracias por adelantado.
PD: Revisé la página de soporte de Asus para mi tableta: solo proporcionan las fuentes para el kernel y el archivo .zip por aire. Eso a su vez contiene una copia de seguridad a nivel del sistema de archivos desde la raíz, es decir, la system
carpeta existe allí solo como una carpeta, no una imagen, no una system.img
que pueda flashear, por lo que eso realmente no me ayuda.
EPISODIO 2: Ataque de las botas personalizadas
En ausencia de cualquier tipo de recovery.img
Asus (¿por qué un fabricante se molestaría en publicar un flash de arranque rápido flasheable recovery.img
? solo.
Afortunadamente, el archivo de actualización inalámbrica de Asus incluye dentro ...
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 arranque de mi tableta. Ahora tal vez, solo 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
Configuré default.prop
ser root cuando arranca el kernel:
ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled
También copié /system/bin/sh
( desde el archivo .zip de Asus por aire ) en /sbin/sh
. Hice lo mismo con busybox , una herramienta bastante útil.
Y volvió a empacar el boot.img ...
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 ejecuté esto, ya que bootimg.cfg
tenía que actualizarse; el bootsize
parámetro tenía que cambiarse, ya que el paquete ahora es más grande. abootimg
informa lo que necesita, por lo 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 ... ¿Quizás adbd no se ejecuta como root?
linuxbox# adb root
restarting adbd as root
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Bien ... heededit adbd, y parche / system / bin / sh para ser / sbin / sh (copié / system / bin / sh de la imagen OTA a los rootfs del initrd): reinicio, arranque rápido ...
linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -
Maldito. ¿Es esta cosa 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
OK, entonces / system está montado. ¿Puedo ver lo que hay dentro?
linuxbox# adb pull /system
remote object '/system' does not exist
Qué ... Tal vez pueda comprobar qué contiene / proc / kmsg (qué "dmesg" generarí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 ...
fastboot
todavía está operativo (responde bien a las solicitudes) y, por lo tanto, puedo grabar cualquier imagen de recuperación, (a) busqué y no encontré ninguna imagen de recuperación CWM o TWRP para ME103K - Supongo que no hay uno "genérico" al que te refieres, ¿existe? (b) Apagar, presionar el botón de encendido + bajar el volumen no muestra la imagen de recuperación; todavía llego al estado de inicio rápido. Mo idea por qué. De hecho, nunca he visto el proceso de recuperación (algo curioso de verlo) ...
fastboot boot <FILE>.img
), luego flashear todo el archivo ZIP de stock. Alternativamente, vea si existe (en la web) los archivos ROM de stock que pueden actualizarse mediante fastboot.
unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery
muestra solo un par de scripts de shell; lo echaré un vistazo, pero definitivamente no recovery.img
hay ninguno ). Buscar en Google tampoco ayudó: no hay imágenes de recuperación de esta tableta en ningún lado ... Supongo que tendré que esperar a que un alma amable llegue a dd
su partición de recuperación y comparta.