Намагаючись прошити system.img, який я взяв із dd - не вдалося


16

Тут давній хлопець UNIX, але порівняно новий у світі Android. Читайте далі.

ЕПІЗОД 1: Нова резервна копія (я сподівався)

Я нещодавно придбав Asus MemoPAD (ME103K); Потім я запустив корінь і сфотографував розділ, доступний 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, точно розміром 2GiB, яке проходило 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інструмент, який створює миттєві зображення. Насправді це частина того, що я тільки що склав, тому я міг би також використовувати його:

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. І довелося живити планшетний ПК, який завантажився назад у режимі швидкої завантаження.

Це не добре виглядає.

Що робити, якщо я будую менший образ? Можливо, 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-файлу Over-the-air. Це, в свою чергу, містить резервну копію файлової системи з кореня - тобто systemпапка існує там як просто папка, а не зображення, не system.imgте, що я можу спалахнути, так що це не дуже допомагає мені.

ЕПІЗОД 2: Атака на замовні чоботи

За відсутності будь-якого типу recovery.imgвід Asus (чому виробник покладається на публікацію recovery.imgшвидкої завантажувальної? поодинці.

На щастя, файл оновлення Over-the-air від 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.proproot, коли ядро ​​завантажується:

ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled

Я також скопіював /system/bin/sh( з ефіру .zip файл у прямому ефірі ) у /sbin/sh. Я робив те ж саме із зайнятим ящиком - досить зручним інструментом.

І перепакували 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 в корені 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

Ні, мені потрібно зробити корінь для цього.

linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied

І це теж.

Це виявляється досить загадкою ...


2
Єдине хороше, що ви тут не робили (і повинні були це зробити) - це пропустити користувальницьке відновлення, а потім взяти з нього резервну копію нандроїдів . Це один із способів кулезахисту для відновлення пристроїв із такого цегляного стану. Цей Over-the-air.zip (OTA-zip) - це блискавка для відновлення, яка може бути прошита під час завантаження у Recovery, і вони дотримуються іншого формату упаковки, але досягають тієї ж мети. Короткий короткий огляд, прошийте користувальницьке відновлення (або завантажте на запас один), прошийте запас ROM та потім експериментуйте скільки завгодно.
Firelord

1
@Firelord: У цьому річ - хоча fastbootвона все ще функціонує (відповідає на запити просто чудово), і тому я можу записати будь-яке зображення для відновлення, (a) Я шукав і не знайшов зображення відновлення CWM або TWRP для ME103K - я не думаю, що є "родовий", про який ви посилаєтесь, є? (b) Вимкнення, натискання кнопки живлення + зменшення гучності не призводить до відновлення зображення - я все одно просто переходжу до стану швидкої завантаження. Моя ідея чому. Насправді я ніколи не бачив процесу відновлення (мені цікаво це бачити) ...
ttsiodras

1
Спробуйте інші комбінації кнопок, такі як Power + Vol Up + Vol Down, щоб перейти в режим відновлення. Якщо у вас є доступ до ZIP Recovery ZIP, то десь може бути файл зображення запасу Recovery, який ви можете спалахнути з швидкої завантаження або безпосередньо завантажитися в нього ( fastboot boot <FILE>.img), а потім прошийте весь файл акцій ZIP. Крім того, подивіться, чи існують (в Інтернеті) файли запасних ROM, які можна прошивати за допомогою fastboot.
Firelord

1
@Firelord: Ні, Asus не забезпечує recovery.zip. З файлу OTA немає нічого .img-y ( unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recoveryпоказує лише пару скриптів оболонки - я буду дивитись, але його точно немає recovery.img). Гуглінг теж не допоміг - ніде не знайдеться зображень для відновлення цього планшета ... Здогадаєтесь, мені доведеться зачекати якусь душу, щоб ddїх розділити і поділитися?
ttsiodras

Відповіді:


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 ...повідомив , що все було нормально - не вдалося ефектно . Дивно, що перегородка була встановлена ​​в першу чергу.

Це пояснило, чому планшет не завантажується, і дало мені остаточну ідею, яка вирішила проблему.

Мені потрібно було завантажувати планшет, щоб він використовував мою первозданну копію / системного розділу, але в цей момент, навіть якщо я мав доступ до оболонки, я не був root - ( зміни, які я робив у default.prop, явно ігноруються ядром Asus - Мені доведеться незабаром його перекомпілювати ... ), щоб я не зміг змонтувати зовнішню карту пам'яті і 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 box, я ddвніс незайману резервну копію системного розділу планшета на 2-й розділ зовнішньої SD-карти - який я створив gpartedна рівні 2 ГБ.

Це вдалося - планшет завантажився з моєї зовнішньої SD-карти.

EDIT : Подорож продовжилася - я врешті-решт пропрацював і скомпілював власне ядро ​​і став root .


2
Я клянусь, що в "Епізоді 4" я би запропонував нагороду, якби ця відповідь не була опублікована, заради задоволення від усіх цих епізодів. Приємно бачити, що ви вирішили свою проблему самостійно. : D
Firelord

2
@Firelord: Спасибі, товариш. У процесі роботи я думаю, що я зробив щось досить круте - я завантажив планшет, не торкаючись його нутрощів ... завантажувальне зображення надходить ззовні (над fastboot boot ...), і /systemрозділ знаходиться на SD-картці, підключаючись до всього, що я хочу. Начебто, завантаження ПК з USB-накопичувача :-)
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змінну? Якщо так, то це могло б забезпечити попередження, що миготливий процес може мати проблеми з таким великим зображенням. Поточний код швидкої завантаження зроблений для обходу, max-download-sizeякий є занадто малим, але я зазнав вашої тієї ж помилки, навіть коли зображення менше, ніж те, що пристрій каже, що може обробити, так що, власне, справа є певною мірою.

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

