Advanced partitioning
Введение
На карте есть скрытое место (на некоторых тошках две партиции по 1 MiB, на некоторых две по 2 MiB) [2]. Эти области описаны в регистре ext_csd контроллера. Сделаны они для того, чтобы туда пихать специфичный для девайса загрузчик.
Идея: запихать BCT + u-boot или BCT + fastboot + PT (PT нужен, чтобы fastboot нашел партицию LNX) в boot партиции, а ядро грузить с mmcblk0. На /dev/mmcblk0 можно будет сделать любую разметку.
Теория
В партиции BCT содержится информация об инициализации памяти, загрузчиках и т.п. [1]. С помощью bctdump можно посмотреть информацию в BCT. В партиции EBT содержится загрузчик (из коробки это fastboot). Также стоит учитывать, что при разбивке минимальный размер партиции составляет 524288 байт (256 секторов по 2048 байт). Посмотреть, какой размер у boot партиций можно в dmesg (ищем там boot0).
Идеи
Основная идея, запихать всю (или большую часть информации в область, занимаемую двумя boot партициями, чтобы основную часть накопителя можно было разбивать как угодно.
- Использовать u-boot - в BCT поместить совмещенный образ BCT и u-boot (работает у srwarren и PaulFertser)
Не пробовал.
- BCT, PT, EBT вместить область, занимаемую двумя boot партициями.
fastboot от андроида 2.1 больше 1 MiB, поэтому такой вариант на некоторых тошках возможен только с загрузчиком от 2.2 Вариант работает.
- BCT и EBT объединить (как в случае с u-boot'ом), PT оставить второй партицией.
Не работает, похоже fastboot не находит PT. Нужно перепроверить.
- BCT, PT и EBT обединить в один образ
Не работает, хз почему. Нужно перепроверить.
- BCT отдельно, PT и EBT объединить
Не пробовал.
TODO: посмотреть исходники tegrarcm на предмет поиска PT и использования более маленьких партиций при разбивке.
Практика
Сначала опишу различные действия, которые нам пригодятся. Они по большому счету не привязаны к какому-либо варианту разбивки.
Добываем fastboot
bct_dump part-2-android21.img | less Version = 0x00020001; BlockSize = 0x00004000; PageSize = 0x00000200; PartitionSize = 0x01000000; # Bootloader used = 1; # Bootloaders max = 4; # BCT size = 4080; # Hash size = 16; # Crypto offset = 16; # Crypto length = 4064; # Max BCT search blocks = 64; # # These values are set by cbootimage using the # bootloader provided by the Bootloader=... # configuration option. # # Bootloader[0].Version = 0x00000001; # Bootloader[0].Start block = 224; # Bootloader[0].Start page = 0; # Bootloader[0].Length = 1091568; # Bootloader[0].Load address = 0x00108000; # Bootloader[0].Entry point = 0x00108000; # Bootloader[0].Attributes = 0x00000004; ...
Т.е. загрузчик 2.1 имеет размер 1091568 байт, и будет искаться по смещению 3670016 (0x4000 * 224).
cp part-4.img fastoot-ac100-android21.bin truncate -s 1091568 fastoot-ac100-android21.bin
Готовим новый BCT
Нужно сохранить текущий конфиг
bct_dump part-2-android21.img > bct.cfg
добавить в конец (если добавить в начало, потеряется информация о sdram) информацию о загрузчике
BootLoader = fastoot-ac100-android21.bin,0x00108000,0x00108000,Complete;
и сгенерировать новый образ BCT
cbootimage -d ./bct.cfg ac100.bct.new
На этом этапе мы имеем новый образ, содержащий в себе загрузчик.
-rw-rw-r--. 1 stuw stuw 1131008 Dec 26 12:40 new.bct
информация о загрузчике обновлена
bct_dump new.bct | less Version = 0x00020001; BlockSize = 0x00004000; PageSize = 0x00000200; PartitionSize = 0x01000000; # Bootloader used = 1; # Bootloaders max = 4; # BCT size = 4080; # Hash size = 16; # Crypto offset = 16; # Crypto length = 4064; # Max BCT search blocks = 64; # # These values are set by cbootimage using the # bootloader provided by the Bootloader=... # configuration option. # # Bootloader[0].Version = 0x00020001; # Bootloader[0].Start block = 2; # Bootloader[0].Start page = 0; # Bootloader[0].Length = 1091568; # Bootloader[0].Load address = 0x00108000; # Bootloader[0].Entry point = 0x00108000; # Bootloader[0].Attributes = 0x00000000; ...
Теперь загрузчик будет искаться по смещению 32768. (убедитесь, что присутствует информация о sdram). По сути, BCT занимает 4080 байт, остальное занимает загрузчик, но часть места похоже не используется (после BCT и до загрузчика). Для использования с nvflash нужны только 4080 байт BCT.
Делаем разбивку
Покажу на примере конфига для тошки, с размером boot партиции 1MiB и с использованием загрузчика от 2.2 (от 2.1 не влезает). Разбивать будем так:
[ boot0 ][ boot1 ][ main mmc ] [ BCT ][ PT ][ EBT ][ MBR ][ LNX ]
Конфиг для данного случая будет выглядеть так:
[device] type=hsmmc instance=3 [partition] name=BCT id=2 type=boot_config_table allocation_policy=sequential filesystem_type=basic size=524288 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=PT id=3 type=partition_table allocation_policy=sequential filesystem_type=basic size=524288 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=EBT id=4 type=bootloader allocation_policy=sequential filesystem_type=basic size=1048576 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 filename=fastboot-ac100-22.bin [partition] name=MBR id=5 type=data allocation_policy=sequential filesystem_type=basic size=524288 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=LNX id=6 type=data allocation_policy=sequential filesystem_type=basic size=8388608 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0
Для создания recovey партиции (нужно использовать загрузчик от 2.1) нужно добавить еще одну секцию перед LNX (никто не мешает сделать эту партицию размером с LNX, чтобы туда запихать еще одно полноценное ядро для загрузки linux/android). Только я пока не знаю, как быть с номерами ;-)
[partition] name=SOS id=5 type=data allocation_policy=sequential filesystem_type=basic size=5242880 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0
Скрипт
Не оттестировано, использовать на свой страх и риск :) https://github.com/Stuw/ac100-repart
git clone git://github.com/Stuw/ac100-repart.git cd ac100-repart ./main.py
GPT
Процедура описана у Stephen'а в статье. Читать внимательно и вдумчиво, могут быть очепятки :)
Ссылки
[[1 ]] http://www.spinics.net/lists/linux-tegra/msg08125.html [[2 ]] http://ac100.grandou.net/swarren_brain_dump?&#mmc_boot_sectors