Пытаюсь прошить system.img взял с dd - не получается

Давний пользователь 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

И это тоже.

Это оказывается настоящей загадкой...

Единственная хорошая вещь, которую вы здесь не сделали (и должны были сделать), это прошить кастомное Recovery и потом взять из него нандроидный бэкап разделов. Это один из пуленепробиваемых методов восстановления устройств из такого заблокированного состояния. Этот Over-the-air.zip (OTA zip) является прошиваемым zip-архивом для восстановления, т. е. прошивается при загрузке в Recovery, и они следуют другому формату упаковки, но достигают той же цели. Короче говоря, прошейте кастомное Recovery (или загрузитесь в стандартное), прошейте стоковое ПЗУ и экспериментируйте столько, сколько хотите.
@Firelord: В том-то и дело - хотя fastbootон все еще работает (отлично отвечает на запросы), и поэтому я могу записать любой образ восстановления, (а) я искал и не нашел образа восстановления CWM или TWRP для ME103K - я не думаю, что есть "общий", о котором вы говорите, есть? (б) Выключение питания, нажатие кнопки питания + уменьшения громкости не вызывает образ восстановления - я все равно просто попадаю в состояние быстрой загрузки. Мо идея, почему. На самом деле я никогда не видел процесс восстановления (любопытно увидеть его)...
Попробуйте другие комбинации кнопок, такие как Power+Vol Up+Vol Down, чтобы загрузиться в режиме восстановления. Если у вас есть доступ к стандартному Recovery ZIP, то где-то может быть файл образа стандартного Recovery, который вы можете прошить из fastboot или напрямую загрузиться в него ( fastboot boot <FILE>.img), а затем прошить весь стоковый ZIP-файл. В качестве альтернативы посмотрите, существуют ли (в Интернете) файлы стандартных ПЗУ, которые можно прошить с помощью fastboot.
@Firelord: Нет, Asus не предоставляет recovery.zip. Из ОТА-файла ничего нет .img-y ( unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recoveryпоказывает только пару шелл-скриптов - погляжу, но там точно нет recovery.img). Гугление тоже не помогло - образов восстановления этого планшета нигде нет... Что ж, придется ждать, пока какая-нибудь добрая душа ddих в раздел восстановления не поделится?

Ответы (3)

Эпизод 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 .

Клянусь Эпизодом 4, я бы предложил награду, если бы этот ответ не был опубликован, ради удовольствия от всех этих эпизодов. Приятно видеть, что вы решили свою проблему самостоятельно. :D
@Firelord: Спасибо, приятель. В процессе, я думаю, я сделал что-то довольно классное - я загрузил свой планшет, не касаясь его внутренностей ... загрузочный образ идет снаружи (сверху 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, который кто-то написал для набора инструментов, должен помочь понять, как идет процесс.

Ваше здоровье.

Спасибо за ответ. Что касается ваших вопросов, (1) нет, max-download-в выводе из getvar. (2) Я буду иметь в виду этот -Sвариант в своих будущих перепрошивках - как есть, после загрузки я стал пользователем root (путем перекомпиляции моего ядра) и dd-ed над старым системным разделом, так что будет ли работать перепрошивка с -S нужно дождаться моих следующих тестов (3) я пробовал с разреженными образами, получил тот же результат (т.е. fastbootсообщил, что перепрошивка прошла нормально, но системный раздел был испорчен).
@ttsiodras Нет проблем. Я научился некоторым вещам в процессе. (1) А, хорошо. Я сомневался, что это так, поскольку, по крайней мере, на моем устройстве, использующем сборку fastboot, которую я установил, эта переменная печатается первой в списке (кстати, спасибо за демонстрацию того, что allее можно передать в getvar - это полезно). (2) О, хорошо. Если это сработает, дайте нам знать. (3) Ой! Я этого не заметил. Много текста, извините. Это упоминалось в ваших сообщениях? (Было ли это похоже на команду make_ext4fs, которую я предложил, с указанием -sполной длины в 2 ГиБ?) Возможно, планшет не работает с разреженными файлами.
(3) да, я перешел -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

К сожалению, мне это не помогает - я не могу попасть в рекавери своего планшета, какую бы комбинацию клавиш я ни пробовал (в отличие от этого, я получил его сразу на моем MotoG2 - так что рекавери этого планшета как-то забито). Я могу прошить раздел восстановления (поскольку flashboot работает), но у меня нет recovery.imgот Asus, и нет ни CWM, ни TWRP (для ME103K).