3. Таблица разделов GPT Таблица разделов GPT (GUID Partition Table) хранится в файле sunxi_gpt.fex образа прошивки Андроид, записывается в начало загрузочного носителя (в нашем случае - SD-карта) и содержит 17 разделов: № Раздел Размер Начало Конец (в блоках LBA по 512 байт) Файл sunxi_gpt.fex - это бинарный образ таблицы разделов. Однако его можно посмотреть в распакованном
читабельном виде, результат распаковки : Обратите внимание на начальный адрес самого первого раздела bootloader, значение которого равно 32768 блока. Это адрес раздела в исходном файле sunxi_gpt.fex образа прошивки. После записи образа на карту (прошивальщиком PhenixCard) таблицу разделов можно посмотреть непосредственно на карте, в том числе на карте, вставленной в устройство или подключенной через кардридер к USB. Существует несколько Linux-утилит для работы с таблицей GPT непосредственно на устройстве.
В частности, консольная утилита fdisk для загрузочной карточки, подключенной через кардридер
к USB-порту устройства, показывает: Заметим, что этой утилитой под линуксом можно проверить правильность записи системы на карточку или просто идентифицировать - что именно записано на карточке. Например, в ситуации, когда есть несколько никак не маркированных внешне рабочих карточек с записанными системами. Под Windows таблицу разделов карточки, подключенной в кардридере к USB ПК, можно посмотреть с помощью программы Disk Internals Linux Reader: 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 блоков) с карты на запущенном устройстве консольной командой: Сохраненный файл gpt-backup.img - это бинарная таблица разделов GPT, имеющаяся на карте. После конвертации этого файла в текст получим такой список разделов: Из всех дампов, полученных с записанной карты разными способами, следует, что при записи фениксом imagewty-образа прошивки Android на карту происходит модификация таблицы GPT, которая заключается в сдвиге всех разделов вправо на величину 40960 блоков (блок = 512 байт). Соответственно, первый раздел bootloader (/dev/block/mmcblk0p1) начинается не с адреса
32768, указанного в исходном GPT-файле, а с адреса 73728, т.о. сдвиг составляет: Аналогичным образом сдвинуты все остальные разделы. Величина сдвига кратна размеру дискового 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, а именно: Для чего сделан этот сдвиг адресов ? Вероятно, из-за необходимости зарезервировать место для boot0 и boot_package, размеры которых могут увеличиваться при замене загрузчиков. Примечание 1. При записи образа утилитой PhoenixCard на SD-карту определяется её емкость (8, 16, 32 Gbyte), в соответствии с которой модифицируются параметры заголовка: Last Usable LBA (№ последнего используемого блока) и Alternate LBA (№ блока резервного GPT-раздела), которые имеют одинаковое значение, а также размер раздела U-Disk. Например,При записи карты (проверено для режима StartUp) утилита Phoenix Card модифицирует таблицу GPT: Приложения.Как пользоваться утилитой partitions32.exeЭта утилита позволяет изменить размеры разделов (не меняя их порядок) в таблице разделов. Модифицируются файлы: Оба этих бинарных файла, а также текстовый файл конфигурации sys_partition.fex загружаются в программу partitions32.exe. Изменения размеров разделов делаются простым редактированием текста sys_partition.fex в нижнем окне программы с сохранением этого файла кнопкой Save sys_partitions (до редактирования эта кнопка не активна). После чего становится активной кнопка Save sunxi_mbr,dlinfo, нажатием которой сохраняются эти два файла. Теперь все три отредатированных файла нужно скопировать в папку IMG.DUMP с распакованным образом. После обратной запаковки образа и записи его на карту таблица разделов будет с измененными размерами разделов. ВНИМАНИЕ ! При всех этих операциях файл таблицы разделов GPT sunxi_gpt.fex никак не изменяется. Однако его присутствие в архиве IMAGEWTY-образа обязательно, т.к. без этого файла карта будет записана без GPT. |