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

16

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

Размер (ровно 2 ГБ) был немного подозрительным - может ли это быть из-за раздела 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?

Googling, search - оказывается, они используют этот make_ext4fsинструмент, который создает плавающие изображения. На самом деле это часть того, что я только что скомпилировал, так что я мог бы также использовать это:

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-flashhable 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

Расширение виртуального диска ...

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) -

Хорошо ... Я hexedit adbd и исправление / system / bin / sh, чтобы быть / sbin / sh (я скопировал / system / bin / sh из образа OTA в rootfs initrd): перезагрузка, fastboot ...

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

ОК, так что / система будет смонтирована. Могу ли я увидеть, что внутри?

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

И это тоже.

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

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

Ответы:

7

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

Наконец-то я получил доступ к планшету - изнутри.

Проверяя смонтированную / систему, стало ясно, что процесс перепрошивки - даже несмотря на то, что fastboot flash system ...сообщалось, что все в порядке - провалился эффектно . Было удивительно, что раздел был установлен в первую очередь.

Это объяснило, почему планшет не загружался, и дало мне окончательную идею, которая решила проблему.

Мне нужно было загрузить планшет так, чтобы он использовал мою нетронутую копию раздела / system, но на этом этапе, даже несмотря на то, что у меня был доступ к оболочке, я не был пользователем root ( изменения, которые я делал, по- default.propвидимому, игнорируются ядром Asus) Мне придется перекомпилировать его в ближайшее время ... ), чтобы я не смог смонтировать внешний SDCard и ddповерх моей хорошей копии.

Но у меня был свой загрузочный образ - это означало, что я могу отредактировать его /fstab.qcomвнутри и сделать это:

Оригинальная линейка, рассказывающая планшету как монтировать / систему

/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сделал первичную резервную копию системного раздела планшета на 2-й раздел моей внешней SD-карты, который я создал с помощью gpartedточно 2 ГБ.

Вот и все - планшет загрузился с моей внешней SD-карты.

РЕДАКТИРОВАТЬ : путешествие продолжалось - я в конечном итоге исправил и скомпилировал свое собственное ядро ​​и стал root .

ttsiodras
источник
2
Клянусь Эпизодом 4, я бы предложил вознаграждение, если бы этот ответ не был опубликован, ради забавы от всех этих эпизодов. Приятно видеть, что вы решили свою проблему самостоятельно. : D
Повелитель огня
2
@Firelord: Спасибо, приятель. В процессе, я думаю, я сделал что-то довольно крутое - я загрузил свой планшет, не трогая его внутренности ... образ загрузки приходит снаружи (сверху fastboot boot ...), а /systemраздел находится на SD-карте, настраиваемый на все, что я хочу. Вроде как, загрузка ПК с флешки :-)
ttsiodras
4

Кажется, вы уже нашли какое-то решение вашей проблемы (на этой странице много текста для чтения), но, вероятно, это можно было бы решить гораздо проще.

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переменную? Если это так, то это могло бы сразу послужить предупреждением о том, что процесс перепрошивки может иметь некоторые проблемы с таким большим изображением. Текущий код fastboot предназначен для работы с max-download-sizeслишком маленьким файлом, но я столкнулся с той же ошибкой, даже если изображение меньше, чем, по словам устройства, оно может обработать, так что, на самом деле, это не совсем понятно.

linux_box# fastboot flash system system.img  
error: cannot load 'system.img'

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

С моим Moto GI я создал резервную копию, используя dd, как и вы. Мне нужно было восстановить системный раздел на днях, поэтому я загрузил TWRP (я не прошивал его, я просто загрузил образ в RAM). Затем я использовал adb для подключения во время работы TWRP, и я просто нажал img, который я сделал с dd, на свою SD-карту, а затем использовал dd, чтобы записать образ в системный раздел.

Проверьте видео, которые я сделал об этом здесь: https://youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq

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