Tabelas de Partição, MBR e GPT
Uma tabela de partição é o que divide um único disco físico nas regiões separadas que um sistema operacional trata como volumes independentes, cada um com seu próprio sistema de arquivos e suas próprias fronteiras que o resto do disco nunca deveria tocar. BIOS vs. UEFI já nomeia MBR e GPT como o esquema de particionamento que cada tipo de firmware convencionalmente pareia; este artigo cobre os dois formatos em si; a camada VFS só entra em cena depois, uma vez que uma partição específica já foi localizada e entregue a ela como algo parecido com um disco comum.
O MBR clássico
Seção intitulada “O MBR clássico”O Master Boot Record empacota sua tabela de partição no mesmo setor de 512 bytes que o próprio código de boot e a assinatura de boot 0x55AA, deixando espaço para exatamente quatro entradas de partição primária, 16 bytes cada, começando num offset fixo (0x1BE) dentro do setor.
struct mbr_partition_entry { uint8_t boot_flag; // 0x80 = ativa/inicializável, 0x00 caso contrário uint8_t start_chs[3]; // endereço CHS legado, raramente confiado hoje uint8_t type; // byte único identificando o sistema de arquivos/SO uint8_t end_chs[3]; uint32_t start_lba; uint32_t sector_count;} __attribute__((packed));Quatro entradas é um teto rígido embutido no próprio tamanho fixo do setor, contornado na prática por uma partição estendida: um dos quatro slots primários é marcado com um byte de tipo especial e, em vez de descrever um sistema de arquivos comum, aponta para uma cadeia de tabelas de partição adicionais (cada uma novamente em seu próprio bloco no formato de setor de boot) contendo qualquer número de partições lógicas ligadas uma após a outra. O outro limite consequente é a largura de 32 bits de sector_count: no tamanho de setor padrão de 512 bytes, esse campo só consegue endereçar até 2³² setores, aproximadamente 2 TiB, uma quantidade que muitos discos lançados nos anos depois da introdução do MBR já ultrapassaram, sem forma alguma de o próprio formato descrever qualquer coisa além dessa fronteira.
A GUID Partition Table substitui o setor fixo de quatro entradas do MBR por uma estrutura consideravelmente maior e extensível, ainda começando com algo que parece um MBR comum: um único MBR protetivo ocupando o mesmo primeiro setor, sua única entrada de partição marcada com um byte de tipo (0xEE) significando “este disco inteiro é GPT”, especificamente para que software que só entende MBR veja um disco que parece totalmente alocado em vez de um que poderia de outra forma tentar reinicializar ou sobrescrever.
struct gpt_header { char signature[8]; // "EFI PART" uint32_t revision; uint32_t header_size; uint32_t header_crc32; uint64_t my_lba; uint64_t alternate_lba; // local do header de backup uint64_t partition_entries_lba; uint32_t num_partition_entries; uint32_t partition_entry_size; uint32_t partition_entry_array_crc32; // ...} __attribute__((packed));Imediatamente depois do MBR protetivo fica o header GPT real, autodescritivo e com checksum (header_crc32 cobre o próprio header, partition_entry_array_crc32 cobre as entradas separadamente), seguido pelo array de entradas de partição: cada entrada identifica sua partição por um GUID de 128 bits em vez de um único byte de tipo, dando ao GPT espaço de identificador suficiente para distinguir tipos de sistema de arquivos e volumes específicos com precisão, sem as colisões às quais um campo de tipo de MBR de um byte fica propenso conforme mais sistemas de arquivos e sistemas operacionais se acumulam ao longo de décadas. O GPT mantém um backup completo tanto do header quanto do array de entradas bem no fim do disco, referenciado pelo próprio campo alternate_lba do header primário, então um header primário corrompido (um setor primário defeituoso, por exemplo) não significa necessariamente que o layout de partição em si está perdido, uma redundância que o setor único e não espelhado do MBR nunca forneceu.
Notas de implementação
Seção intitulada “Notas de implementação”Um driver lendo campos CHS (cilindro-cabeça-setor) estilo MBR está lendo um esquema de endereçamento legado raramente confiado para qualquer coisa além de compatibilidade hoje; start_lba e sector_count, ambos já endereços de bloco lógico em vez de geometria física, são o que de fato importa em essencialmente qualquer disco construído desde os primeiros anos do MBR. Localizar as partições de fato utilizáveis de um disco GPT significa ler partition_entries_lba e percorrer num_partition_entries registros de tamanho fixo a partir dali, checando o GUID de cada entrada contra um GUID nulo (todos os bytes zero) para distinguir um slot em uso de um simplesmente não alocado, em vez de presumir que todo slot até num_partition_entries nomeia uma partição real.
Referências
Seção intitulada “Referências”- ^ UEFI Forum, UEFI Specification, Capítulo 5: a especificação formal do GPT, incluindo layout do header, o MBR protetivo, e posicionamento do CRC32.
Ver também
Seção intitulada “Ver também”- BIOS vs. UEFI: os tipos de firmware com os quais MBR e GPT são convencionalmente, embora não exclusivamente, pareados.
- VFS: a camada que só assume o controle depois que uma partição específica descrita aqui já foi localizada.
- Controlador de Disquete: o esquema de endereçamento CHS referenciado acima, usado pelo próprio MBR clássico.