Wieloletni facet z UNIX, ale stosunkowo nowy w świecie Androida. Czytaj.
EPISODE 1: A New Backup (miałem nadzieję)
Niedawno kupiłem Asus MemoPAD (ME103K); Następnie zostałem rootem i zapisałem dd
obraz system
partycji tylko do odczytu na zewnętrznej karcie SD:
$ 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
Rozmiar (dokładnie 2GiB) był nieco podejrzany - czy mogło tak być z powodu partycji FAT32 na karcie SD?
Nie, nie zostało - tune2fs -l
ujawniono, że to rzeczywiście był prawidłowy obraz EXT4, dokładnie wielkości 2GiB, który przeszedł fsck -f
bez żadnych błędów. I fastboot
(z maszyny linux podłączonej do tabletu) zgodził się, po 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
Ten rozmiar to rzeczywiście 2 GB:
linuxbox# python2 -c 'print 0x0000000080000000'
2147483648
Tak więc wszystko jest dobrze - mam kopię zapasową obrazu. Teraz przetestuj przywracanie.
Próbuję sflashować system.img z powrotem na tablet - aby upewnić się, że mogę odzyskać wszystko, rodzaj kuloodpornej kopii zapasowej, którą wykonujemy w świecie Unixa ( np. Przywracanie zawartości dysku za pośrednictwemdd if=backup.image of=/dev/sdXXX
).
Wszystko związane z adb
i fastboot
działa bezbłędnie - więc próbuję ...
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 Pobieram i buduję android-tools-5.1.1
swoją dystrybucję ze źródeł, dodając informacje o debugowaniu - i wchodzę do debuggera, aby zobaczyć ten błąd:
linuxbox# gdb --args fastboot flash system system.img
...
Ciekawe - choć jestem w komputerze 64-bitowym, najwyraźniej istnieją problemy, które z kolei rozmiar pliku „negatywny” (w świecie 32bit, rozmiar pliku mojego obrazu, 2 ^ 31, jest rzeczywiście uznać negatywne - a dokładnie, -2147483648
.
OK, w porządku - jak flashują duże pliki obrazów w Androidzie?
Googlowanie, wyszukiwanie - okazuje się, że korzystają z tego make_ext4fs
narzędzia, które tworzy flashowalne obrazy. W rzeczywistości jest to część tego, co właśnie skompilowałem, więc równie dobrze mogę go użyć:
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
Fajnie - więc najwyraźniej mogę budować obrazy systemowe ze zwykłych starych folderów. Niebo będzie moim ograniczeniem - będę mógł dodać do tego obrazu wszystko, co chcę.
Spalmy to ...
linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [ 0.064s]
sending 'system' (2088960 KB)...
^C
Czekałem 1 godzinę, zanim uderzyłem w Ctrl-C. I musiałem ponownie włączyć tablet, który uruchomił się ponownie w trybie fastboot.
To nie wygląda dobrze.
Co jeśli zbuduję mniejszy obraz? Być może 2 GB stanowią problem, a ta partycja nie jest w pełni wykorzystana - ma wolne miejsce:
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, wygląda to bardzo obiecująco (zajęło to tylko 5 minut). Chyba mogę teraz zrestartować komputer i wszystko powinno być normalne, tak?
Nie :-)
I nie przeszkadza tymczasowo zamurowane urządzenia, tak długo, jak nie dostać się do kontrolowania go w końcu (maszyny, że nie jestem mistrzem, to maszyny nie dbają działać ;-)
Wszelkie pomysły na to, co zrobiłem źle i co mogę zrobić, aby to naprawić?
Z góry dziękuję.
PS Sprawdziłem stronę pomocy Asusa dla mojego tabletu - zawierają one tylko źródła jądra oraz plik .zip Over-the-air. To z kolei zawiera kopię zapasową na poziomie systemu plików z katalogu głównego - tzn. system
Folder istnieje tam tylko jako folder, a nie obraz, a nie to system.img
, co mogę sflashować - więc to mi naprawdę nie pomaga.
EPISODE 2: Atak niestandardowych butów
Wobec braku jakiegokolwiek rodzaju recovery.img
od Asusa (dlaczego producent miałby zawracać sobie głowę publikowaniem szybkiego flashowania recovery.img
? Dlaczego rzeczywiście ...) i podobnej nieobecności na obrazach odzyskiwania z witryn CWM i TWRP ... Zostaję walczyć ze wszystkimi sam.
Na szczęście plik aktualizacji Over-the-air od Asusa zawiera w nim ...
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
... obraz rozruchowy mojego tabletu. Teraz może - tylko może - mogę coś z tym zrobić.
linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage
Rozszerzanie ramdysku ...
linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop
Skonfigurowałem default.prop
rootowanie, gdy jądro uruchamia się:
ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled
Skopiowałem też /system/bin/sh
( z bezprzewodowego pliku .zip Asus ) do /sbin/sh
. To samo zrobiłem z busybox - całkiem przydatnym narzędziem.
I przepakowałem 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
tak naprawdę nie powiodło się po pierwszym uruchomieniu, ponieważ bootimg.cfg
musiałem zostać zaktualizowany - bootsize
parametr musiał zostać zmieniony, ponieważ pakiet jest teraz większy. abootimg
zgłasza, czego potrzebuje, więc to dość proste.
A teraz uruchamiam mój niestandardowy obraz ...
linuxbox# fastboot boot new_boot_busybox.img
... i obserwuj następujące ...
linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Hmm ... Może adbd nie jest uruchamiany jako root?
linuxbox# adb root
restarting adbd as root
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Dobra ... I hexedit adbd i patch / system / bin / sh to / sbin / sh (skopiowałem / system / bin / sh z obrazu OTA do rootfs initrd): Reboot, fastboot ...
linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -
Cerować. Czy to coś może zrobić?
linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)
To jest ... zobaczmy:
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, więc / system jest zamontowany. Czy mogę zobaczyć, co jest w środku?
linuxbox# adb pull /system
remote object '/system' does not exist
Co do ... Może mogę sprawdzić, co zawiera / proc / kmsg (co wyświetliby „dmesg”)
linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted
Nie, muszę być rootem, żeby to zrobić.
linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied
I to też.
To okazuje się niezłą łamigłówką ...
fastboot
nadal działa (odpowiada dobrze na żądania) i dlatego mogę nagrać dowolny obraz odzyskiwania, (a) szukałem i nie znalazłem obrazu odzyskiwania CWM ani TWRP dla ME103K - nie sądzę, że tam jest „ogólny”, do którego się odwołujesz, prawda? (b) Wyłączenie zasilania, naciśnięcie przycisku zasilania + zmniejszenie głośności nie powoduje wyświetlenia obrazu odzyskiwania - wciąż przechodzę do stanu szybkiego uruchamiania. Mo pomysł, dlaczego. W rzeczywistości nigdy nie widziałem procesu odzyskiwania (trochę ciekawy go zobaczyć) ...
fastboot boot <FILE>.img
), a następnie flashować cały podstawowy plik ZIP. Ewentualnie sprawdź, czy istnieją (w sieci) podstawowe pliki ROM, które można flashować za pomocą Fastboot.
unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery
pokazuje tylko kilka skryptów powłoki - przyjrzę się, ale na pewno nie recovery.img
ma). Googling też nie pomógł - nigdzie nie ma zdjęć odzyskiwania tego tabletu ... Chyba będę musiał czekać na jakąś duszę na dd
partycję odzyskiwania i dzielić się?