Há muito tempo o cara do UNIX aqui, mas relativamente novo no mundo do Android. Continue lendo.
EPISÓDIO 1: Um novo backup (eu esperava)
Eu comprei recentemente um Asus MemoPAD (ME103K); Tornei-me root e tirei uma dd
imagem da system
partição somente leitura para o cartão SD externo:
$ 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
O tamanho (exatamente 2GiB) era um pouco suspeito - poderia ser por causa da partição FAT32 no cartão SD?
Não, não foi tune2fs -l
revelado que se tratava de uma imagem EXT4 válida, exatamente dimensionada em 2GiB, que passou fsck -f
sem nenhum erro. E fastboot
(da máquina linux conectada ao tablet) concordou, após um 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
Esse tamanho é de fato 2 GB:
linuxbox# python2 -c 'print 0x0000000080000000'
2147483648
Então, está tudo bem - eu tenho um backup da imagem. Agora, teste para restaurá-lo.
Eu tento atualizar o system.img de volta para o tablet - para garantir que eu possa me recuperar de qualquer coisa, o tipo de backup à prova de bala que fazemos no mundo Unix ( por exemplo, restaurar o conteúdo de uma unidade viadd if=backup.image of=/dev/sdXXX
).
Tudo relacionado adb
e fastboot
funciona perfeitamente - então eu tento ...
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. Transfiro e construo a android-tools-5.1.1
distribuição a partir das fontes, adicionando informações de depuração - e passo no depurador para ver esta falha:
linuxbox# gdb --args fastboot flash system system.img
...
Interessante - mesmo estando em uma máquina de 64 bits, aparentemente existem problemas que tornam o tamanho do arquivo "negativo" (em um mundo de 32 bits, o tamanho da minha imagem, 2 ^ 31, é de fato considerado negativo - para ser exato,) -2147483648
.
OK, tudo bem - como eles exibem arquivos de imagem grandes no Android?
Pesquisando, pesquisando - eles usam essa make_ext4fs
ferramenta, que cria imagens flexíveis. Na verdade, é parte do que acabei de compilar, então é melhor usá-lo:
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
Legal - para que eu possa aparentemente criar imagens do sistema a partir de pastas antigas simples. O céu será meu limite - poderei adicionar o que quiser a esta imagem.
Vamos queimar ...
linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [ 0.064s]
sending 'system' (2088960 KB)...
^C
Eu esperei por 1h antes de pressionar Ctrl-C. E teve que ligar e desligar o tablet, que inicializou novamente no modo de inicialização rápida.
Isso não parece bom.
E se eu criar uma imagem menor? Talvez os 2 GB sejam de algum modo um problema e essa partição não seja usada com capacidade total - ela possui espaço livre:
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, isso parece muito promissor (e levou apenas 5 minutos). Acho que agora posso reiniciar e tudo deve estar normal, sim?
Não :-)
Não me importo de um dispositivo temporariamente emparedada, enquanto eu não conseguir controlá-lo no final (máquinas que não sou um mestre, são máquinas que não se importam para operar ;-)
Alguma idéia do que fiz de errado e o que posso fazer para corrigir isso?
Desde já, obrigado.
PS Verifiquei a página de suporte da Asus no meu tablet - eles fornecem apenas as fontes para o kernel e o arquivo .zip over-the-air. Por sua vez, ele contém um backup no nível do sistema de arquivos da raiz - ou seja, a system
pasta existe lá apenas como uma pasta, não como uma imagem, nem como uma imagem system.img
que eu possa exibir -, o que realmente não me ajuda.
EPISÓDIO 2: Ataque das botas personalizadas
Na ausência de qualquer tipo de produto recovery.img
da Asus (por que um fabricante se preocuparia em publicar um fastboot-flashable recovery.img
? Por que de fato ...) e uma ausência semelhante em imagens de recuperação dos sites CWM e TWRP ... Eu estou à esquerda para combater tudo sozinho.
Felizmente, o arquivo de atualização aérea da Asus inclui dentro dele ...
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
... a imagem de inicialização do meu tablet. Agora talvez - apenas talvez - eu possa fazer algo com isso.
linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage
Expandindo o ramdisk ...
linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop
Eu configurei default.prop
para ser root quando o kernel é inicializado:
ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled
Também copiei /system/bin/sh
( do arquivo .us zip over-the-air da Asus ) para /sbin/sh
. Eu fiz o mesmo com o busybox - ferramenta bastante útil.
E reembalou o 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
realmente falhou na primeira vez em que eu executei isso, pois bootimg.cfg
precisava ser atualizado - o bootsize
parâmetro precisava ser alterado, pois o pacote agora é maior. abootimg
relata o que precisa, de modo que é fácil o suficiente.
E agora, eu inicializo minha imagem personalizada ...
linuxbox# fastboot boot new_boot_busybox.img
... e testemunhe o seguinte ...
linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Hmm ... Talvez o adbd não seja executado como root?
linuxbox# adb root
restarting adbd as root
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Tudo bem ... Eu hexeditou o adbd e o patch / system / bin / sh deve ser / sbin / sh (copiei o / system / bin / sh da imagem OTA para os rootfs do initrd): Reinicie, fastboot ...
linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -
Droga. Essa coisa é capaz de fazer alguma coisa?
linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)
É ... vamos ver:
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, então / system está montado. Posso ver o que está dentro?
linuxbox# adb pull /system
remote object '/system' does not exist
O que ... Talvez eu possa verificar o que o / proc / kmsg contém (o que "dmesg" produziria)
linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted
Não, eu preciso ser raiz para fazer isso.
linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied
E isso também.
Isso está se tornando um quebra-cabeça ...
fastboot
ainda esteja operacional (responde a solicitações muito bem) e, portanto, posso gravar qualquer imagem de recuperação, (a) procurei e não encontrei nenhuma imagem de recuperação CWM ou TWRP para o ME103K - acho que não um "genérico" a que você está se referindo, existe? (b) Desligar, pressionar o botão liga / desliga + diminuir o volume não abre a imagem de recuperação - ainda chego ao estado de inicialização rápida. Mo idéia por quê. Na verdade eu nunca vi o processo de recuperação (kinda curioso para vê-lo) ...
fastboot boot <FILE>.img
) e depois piscar todo o arquivo ZIP de ações. Como alternativa, verifique se existem (na web) os arquivos ROM de ações que podem ser atualizados usando o fastboot.
unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery
mostra apenas alguns scripts de shell - vou dar uma olhada, mas definitivamente não recovery.img
há). O Google também não ajudou - não há imagens de recuperação deste tablet em nenhum lugar ... Acho que vou ter que esperar por uma alma amável na dd
partição de recuperação e compartilhar?