Отож, у всякому разі, тут здається, що з будь-якої причини ти не можеш спалахнути. Якщо ви і я маєте рацію, і це стосується розміру (ваш планшет має лише 1 ГБ оперативної пам’яті та нібито більшість пристроїв намагаються прочитати все зображення в оперативній пам’яті перед миготінням ), саме тут я думаю, що просте налаштування додавання -Sпараметра щоб швидка завантаження могла виправити ваш спалах, як і для мене:

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. Відкоригована команда створила б зображення, що надувається до потрібного розміру, але тимчасово зберігається без позбавленого жиру, як-от великі кишені порожніх даних: " рідкий файл зображення" (для отримання додаткової інформації про них див. Сторінку, на яку я посилався раніше; У мене недостатньо репутації на цьому сайті, щоб повторити посилання).

Цей старий читач хтось написав для колекції інструментів повинна допомогти зрозуміти, як йде процес.

Ура.


1
Дякую за відповідь. Що стосується ваших запитань, (1) ні, max-download-у висновку нічого не було getvar. (2) Я буду пам’ятати про -Sваріант у своїх майбутніх флеш-файлах - як це є, як тільки я завантажився, я став root (через перекомпіляцію свого ядра) і dd-ed над старим системним розділом, тож чи буде миготіння з -S буде працювати доведеться чекати моїх наступних тестів (3) Я спробував із розрідженими зображеннями, отримав той же результат (тобто fastbootповідомив, що миготіння було нормально, але системний розділ був зіпсований).
ttsiodras

1
@ttsiodras Немає проблем. Я дізнався деякі речі в процесі. (1) Ага, гаразд. Я сумнівався в тому, що, як мінімум, на моєму пристрої з використанням встановленої швидкої завантаження, яку я встановив, ця змінна allнадрукується спочатку в списку (спасибі, btw, за демонстрацію того, що можна передати getvar - це корисно). (2) О, добре. Якщо це все-таки спрацює, повідомте нас. (3) Ну! Я цього не помічав. Це багато тексту, вибачте. Це було згадано у ваших дописах? (Чи було це як команда make_ext4fs, яку я запропонував, -sі вказана повна довжина 2 Гб?) Можливо, планшет не має файлів із розрідженими файлами.
naki

1
(3) так, я перейшов -sдо make_ext4fs - fastboot повідомив "ОК" для запису, але / система заплуталася. Моя теорія полягає в тому, що, як ви вже сказали, нічого більшого, ніж пам'ять планшета (1 Гб), не працювало б, і -Sдля правильної роботи потрібна опція у швидкій завантаженні (що пояснює напівзламаний стан - розділ був змонтований тому, що перша частина зображення вписується в пам'ять і фактично спалюється, що дозволяє його монтувати - але файли всередині нього були випадковим чином пошкоджені, залежно від того, спалювали їх сектори чи ні).
ttsiodras

2

З моїм Moto GI створили резервну копію, використовуючи dd, як і ви. Мені потрібно було відновити системний розділ днями, тому я завантажив TWRP (я його не спалахнув, я просто завантажив зображення в ОЗУ). Тоді я використовував adb для підключення, коли TWRP працював, і я просто натиснув img, який я зробив з dd, на свою SD-карту, а потім використав dd, щоб записати зображення в системний розділ.

Ознайомтеся з відео, яке я зробив про це тут: https://youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq


На жаль, це не допомагає мені - я не можу дістатись до відновлення планшетного ПК, незалежно від того, яку комбінацію клавіш я спробував (на відміну від цього, я отримав це негайно на моєму MotoG2 - тому відновлення цього планшета якось втручане). Я можу прошивати розділ відновлення (оскільки flashboot працює), але у мене немає recovery.imgвід Asus, і немає CWM або TWRP (для ME103K).
ttsiodras
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.