Модификация образов партиций

Материал из Toshiba AC100 wiki
Версия от 22:34, 2 июня 2016; Zombah (обсуждение | вклад) (add dt var)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Образы (.img) партиций


Что нужно чтобы собрать или разобрать вручную готовые образы партиций

Загрузочные boot.img/recovery.img

Образ данной партиции формируется системой Андроид при сборке с помощью утилиты mkbootimg, в сорцах Андроида она живет в папке system/core/mkbootimg, чтобы собирать эту партицию вручную, не собирая целиком всю систему нужно проделать следующую операцию:

gcc -o mkbootimg mkbootimg.c ../libmincrypt/sha.c -I../include
gcc -o unpackbootimg unpackbootimg.c ../libmincrypt/sha.c -I../include

Полученному бинарнику mkbootimg нам нужно передать четыре переменных для успешной сборки

  • --kernel в котором указываем путь к бинарнику нашего ядра ака zImage
  • --ramdisk в котором указываем путь к архиву содержащему initrd, о том как собрать initrd ниже.
  • --cmdline с параметрами передаваймыми ядру при запуске, на данный момент cmdline для Андройда следующий:
"panic=10 video=tegrafb console=tty0 no_console_suspend=1 tegraboot=sdmmc
tegrapart=recovery:300:a00:800,boot:d00:1000:800,mbr:1d00:200:800,
system:1f00:25800:800,cache:27700:32000:800,misc:59700:400:800,store:59c00:9a600:800,
userdata:f4300:df3500:800 androidboot.hardware=paz00"
  • -o путь и имя результирующего файла, например boot.img

Дополнительная переменная board

Некторым устройствам, видимо начиная с Андроид Lollipop, нужна также дополнительная переменная:

  • --board в которой указыавется код устройства.

скорее всего ее проверяет бутлоадер.


Например для Alcatel OT-5065D это:

--board R2A73030BR00

Как найти значение переменной board в заводском образе

Чтобы понять что устройство использует переменную board можно сравнить stock образ с собранным вручную и если вывод будет похожим на это, то она нужна

cmp -lb recovery.img myrecovery.img 
      49 122 R      0 ^@
      50  62 2      0 ^@
      51 101 A      0 ^@
      52  67 7      0 ^@
      53  63 3      0 ^@
      54  60 0      0 ^@
      55  63 3      0 ^@
      56  60 0      0 ^@
      57 102 B      0 ^@
      58 122 R      0 ^@
      59  60 0      0 ^@
      60  60 0      0 ^@

Дополнительная переменная dt

Новые ядра начиная с 3.х используют device tree для описания оборудования устройства и для загрузки ядра на них нужно значала загружать .dtb файл.

  • --dt в котором указывается .dtb файл устройства

ramdisk или initrd

Файл initrd представляет из себя каталог со скриптами, конфигами и драйверами которые нужны ядру для успешного старта системы, создать его можно следующим образом:

  • сформировать или взять готовый католог содержащий init и init.rc и прочие файлы нужные Андройду
    • собрать из него готовый initrd следующей коммандой:
find . |cpio -o -H newc |gzip > ../initrd 

папкой ниже получаем файл initrd с содержимым нашего каталога.

Для того чтобы разобрать уже готовый образ 6-ой партиции существует утилита unpackbootimg, собирается аналогично антиподу, на выходе она дает три файла с ядром, initrd и содержимым cmdline

Распаковать initrd вручную можно следующим образом

gzip -dc ../initrd.gz | cpio -id

U-Boot ramdisk

Если initrd еще запакован для U-Boot с помощью mkimage, то сначала от него надо отрезать первые 64 байта загаловка U-Boot.

dd if=initrd.uboot of=initrd.gz bs=1 skip=64

Образ системной партиции ака system.img

Данные образ является просто файловой системой, в нашем случае ext4, у многих других устройств с нанд памятью файловая система yaffs2 для этого файла, разобрать/собрать их сложнее можно использовать yaffs2utils. Файл с файловой системой yaffs2 можно отличить натравив на него утилиту file. Чтобы создать образ системной партиции проделываем следующую процедуру:

  • Создаем пустой файл нужного нам размера:
dd if=/dev/zero of=system.img bs=512 count=131072
  • Форматируем его в нужную нам файловую систему
mkfs.ext4 system.img 
  • Монтируем полученный файл через петлю
mkdir /tmp/system.img
sudo mount -oloop system.img /tmp/system.img

Чтобы прочесть или поменять содержимое такого образа делаем последний пункт без первых двух.

Sparse образ системной партиции

Если система андроид собирается без ключа:

# Disable spase in image creation, otherwise image not mountble and need to be processed with simg2img
TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true

то такой образ еще предварительно нужно обработать утилитой simg2img. Эта утилита живет в system/extras/ext4_utils Собирается следующим образом:

gcc -o simg2img -lz sparse_crc32.c simg2img.c

Распаковать можно так:

simg2img system.img system.raw.img

Yaffs2 образы партиций

Бывает, что хочется заглянуть в чужие образы для nand собраные с файловой системой yaffs2.

Вот тут нашел мануалы как это делать правильно: https://wiki.maemo.org/Modifying_the_root_image http://www.friendlyarm.net/forum/topic/1141

попробую на досуге.


1337643412