No MBR criado pelo GRUB2, iniciando no deslocamento 0x5c, há um valor de 64 bits little-endian indicando o número do próximo bloco de disco a ser carregado. Este é frequentemente o bloco 0x00000000 00000001, isto é, o bloco seguinte depois do MBR.
(Por antiga convenção DOS, a primeira partição começará no início do cilindro # 1, então normalmente há um número de blocos não utilizados disponíveis no cilindro # 0 após o MBR. Em sistemas modernos, a primeira partição é tipicamente alinhada para iniciar a partir do bloco # 2048, ou seja, exatamente 1 MB a partir do início do disco. Isso gera ainda mais blocos livres antes do início da primeira partição.)
Este segundo bloco contém mais um código do kernel do GRUB, e uma lista de bloqueio que especifica os blocos para carregar o restante da imagem principal do GRUB. A lista de bloqueio está localizada no final desse bloco. Cada entrada da lista de bloqueio tem 12 bytes de comprimento e é estruturada da seguinte forma:
struct __attribute__ ((packed)) g2_blist_entry {
uint64_t start_lba; # the LBA block number of the first block covered by this entry
uint16_t num_blocks; # number of blocks to read
uint16_t startseg; # segment address in memory to write them to
};
Normalmente, a lista de bloqueio tem apenas uma entrada que abrange todos os blocos restantes para ler, a partir do bloco 0x00000000 00000002.
O comprimento da imagem principal do GRUB varia de acordo com a versão do GRUB e o número de módulos anexados ao kernel do GRUB.
Por exemplo, no meu sistema Debian 9 que usa boot MBR legado, o GRUB engloba um total de 103 blocos após o MBR. Em uma VM do RHEL 7.4, o comprimento total é de 107 blocos após o MBR.