Модификация образов партиций: различия между версиями
Zombah (обсуждение | вклад) м (add u-boot initrd) |
Zombah (обсуждение | вклад) м (add dt var) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
=Образы партиций= | ==Образы (.img) партиций== | ||
---- | ---- | ||
Что нужно чтобы собрать или разобрать вручную готовые образы партиций | Что нужно чтобы собрать или разобрать вручную готовые образы партиций | ||
== | ==Загрузочные boot.img/recovery.img== | ||
Образ данной партиции формируется системой Андроид при сборке с помощью утилиты | Образ данной партиции формируется системой Андроид при сборке с помощью утилиты | ||
''mkbootimg'', в сорцах Андроида она живет в папке ''system/core/mkbootimg'', чтобы | ''mkbootimg'', в сорцах Андроида она живет в папке ''system/core/mkbootimg'', чтобы | ||
Строка 24: | Строка 24: | ||
* -o путь и имя результирующего файла, например boot.img | * -o путь и имя результирующего файла, например boot.img | ||
===Дополнительная переменная board=== | |||
Некторым устройствам, видимо начиная с Андроид Lollipop, нужна также дополнительная переменная: | |||
* --board в которой указыавется код устройства. | |||
скорее всего ее проверяет бутлоадер. | |||
Например для Alcatel OT-5065D это: | |||
<pre> | |||
--board R2A73030BR00 | |||
</pre> | |||
====Как найти значение переменной board в заводском образе==== | |||
Чтобы понять что устройство использует переменную board можно сравнить stock образ с собранным вручную | |||
и если вывод будет похожим на это, то она нужна | |||
<pre> | |||
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 ^@ | |||
</pre> | |||
===Дополнительная переменная dt=== | |||
Новые ядра начиная с 3.х используют device tree для описания оборудования устройства и для загрузки ядра на них | |||
нужно значала загружать .dtb файл. | |||
* --dt в котором указывается .dtb файл устройства | |||
===ramdisk или initrd=== | |||
Файл initrd представляет из себя каталог со скриптами, конфигами и драйверами которые нужны ядру для успешного старта системы, | Файл initrd представляет из себя каталог со скриптами, конфигами и драйверами которые нужны ядру для успешного старта системы, | ||
создать его можно следующим образом: | создать его можно следующим образом: | ||
Строка 42: | Строка 79: | ||
</pre> | </pre> | ||
===U-Boot ramdisk=== | |||
Если initrd еще запакован для U-Boot с помощью mkimage, то сначала от него надо отрезать | Если initrd еще запакован для U-Boot с помощью mkimage, то сначала от него надо отрезать | ||
первые 64 байта загаловка U-Boot. | первые 64 байта загаловка U-Boot. | ||
Строка 48: | Строка 86: | ||
dd if=initrd.uboot of=initrd.gz bs=1 skip=64 | dd if=initrd.uboot of=initrd.gz bs=1 skip=64 | ||
</pre> | </pre> | ||
---- | |||
==Образ | ==Образ системной партиции ака system.img== | ||
Данные образ является просто файловой системой, в нашем случае ext4, у многих других | Данные образ является просто файловой системой, в нашем случае ext4, у многих других | ||
устройств с нанд памятью файловая система yaffs2 для этого файла, разобрать/собрать их сложнее | устройств с нанд памятью файловая система yaffs2 для этого файла, разобрать/собрать их сложнее | ||
можно использовать yaffs2utils. Файл с файловой системой yaffs2 можно отличить натравив на него | можно использовать yaffs2utils. Файл с файловой системой yaffs2 можно отличить натравив на него | ||
утилиту ''file''. | утилиту ''file''. | ||
Чтобы создать образ | Чтобы создать образ системной партиции проделываем следующую процедуру: | ||
* Создаем пустой файл нужного нам размера: | * Создаем пустой файл нужного нам размера: | ||
<pre> | <pre> | ||
Строка 72: | Строка 111: | ||
без первых двух. | без первых двух. | ||
===Sparse образ системной партиции=== | |||
Если система андроид собирается без ключа: | |||
<pre> | |||
# Disable spase in image creation, otherwise image not mountble and need to be processed with simg2img | |||
TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true | |||
</pre> | |||
то такой образ еще предварительно нужно обработать утилитой simg2img. | |||
Эта утилита живет в ''system/extras/ext4_utils'' | |||
Собирается следующим образом: | |||
<pre> | |||
gcc -o simg2img -lz sparse_crc32.c simg2img.c | |||
</pre> | |||
Распаковать можно так: | |||
<pre> | |||
simg2img system.img system.raw.img | |||
</pre> | |||
---- | |||
==Yaffs2 образы партиций== | ==Yaffs2 образы партиций== |
Текущая версия от 22:34, 2 июня 2016
Образы (.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
попробую на досуге.