Тот, кто купил Мак по крайней мере в районе 2006 года, при переходе на Snow Leopard мог столкнуться с неприятным сюрпризом – Snow Leopard устанавливается только на диски со схемой разделов GUID partition table (GPT), а диск изначально был размечен под Apple Partition Map. Для меня процесс “перетасовки” жёстких дисков привычен, но даже мне пришлось попотеть, занимаясь созданием на внешнем диске GPT, а затем с помощью SuperDuper! дважды переливать содержимое диска 320 GB. Процесс обновления до Snow Leopard в итоге у меня удлинился ровно на 20 часов.
В этой статье я хочу остановиться на схеме разделов “Apple Partition Map”, а в следующей рассмотреть GUID partition table (GPT). В процессе изучения я использовал такие материалы:
- “Technical Note TN2166. Secrets of the GPT“;
- “Apple’s Transition from Apple Partition Map to the GUID Partition Table“;
- Книга “Mac OS X Internals. A Systems Approach“.
Воспользуюсь случаем и порекомендую библиотеку O’Reilly Safari Books Online, подписавшись на которую, вы сможете получить доступ к огромному количеству технической литературы. Книгу “Mac OS X Internals” я списал в формате PDF, так как у меня накопилось достаточное количество Download Tokens.
Apple Partition Map
Схема разделов Apple Partition Map (APM) была представлена на Macintosh II в 1987 году. Её дизайн был хорош, и она продержалась с небольшими изменениями на протяжении двадцати лет. Но за последние годы начали проявляться её ограничения. Различные переменные, адресующие блоки, описаны как 32-битные unsigned long, в итоге со стандартным размером блока 512 байт максимальный размер диска может быть 2 TB. Диски размером 2 TB уже доступны даже в сегменте desktop-компьютеров – например, Barracuda XT Desktop Hard Drive (SATA), и 32-битное ограничение уже достигнуто. Поэтому Apple заранее внедрил новую систему GUID partition table (GPT), о ней поговорим в следующей статье.
В отличие от DOS APM не содержит загрузочного кода (вспомним MBR в первом секторе диска под DOS). Загрузчики Open Firmware и EFI сами содержат код для загрузки с дисков APM. Также, в отличие от DOS, APM может описывать столько разделов, сколько требуется (в DOS же есть 4 Primary partition, один из которых может быть описан как Extended partition, а у же в нём можно создавать достаточно большое количество разделов – я встречал упоминание о 670 логических разделах).
Работать с таблицей разделов Apple Partition Map можно с помощью утилиты pdisk (Apple partition table editor).
Посмотрим главу 11 книги “Mac OS X Internals”. Вот пример типичной раскладки “UNIVERSAL HD” с поддержкой Mac OS 9:
$ sudo pdisk /dev/rdisk0 -dump Partition map (with 512 byte blocks) on '/dev/rdisk0' #: type name length base ( size ) 1: Apple_partition_map Apple 63 @ 1 2: Apple_Driver43*Macintosh 56 @ 64 3: Apple_Driver43*Macintosh 56 @ 120 4: Apple_Driver_ATA*Macintosh 56 @ 176 5: Apple_Driver_ATA*Macintosh 56 @ 232 6: Apple_FWDriver Macintosh 512 @ 288 7: Apple_Driver_IOKit Macintosh 512 @ 800 8: Apple_Patches Patch Partition 512 @ 1312 9: Apple_Free 262144 @ 1824 (128.0M) 10: Apple_HFS Apple_HFS_Untitled_1 24901840 @ 263968 ( 11.9G) 11: Apple_Free 16 @ 25165808 Device block size=512, Number of Blocks=25165824 (12.0G)
- Раздел 1, Apple_partition_map. Метаданные, относящиеся к таблице разделов. Размер 63 блока, каждый блок – 512 байт.
- Разделы 2-7. Разделы с дисковыми драйверами под Mac OS 9. Традиционно драйвера блочных устройств (например, дисков) могли загружаться из ROM, с устройств USB и Firewire, или со специального раздела на жёстком диске. Для поддержки нескольких операционных систем или же различных видов подключения, диск мог содержать несколько драйверов, установленных каждый на своём разделе. Например, раздел Apple_Driver43 содержит драйвер для SCSI Manager 4.3, а Apple_FWDriver – для подключения по Firewire. Mac OS X не использует эти драйвера.
- Раздел 8, Apple_Patches. Раздел, содержащий патчи, устанавливаемые на систему перед её загрузкой.
- Разделы 9 и 11, Apple_Free. Свободное место. Основная цель – “выравнять” раздел с данными, чтобы он начинался с определённого блока.
- Раздел 10. Здесь может уже располагаться файловая система с данными, например, HFS.
Кроме раскладки “UNIVERSAL HD” был также и “UNIVERSAL СD”, содержащий драйвера для ATAPI и SCSI Manager для дисковода CD.
Когда о Mac OS 9 все забыли, и необходимость в её поддержке отпала, то таблица APM стала выглядеть не так внушительно (я создал таблицу разделов на внешнем диске из-под Mac OS X 10.6):
$ pdisk /dev/rdisk2 -dump Partition map (with 512 byte blocks) on '/dev/rdisk2' #: type name length base ( size ) 1: Apple_partition_map Apple 63 @ 1 2: Apple_Free 262144 @ 64 (128.0M) 3: Apple_HFS apm 624880224 @ 262208 (298.0G) 4: Apple_Free 16 @ 625142432 Device block size=512, Number of Blocks=625142448 (298.1G) DeviceType=0x0, DeviceId=0x0
Все “legacy”-разделы с драйверами Mac OS 9 не создаются. Кроме раздела с файловой системой остались только раздел 1 с метаданными и Apple_Free.
Схема из “Mac OS X Internals” показывает детальную схему Apple Partition Map.
Первый физический блок диска содержат двухбайтовую сигнатуру 0×4552 (“ER”), затем идут 2 байта размера блока (0×0200 = 512 байт) и 4 байта количества блоков на диске (0x2542eab0 = 625142448 блоков = 320072933376 байт = 298 GB при использовании базы 1024, и 320 GB при использовании 1000):
$ sudo dd if=/dev/disk2 of=/dev/stdout bs=8 count=1 2>/dev/null | hexdump 0000000 45 52 02 00 25 42 ea b0 0000008
Начиная со второго блока идёт Apple_partition_map, описывающая таблицу разделов диска. Один блок – один раздел. Первый описывает себя же (Apple_partition_map). Количество разделов в APM не ограничено, но изменить их количество в дальнейшем невозможно. Подробная структура первого раздела Apple_partition_map приведена в таблице из статьи “Apple’s Transition from Apple Partition Map to the GUID Partition Table“:
Байты 88-91 описывают статус раздела:
Давайте посмотрим таблицу разделов на нашем USB-диске. Сначала берём вывод pdisk:
$ pdisk /dev/rdisk2 -dump Partition map (with 512 byte blocks) on '/dev/rdisk2' #: type name length base ( size ) 1: Apple_partition_map Apple 63 @ 1 2: Apple_Free 262144 @ 64 (128.0M) 3: Apple_HFS apm 624880224 @ 262208 (298.0G) 4: Apple_Free 16 @ 625142432
Cчитываем раздел 1
$ sudo dd if=/dev/disk2 of=/dev/stdout bs=512 count=1 skip=1 2>/dev/null | hexdump -C 00000000 50 4d 00 00 00 00 00 04 00 00 00 01 00 00 00 3f |PM.............?| 00000010 41 70 70 6c 65 00 00 00 00 00 00 00 00 00 00 00 |Apple...........| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 41 70 70 6c 65 5f 70 61 72 74 69 74 69 6f 6e 5f |Apple_partition_| 00000040 6d 61 70 00 00 00 00 00 00 00 00 00 00 00 00 00 |map.............| 00000050 00 00 00 00 00 00 00 3f 00 00 00 03 00 00 00 00 |.......?........| 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200
- 00-01. Signature Value 0x504d
- 04-07. Total number of partitions = 00 00 00 04, да именно так, у нас есть 4 раздела.
- 08-11 (0×08-0x0b). Starting sector of partition = 00 00 00 01. Да, начинается с первого сектора.
- 12-15 (0x0c-0x0f). Size of partition in sectors = 00 00 00 3f = 63.
- 16-47 (0×10-0x2f). Name of partition in ASCII = “Apple”
- 48-79 (0×30-0x4f). Type of partition in ASCII = “Apple_partition_map”
- 80-83 (0×50-0×53). Starting sector of data area in partition = 00 00 00 00
- 84-87 (0×54-0×57). Size of data area in sectors = 00 00 00 3f = 63
- 88-91 (0×58-0x5B). Status of partition = 00 00 00 03 = 01 | 02 = “Entry is valid” | “Entry is allocated”
Apple_Free слабо интересует
$ sudo dd if=/dev/disk2 of=/dev/stdout bs=512 count=1 skip=2 2>/dev/null | hexdump -C 00000000 50 4d 00 00 00 00 00 04 00 00 00 40 00 04 00 00 |PM.........@....| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000030 41 70 70 6c 65 5f 46 72 65 65 00 00 00 00 00 00 |Apple_Free......| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200
Разберём раздел с данными
$ sudo dd if=/dev/disk2 of=/dev/stdout bs=512 count=1 skip=3 2>/dev/null | hexdump -C 00000000 50 4d 00 00 00 00 00 04 00 04 00 40 25 3e ea 60 |PM.........@%>.`| 00000010 61 70 6d 00 00 00 00 00 00 00 00 00 00 00 00 00 |apm.............| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 41 70 70 6c 65 5f 48 46 53 00 00 00 00 00 00 00 |Apple_HFS.......| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000050 00 00 00 00 25 3e ea 60 40 00 00 33 00 00 00 00 |....%>.`@..3....| 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200
- 00-01. Signature Value 0x504d
- 04-07. Total number of partitions = 00 00 00 04, всего 4 раздела.
- 08-11 (0×08-0x0b). Starting sector of partition = 00 04 00 40 = 262208. Начинается с блока 262208.
- 12-15 (0x0c-0x0f). Size of partition in sectors = 25 3e ea 60 = 63. Размер 624880224 блоков = 320072933376 байт
- 16-47 (0×10-0x2f). Name of partition in ASCII = “apm”. Имя раздела – “apm”
- 48-79 (0×30-0x4f). Type of partition in ASCII = “Apple_HFS”. Файловая система HFS
- 80-83 (0×50-0×53). Starting sector of data area in partition = 00 00 00 00
- 84-87 (0×54-0×57). Size of data area in sectors = 25 3e ea 60
- 88-91 (0×58-0x5B). Status of partition = 40 00 00 33 = 01 | 02 | 10 | 20 | 40000000 = “Entry is valid” | “Entry is allocated” | “Partition is readable” | “Automatically mount at startup”
Последний Apple_Free тоже не рассматриваем:
$ sudo dd if=/dev/disk2 of=/dev/stdout bs=512 count=1 skip=4 2>/dev/null | hexdump -C 00000000 50 4d 00 00 00 00 00 04 25 42 ea a0 00 00 00 10 |PM......%B......| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000030 41 70 70 6c 65 5f 46 72 65 65 00 00 00 00 00 00 |Apple_Free......| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200
Окончание
Со схемой разделов Apple Partition Map мы познакомились. Это полезно, несмотря на то, что она уже почти не используется на новых системах, особенно под управлением Snow Leopard. Статья получилась достаточно большая как для одного дня, поэтому GUID partition table (GPT) я рассмотрю в следующий раз.

