Тот, кто купил Мак по крайней мере в районе 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). В процессе изучения я использовал такие материалы:

Воспользуюсь случаем и порекомендую библиотеку 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.

Первый физический блок диска содержат двухбайтовую сигнатуру 0x4552 ("ER"), затем идут 2 байта размера блока (0x0200 = 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 (0x08-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 (0x10-0x2f). Name of partition in ASCII = "Apple"
  • 48-79 (0x30-0x4f). Type of partition in ASCII = "Apple_partition_map"
  • 80-83 (0x50-0x53). Starting sector of data area in partition = 00 00 00 00
  • 84-87 (0x54-0x57). Size of data area in sectors = 00 00 00 3f = 63
  • 88-91 (0x58-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 (0x08-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 (0x10-0x2f). Name of partition in ASCII = "apm". Имя раздела - "apm"
  • 48-79 (0x30-0x4f). Type of partition in ASCII = "Apple_HFS". Файловая система HFS
  • 80-83 (0x50-0x53). Starting sector of data area in partition = 00 00 00 00
  • 84-87 (0x54-0x57). Size of data area in sectors = 25 3e ea 60
  • 88-91 (0x58-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) я рассмотрю в следующий раз.