Модификация образов партиций
Образы (.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
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
попробую на досуге.