Образ Android


  Образ     Файлы       GPT       Разделы     RAW  

3. Таблица разделов GPT

Таблица разделов GPT (GUID Partition Table) хранится в файле sunxi_gpt.fex образа прошивки Андроид, записывается в начало загрузочного носителя (в нашем случае - SD-карта) и содержит 17 разделов:


№ Раздел Размер Начало Конец (в блоках LBA по 512 байт)

  • 1. bootloader - 65536 (32 Mb ) 32768 - 98303

  • 2. env - 32768 (16 Mb ) 98304 - 131071

  • 3. boot - 65536 (32 Mb ) 131072 - 196607

  • 4. super - 3145728 (1536 Mb ) 196608 - 3342335

  • 5. misc - 32768 (16 Mb ) 3342336 - 3375103

  • 6. recovery - 65536 (32 Mb ) 3375104 - 3440639

  • 7. cache - 1310720 (640 Mb ) 3440640 - 4751359

  • 8. vbmeta - 32768 (16 Mb ) 4751360 - 4784127

  • 9. vbmeta_system - 32768 (16 Mb ) 4784128 - 4816895

  • 10. vbmeta_vendor - 32768 (16 Mb ) 4816896 - 4849663

  • 11. metadata - 32768 (16 Mb ) 4849664 - 4882431

  • 12. private - 32768 (16 Mb ) 4882432 - 4915199

  • 13. frp - 1024 (512 Kb ) 4915200 - 4916223

  • 14. empty - 31744 (15.5 Mb ) 4916224 - 4947967

  • 15. media_data - 32768 (16 Mb ) 4947968 - 4980735

  • 16. Reserve0 - 32768 (16 Mb ) 4980736 - 5013503

  • 17. UDISK - 16 (8 Kb ) 5013504 - 5013519

    Файл sunxi_gpt.fex - это бинарный образ таблицы разделов. Однако его можно посмотреть в распакованном читабельном виде, результат распаковки :
    Структура таблицы разделов GPT

    Обратите внимание на начальный адрес самого первого раздела bootloader, значение которого равно 32768 блока. Это адрес раздела в исходном файле sunxi_gpt.fex образа прошивки.

    После записи образа на карту (прошивальщиком PhenixCard) таблицу разделов можно посмотреть непосредственно на карте, в том числе на карте, вставленной в устройство или подключенной через кардридер к USB.

    Существует несколько Linux-утилит для работы с таблицей GPT непосредственно на устройстве. В частности, консольная утилита fdisk для загрузочной карточки, подключенной через кардридер к USB-порту устройства, показывает:
    Дамп консольной утилиты fdisk

    Заметим, что этой утилитой под линуксом можно проверить правильность записи системы на карточку или просто идентифицировать - что именно записано на карточке. Например, в ситуации, когда есть несколько никак не маркированных внешне рабочих карточек с записанными системами.

    Под Windows таблицу разделов карточки, подключенной в кардридере к USB ПК, можно посмотреть с помощью программы Disk Internals Linux Reader:



    Непосредственно на устройстве с загруженной системой можно получить дамп, используя консольную утилиту sgdisk:


    console:/ # sgdisk --print /dev/block/mmcblk0

    Caution: invalid backup GPT header, but valid main header; regenerating backup header from main header.

    Warning! Error 2 reading partition table for CRC check!

    Warning! One or more CRCs don't match. You should repair the disk! Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk verification and recovery are STRONGLY recommended.

    Disk /dev/block/mmcblk0: 62333952 sectors, 29.7 GiB

    Logical sector size: 512 bytes

    Disk identifier (GUID): AB6F3888-569A-4926-9668-80941DCB40BC

    Partition table holds up to 20 entries

    First usable sector is 73728, last usable sector is 62333950

    Partitions will be aligned on 1024-sector boundaries

    Total free space is 33 sectors (16.5 KiB)

    Number Start End Size Code Name

    1 73728 139263 32.0 MiB 0700 bootloader

    2 139264 172031 16.0 MiB 0700 env

    3 172032 237567 32.0 MiB 0700 boot

    4 237568 3383295 1.5 GiB 0700 super

    5 3383296 3416063 16.0 MiB 0700 misc

    6 3416064 3481599 32.0 MiB 0700 recovery

    7 3481600 4792319 640.0 MiB 0700 cache

    8 4792320 4825087 16.0 MiB 0700 vbmeta

    9 4825088 4857855 16.0 MiB 0700 vbmeta_system

    10 4857856 4890623 16.0 MiB 0700 vbmeta_vendor

    11 4890624 4923391 16.0 MiB 0700 metadata

    12 4923392 4956159 16.0 MiB 0700 private

    13 4956160 4957183 512.0 KiB 0700 frp

    14 4957184 4988927 15.5 MiB 0700 empty

    15 4988928 5021695 16.0 MiB 0700 media_data

    16 5021696 5054463 16.0 MiB 0700 Reserve0

    17 5054464 62333917 27.3 GiB 0700 UDISK


    Можно прочитать первые 8192 байт (16 блоков) с карты на запущенном устройстве консольной командой:

  • dd if=/dev/block/mmcblk0 of=gpt-backup.img bs=512 count=16 - в текущую папку
  • dd if=/dev/block/mmcblk0 of=/mnt/media_rw/0000-006F/gpt-backup.img bs=512 count=16 - в корень USB-флешки

    Сохраненный файл gpt-backup.img - это бинарная таблица разделов GPT, имеющаяся на карте. После конвертации этого файла в текст получим такой список разделов:


  • 1. bootloader - 65536 (32 Mb ) 73728 - 139263

  • 2. env - 32768 (16 Mb ) 139264 - 172031

  • 3. boot - 65536 (32 Mb ) 172032 - 237567

  • 4. super - 3145728 (1536 Mb ) 237568 - 3383295

  • 5. misc - 32768 (16 Mb ) 3383296 - 3416063

  • 6. recovery - 65536 (32 Mb ) 3416064 - 3481599

  • 7. cache - 1310720 (640 Mb ) 3481600 - 4792319

  • 8. vbmeta - 32768 (16 Mb ) 4792320 - 4825087

  • 9. vbmeta_system - 32768 (16 Mb ) 4825088 - 4857855

  • 10. vbmeta_vendor - 32768 (16 Mb ) 4857856 - 4890623

  • 11. metadata - 32768 (16 Mb ) 4890624 - 4923391

  • 12. private - 32768 (16 Mb ) 4923392 - 4956159

  • 13. frp - 1024 (512 Kb ) 4956160 - 4957183

  • 14. empty - 31744 (15.5 Mb ) 4957184 - 4988927

  • 15. media_data - 32768 (16 Mb ) 4988928 - 5021695

  • 16. Reserve0 - 32768 (16 Mb ) 5021696 - 5054463

  • 17. UDISK - 57279454 (27968.48 Mb ) 5054464 - 62333917

    Из всех дампов, полученных с записанной карты разными способами, следует, что при записи фениксом imagewty-образа прошивки Android на карту происходит модификация таблицы GPT, которая заключается в сдвиге всех разделов вправо на величину 40960 блоков (блок = 512 байт).

    Соответственно, первый раздел bootloader (/dev/block/mmcblk0p1) начинается не с адреса 32768, указанного в исходном GPT-файле, а с адреса 73728, т.о. сдвиг составляет:
    73728 - 32768 = 40960

    Аналогичным образом сдвинуты все остальные разделы. Величина сдвига кратна размеру дискового 4K-сектора "расширенного формата", равного 4096 байт (4 Kбайт) и составляет 5120 таких 4K-секторов (40960 * 512 / 4096 = 5120).

    Таким образом, в начале карты между GPT и первым разделом bootloader) расположена неразмеченная (отсутствующая в GPT) область размером 73728 - 16 = 73712 блоков * 512 = 37 740 544 байт (36 Мб).

    Утилита Disk Internals Linux Reader показывает её как "Unallocated (нераспределенная) at start 36 Mb" .

    В эту область в её начало (т.е. со смещением 16 блоков от начала карты) записываются первая часть вторичного загрузчика Boot0, а также пакет основного вторичного загрузчика (в нём U-Boot), boot_package.fex со смещением 32800 блоков от начала карты.

    При модификации GPT вследствие увеличения адресов всех разделов изменяются также параметры заголовка GPT, а именно:

  • параметр First Usable LBA (равный адресу начала bootloader) увеличивается на 40960 блоков
  • параметр Header CRC32 устанавливается равным контрольной сумме заголовка
  • параметр Partitions CRC32 устанавливается равным контрольной сумме области разделов

    Для чего сделан этот сдвиг адресов ? Вероятно, из-за необходимости зарезервировать место для boot0 и boot_package, размеры которых могут увеличиваться при замене загрузчиков.


    Примечание 1.

    При записи образа утилитой PhoenixCard на SD-карту определяется её емкость (8, 16, 32 Gbyte), в соответствии с которой модифицируются параметры заголовка: Last Usable LBA (№ последнего используемого блока) и Alternate LBA (№ блока резервного GPT-раздела), которые имеют одинаковое значение, а также размер раздела U-Disk.

    Например,
  • для карты 8 Гб эти параметры равны 15523838 блоков (7761919 Kb)
  • для карты 16 Гб эти параметры равны 31116286 блоков (15558143 Kb)

    Примечание 2.

    При записи карты (проверено для режима StartUp) утилита Phoenix Card модифицирует таблицу GPT:

  • 1. Увеличивает стартовые адреса всех разделов на 40960 блоков
  • 2. Изменяет значения Alternate LBA и Last Usable LBA в соответствие с реальным размером карты
  • 3. Зачем-то изменяет в заголовке параметр Number Parts (количество разделов) с 17 на 20 (три "лишних" раздела - фиктивные)
  • 4. Увеличивает размер раздела UDISK до максимально возможного (до конца карты)
  • 5. По адресу со смещением 0x01C00 записывет строку "PHOENIX_CARD_IMG" (16 байт), после которой добавляет два 32-разрядных числа: 2097408 и 131084 (8 байт: 00 01 20 00 0C 00 02 00)


    Приложения.

    Как пользоваться утилитой partitions32.exe

    Эта утилита позволяет изменить размеры разделов (не меняя их порядок) в таблице разделов.

    Модифицируются файлы:

  • sunxi_mbr.fex
  • dlinfo.fex

    Оба этих бинарных файла, а также текстовый файл конфигурации sys_partition.fex загружаются в программу partitions32.exe.

    Изменения размеров разделов делаются простым редактированием текста sys_partition.fex в нижнем окне программы с сохранением этого файла кнопкой Save sys_partitions (до редактирования эта кнопка не активна).

    После чего становится активной кнопка Save sunxi_mbr,dlinfo, нажатием которой сохраняются эти два файла. Теперь все три отредатированных файла нужно скопировать в папку IMG.DUMP с распакованным образом. После обратной запаковки образа и записи его на карту таблица разделов будет с измененными размерами разделов.

    ВНИМАНИЕ ! При всех этих операциях файл таблицы разделов GPT sunxi_gpt.fex никак не изменяется. Однако его присутствие в архиве IMAGEWTY-образа обязательно, т.к. без этого файла карта будет записана без GPT.