Advanced partitioning

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

Введение

На карте есть скрытое место (на некоторых тошках две партиции по 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