Давний пользователь UNIX, но относительно новичок в мире Android. Читай дальше.
ЭПИЗОД 1: Новая резервная копия (я надеялся)
Я недавно купил Asus MemoPAD (ME103K); Затем я стал root и сделал dd
образ system
раздела только для чтения на внешнюю 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
Размер (ровно 2GiB) немного подозрительный - может быть это из-за раздела FAT32 на SD-карте?
Нет, не было - tune2fs -l
выяснилось, что это действительно был действительный образ EXT4, размер которого точно равен 2 ГБ, который прошел fsck -f
без ошибок. И fastboot
(с Linux-машины, подключенной к планшету) согласился после 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
Этот размер действительно составляет 2 ГБ:
linuxbox# python2 -c 'print 0x0000000080000000'
2147483648
Итак, все хорошо - у меня есть резервная копия образа. Теперь попробуем восстановить.
Я пытаюсь прошить system.img обратно на планшет, чтобы убедиться, что я могу восстановиться от чего угодно, что-то вроде пуленепробиваемого резервного копирования, которое мы делаем в мире Unix ( например, восстанавливаем содержимое диска черезdd if=backup.image of=/dev/sdXXX
).
Все что касается adb
и fastboot
работает без нареканий - так стараюсь...
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'
Хм. Я загружаю и собираю android-tools-5.1.1
свой дистрибутив из исходников, добавляя отладочную информацию - и вхожу в отладчик, чтобы увидеть этот сбой:
linuxbox# gdb --args fastboot flash system system.img
...
Интересно - хотя у меня 64-битная машина, по-видимому, есть проблемы, которые делают размер файла «отрицательным» (в 32-битном мире размер файла моего изображения, 2 ^ 31, действительно считается отрицательным, а точнее, -2147483648
.
Хорошо, хорошо - как они прошивают большие файлы изображений в Android?
Гугление, поиск - оказывается, они используют этот make_ext4fs
инструмент, который создает flashable изображения. На самом деле это часть того, что я только что скомпилировал, поэтому я мог бы также использовать его:
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
Круто - так что я, по-видимому, могу создавать образы системы из простых старых папок. Небо будет моим пределом - я смогу добавить к этому изображению все, что захочу.
Давай сожжем...
linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [ 0.064s]
sending 'system' (2088960 KB)...
^C
Я ждал 1 час, прежде чем нажать Ctrl-C. И пришлось выключить-выключить планшет, который снова загрузился в режиме fastboot.
Это выглядит не очень хорошо.
Что, если я создам образ меньшего размера? Может быть, 2 ГБ как-то проблема, и этот раздел не используется на полную мощность - на нем есть свободное место:
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
Хорошо, это выглядит очень многообещающе (и заняло всего 5 минут). Я думаю, теперь я могу снова перезагрузиться, и все должно быть нормально, да?
Нет :-)
Я не возражаю против временно заблокированного устройства, если в конце концов я смогу его контролировать (машины, которыми я не являюсь мастером, - это машины, которыми я не хочу управлять ;-)
Любые идеи о том, что я сделал неправильно и что я могу сделать, чтобы исправить это?
Заранее спасибо.
PS Я проверил страницу поддержки Asus для своего планшета - они предоставляют только исходники для ядра и файл .zip, передаваемый по воздуху. Это, в свою очередь, содержит резервную копию уровня файловой системы из корня - т.е. system
папка существует там как просто папка, а не образ, не то system.img
, что я могу прошить - так что это мне не очень помогает.
ЭПИЗОД 2: Атака нестандартных ботинок
В отсутствие каких-либо recovery.img
от Asus (зачем производителю публиковать fastboot-прошивалку recovery.img
? Действительно, зачем...) и аналогичное отсутствие на образах для восстановления с сайтов CWM и TWRP... Осталось воевать со всеми в одиночестве.
К счастью, файл беспроводного обновления от Asus включает в себя...
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
...загрузочный образ моего планшета. Теперь, может быть, только может быть, я смогу что-нибудь с этим сделать.
linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage
Расширение RAM-диска...
linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop
Я настроен default.prop
быть root при загрузке ядра:
ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled
Я также скопировал /system/bin/sh
( из беспроводного .zip-файла Asus ) в /sbin/sh
. Я сделал то же самое с busybox - довольно удобный инструмент.
И перепаковал 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
на самом деле не удалось при первом запуске, так как bootimg.cfg
пришлось обновить - bootsize
параметр пришлось изменить, так как пакет теперь больше. abootimg
сообщает, что ему нужно, так что это достаточно просто.
И теперь я загружаю свой собственный образ...
linuxbox# fastboot boot new_boot_busybox.img
...и наблюдайте следующее...
linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Хм... Может adbd не запускается от имени root?
linuxbox# adb root
restarting adbd as root
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Хорошо... Я редактирую adbd в шестнадцатеричном формате и исправляю /system/bin/sh, чтобы он был /sbin/sh (я скопировал /system/bin/sh из образа OTA в rootfs initrd): Перезагрузка, быстрая загрузка...
linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -
Штопать. Способна ли эта штука на что-нибудь?
linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)
Это... давайте посмотрим:
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
Итак, /system смонтирована . Могу я посмотреть, что внутри?
linuxbox# adb pull /system
remote object '/system' does not exist
Что за ... Может быть, я могу проверить, что содержит /proc/kmsg (что выведет "dmesg")
linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted
Нет, мне нужно быть root, чтобы сделать это.
linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied
И это тоже.
Это оказывается настоящей загадкой...
Эпизод 3: Возвращение ракушки.
Если бы у меня когда-либо был шанс решить эту проблему, я сначала должен был выяснить, почему оболочка не работает. adbd
сама реагировала, поэтому запускалась на стороне планшета - но не могла выполнить оболочку, даже когда я ее хак-пропатчил для вызова файла ( /sbin/sh
), который я сам поместил в загрузочный образ - будучи на 100% уверенным, что у него была соответствующие разрешения и был доступен из shell
учетной записи (id = 2000), которая adbd
использует.
Которому осталось только одно объяснение - "клетки" SELinux.
Итак, я проверил, как adbd
был запущен мой загрузочный образ 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
... и попробовал очевидное изменение:
service adbd /sbin/adbd
class core
socket adbd stream 660 system system
Я снова упаковал вещи и, к моему глубокому удовлетворению, увидел...
linuxbox# adb shell
$
Наконец-то я получил доступ к планшету - "изнутри".
Проверив смонтированный /system, стало ясно, что процесс перепрошивки, несмотря на сообщение о том, что все в порядкеfastboot flash system ...
, провалился . Было удивительно, что раздел был смонтирован в первую очередь.
Это объяснило, почему планшет не загружался, и дало мне окончательное решение проблемы.
Мне нужно было загрузить планшет так, чтобы он использовал мою нетронутую копию раздела /system, но в этот момент, даже несмотря на то, что у меня был доступ к оболочке, я не был root - ( изменения, которые я сделал, по default.prop
-видимому, игнорируются ядром Asus - Скоро мне придется перекомпилировать его... ) поэтому я не мог смонтировать внешнюю SD-карту и dd
поверх моей хорошей копии.
Но у меня был собственный загрузочный образ, что означало, что я мог редактировать его /fstab.qcom
содержимое и делать следующее:
Исходная строка, которая говорила планшету, как монтировать /system
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,barrier=1 wait
Мое редактирование
/dev/block/mmcblk1p2 /system ext4 rw,barrier=1 wait
... и вернувшись в свою коробку с Linux, я dd
перенес нетронутую резервную копию системного раздела планшета на второй раздел моей внешней SD-карты, который я создал с помощью gparted
ровно 2 ГБ.
Вот и получилось - планшет загрузился с моей внешней SD карты.
РЕДАКТИРОВАТЬ : Путешествие продолжалось — в конце концов я пропатчил и скомпилировал собственное ядро и стал пользователем root .
fastboot boot ...
), а /system
раздел находится на SD-карте, который можно настроить на все, что я хочу. Вроде как загрузка ПК с флешки :-)Кажется, вы уже нашли какое-то решение своей проблемы (на этой странице много текста для чтения), но кажется, что это, вероятно , можно было бы решить гораздо проще.
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
Среди этих переменных ваш планшет вернул max-download-size
переменную? Если это так, то это могло быть прямым предупреждением о том, что процесс перепрошивки может иметь некоторые проблемы с таким большим образом. Текущий код быстрой загрузки предназначен для обхода max-download-size
слишком маленького размера, но я столкнулся с той же ошибкой, даже когда изображение меньше, чем то, что, по словам устройства, оно может обработать, так что на самом деле это вопрос спорный, я думаю.
linux_box# fastboot flash system system.img
error: cannot load 'system.img'
Так вот, все равно тут кажется, что по какой-то причине у вас не получается прошиться. Если мы с вами правы, и речь идет о размере (ваш планшет действительно имеет только 1 ГБ ОЗУ, и якобы большинство устройств пытаются прочитать весь образ в ОЗУ перед прошивкой ), то здесь я думаю, что простая настройка добавления -S
опции to fastboot мог исправить вашу вспышку, как это было для меня:
fastboot -S 512M flash system system.img
Вместо этого, однако, похоже, вы пытались заставить образ размером 2 ГБ иметь размер, который (1) может оказаться невозможным для его заполнения и (2) не тот размер, который должен быть у системного раздела вашего устройства.
Что касается пункта № 1, по моему опыту, я бы не стал рассчитывать на то, что хрупкие инструменты сборки Android будут жаловаться, если вы попросите их сделать что-то, в чем они потерпят неудачу, и вполне возможно, что они могут здесь.
Что касается пункта № 2, я не верю, что вы не можете просто сделать это; для использования другого размера системного раздела потребуются дополнительные шаги.
Предполагая, что ваш планшет ожидает разреженные файлы изображений, я полагаю, что вместо команды, которую вы хотели попробовать, make_ext4fs -l 1536M new_system.img /system
была команда make_ext4fs -l 2048M -s new_system.img /system
. Скорректированная команда создаст изображение, которое будет увеличено до нужного размера, но будет временно храниться без лишнего жира, как большие карманы пустых данных: « разреженный файл изображения» (см. страницу, на которую я ссылался ранее для получения дополнительной информации о них; У меня недостаточно репутации на этом сайте, чтобы повторить ссылку).
Этот старый readme, который кто-то написал для набора инструментов, должен помочь понять, как идет процесс.
Ваше здоровье.
max-download-
в выводе из getvar
. (2) Я буду иметь в виду этот -S
вариант в своих будущих перепрошивках - как есть, после загрузки я стал пользователем root (путем перекомпиляции моего ядра) и dd
-ed над старым системным разделом, так что будет ли работать перепрошивка с -S нужно дождаться моих следующих тестов (3) я пробовал с разреженными образами, получил тот же результат (т.е. fastboot
сообщил, что перепрошивка прошла нормально, но системный раздел был испорчен).all
ее можно передать в getvar - это полезно). (2) О, хорошо. Если это сработает, дайте нам знать. (3) Ой! Я этого не заметил. Много текста, извините. Это упоминалось в ваших сообщениях? (Было ли это похоже на команду make_ext4fs, которую я предложил, с указанием -s
полной длины в 2 ГиБ?) Возможно, планшет не работает с разреженными файлами.-s
к make_ext4fs - fastboot сообщил "ОК" для записи, но /system была испорчена. Моя теория заключается в том, что, как вы сказали, все, что больше памяти планшета (1 ГБ), не будет работать, и -S
для правильной работы нужна опция в fastboot (что объясняет полуразбитое состояние - раздел был смонтирован, потому что первая часть часть образа поместилась в памяти и была фактически сожжена, что позволило его смонтировать, но файлы внутри него были... случайно повреждены, в зависимости от того, были сожжены их сектора или нет).С моим Moto GI создал резервную копию с помощью dd, как и вы. На днях мне нужно было восстановить системный раздел, поэтому я загрузил TWRP (я его не прошивал, я просто загрузил образ в оперативную память). Затем я использовал adb для подключения во время работы TWRP, и я просто переместил изображение, созданное с помощью dd, на свою SD-карту, а затем использовал dd для записи образа в системный раздел.
Посмотрите видео, которые я сделал об этом здесь: https://youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq
recovery.img
от Asus, и нет ни CWM, ни TWRP (для ME103K).
Повелитель огня
тциодрас
fastboot
он все еще работает (отлично отвечает на запросы), и поэтому я могу записать любой образ восстановления, (а) я искал и не нашел образа восстановления CWM или TWRP для ME103K - я не думаю, что есть "общий", о котором вы говорите, есть? (б) Выключение питания, нажатие кнопки питания + уменьшения громкости не вызывает образ восстановления - я все равно просто попадаю в состояние быстрой загрузки. Мо идея, почему. На самом деле я никогда не видел процесс восстановления (любопытно увидеть его)...Повелитель огня
fastboot boot <FILE>.img
), а затем прошить весь стоковый ZIP-файл. В качестве альтернативы посмотрите, существуют ли (в Интернете) файлы стандартных ПЗУ, которые можно прошить с помощью fastboot.тциодрас
unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery
показывает только пару шелл-скриптов - погляжу, но там точно нетrecovery.img
). Гугление тоже не помогло - образов восстановления этого планшета нигде нет... Что ж, придется ждать, пока какая-нибудь добрая душаdd
их в раздел восстановления не поделится?