O GNU GRUB (abreviação de GNU GRand Unified Bootloader) é um pacote gerenciador de inicialização do Projeto GNU. O GRUB é a implementação de referência da Especificação Multiboot da Free Software Foundation, que oferece ao usuário a opção de inicializar um dos vários sistemas operacionais instalados em um computador ou selecionar uma configuração específica do núcleo disponível nas partições de um determinado sistema operacional.
O GNU GRUB foi desenvolvido a partir de um pacote chamado Grand Unified Bootloader (uma brincadeira com a expressão Grand Unified Theory). Ele é usado predominantemente para sistemas do tipo Unix. O sistema operacional GNU usa o GNU GRUB como seu gerenciador de inicialização, assim como a maioria das distribuições Linux e o sistema operacional Solaris em sistemas x86, começando com a versão Solaris 10 1/06.
Características Os usuários podem configurar dinamicamente o subsistema do GRUB. O GRUB fornece uma interface de linha de comando simples, semelhante à do bash, à medida que é carregado, permitindo alterações no momento da inicialização, como a seleção de diferentes núcleos ou discos de RAM iniciais e permitindo aos usuários escrever novas sequências de inicialização em tempo real, além das listas de menus normais.
O GRUB é altamente portátil. Ele oferece suporte a vários formatos executáveis e é independente da tradução de geometria, incluindo suporte ao endereçamento de bloco lógico (LBA). Ele é compatível com todos os sistemas de arquivos Unix comumente usados e os sistemas de arquivos FAT e NTFS do Windows.
O GRUB pode fazer o download e descompactar automaticamente as imagens de inicialização do sistema operacional a partir da rede, oferecendo assim suporte a sistemas sem disco. O GRUB oferece suporte a sistemas operacionais que não são de inicialização múltipla usando o carregamento em cadeia. Ele usa as mesmas duas ou três linhas de sequências de comando para inicializar qualquer sistema DOS, Windows, Linux, BSD ou Solaris, o que torna muito fácil trabalhar com ele. Os carregadores em cadeia para os sistemas operacionais do tipo Unix compatíveis são incorporados ao GRUB.
O GRUB pode ser usado com uma variedade de interfaces de usuário. A maioria das distribuições Linux aproveita o suporte do GRUB a uma interface gráfica para fornecer um menu de inicialização personalizado com uma imagem de fundo. Uma modificação da interface de texto do GRUB pode usar um link serial para que um terminal remoto possa ter acesso ao gerenciador de inicialização.
O GRUB usa uma tela de rolagem para a seleção de inicialização do sistema operacional. Isso significa que 150 ou mais opções de inicialização podem ser facilmente controladas, bastando adicioná-las ao arquivo de configuração grub.cfg. As teclas de seta são usadas para selecionar o SO a ser inicializado. Além da interface de menu normal, o GRUB também oferece um prompt de comando de terminal semelhante ao bash, que fornece um rico conjunto de comandos para permitir que o usuário visualize ou altere qualquer parte do processo de inicialização. Com essas ferramentas, o GRUB pode ser usado a partir de um dispositivo externo, como um dispositivo USB ou um CD-ROM, ou via rede para instalar ou inicializar os sistemas operacionais.
Operação miniaturadaimagem|GRUB2 em um disco rígido particionado em MBR; o estágio 1 (boot.img) pode, alternativamente, ser gravado em um dos setores de inicialização da partição miniaturadaimagem|GRUB2 em um disco rígido particionado em GPT, inicializando no firmware BIOS ou no modo de compatibilidade do UEFI (CSM) Inicialização Quando um computador é ligado, o BIOS localiza o dispositivo inicializável primário configurado (geralmente o disco rígido do computador) e carrega e executa o programa de bootstrap inicial a partir do registro mestre de inicialização (MBR). O MBR é o primeiro setor do disco rígido, com zero como offset (a contagem de setores começa em zero). Durante muito tempo, o tamanho de um setor foi de 512 bytes, mas desde 2009 há discos rígidos disponíveis com um tamanho de setor de 4096 bytes, chamados discos de formato avançado. A partir de outubro de 2013, esses discos rígidos ainda são acessados em setores de 512 bytes, utilizando a emulação 512e.
A tabela de partição MBR legada suporta um máximo de quatro partições e ocupa 64 bytes. Juntamente com a assinatura de disco opcional (quatro bytes) e o registro de data e hora do disco (seis bytes), isso deixa entre 434 e 446 bytes disponíveis para o código de máquina de um carregador de inicialização. Embora um espaço tão pequeno possa ser suficiente para carregadores de inicialização muito simples, ele não é grande o bastante para conter um carregador de inicialização com suporte a sistemas de arquivos complexos e múltiplos, seleção de opções de inicialização orientada por menus, etc. Os carregadores de inicialização com pegadas maiores são, portanto, divididos em partes, onde a menor parte se encaixa e reside dentro do MBR, enquanto as partes maiores são armazenadas em outros locais (por exemplo, em setores vazios entre o MBR e a primeira partição) e invocadas pelo código do carregador de inicialização no MBR.
As imagens do núcleo do sistema operacional são, na maioria dos casos, arquivos que residem em sistemas de arquivos apropriados, mas o conceito de um sistema de arquivos é desconhecido pelo BIOS. Assim, em sistemas baseados no BIOS, o dever de um carregador de inicialização é acessar o conteúdo desses arquivos, para que ele possa ser carregado na RAM e executado.
Uma abordagem possível para os carregadores de inicialização carregarem imagens do núcleo é acessar diretamente os setores do disco rígido sem compreender o sistema de arquivos subjacente. Normalmente, é necessário um nível adicional de indireção, na forma de mapas ou arquivos de mapas arquivos auxiliares que contêm uma lista de setores físicos ocupados por imagens do núcleo. Esses mapas precisam ser atualizados sempre que uma imagem do núcleo muda sua localização física no disco, devido à instalação de novas imagens do núcleo, desfragmentação do sistema de arquivos, etc. Além disso, caso os mapas mudem de local físico, seus locais precisam ser atualizados no código do carregador de inicialização no MBR, para que o mecanismo de indireção de setores continue a funcionar. Isso não é apenas incômodo, mas também faz com que o sistema precise de reparos manuais caso algo dê errado durante as atualizações do sistema.
Outra abordagem é tornar um gerenciador de boot ciente dos sistemas de arquivos subjacentes, de modo que as imagens do núcleo sejam configuradas e acessadas usando seus caminhos de arquivo reais. Isso exige que um gerenciador de inicialização contenha um driver para cada um dos sistemas de arquivos suportados, de modo que eles possam ser compreendidos e acessados pelo próprio gerenciador de inicialização. Essa abordagem elimina a necessidade de locais codificados dos setores do disco rígido e a existência de arquivos de mapa, além de não exigir atualizações do MBR depois que as imagens do núcleo são adicionadas ou movidas. A configuração de um gerenciador de inicialização é armazenada em um arquivo comum, que também é acessado de uma forma sensível ao sistema de arquivos para obter configurações de inicialização antes da inicialização real de qualquer imagem do núcleo. Como resultado, a possibilidade de algo dar errado durante várias atualizações do sistema é significativamente reduzida. Como desvantagem, esses carregadores de inicialização aumentam a complexidade interna e ocupam um espaço ainda maior.
O GNU GRUB usa a segunda abordagem, compreendendo os sistemas de arquivos subjacentes. O próprio gerenciador de inicialização é dividido em vários estágios, o que permite que ele se encaixe no esquema de inicialização do MBR.
Duas versões principais do GRUB são de uso comum: A versão 1 do GRUB, chamada GRUB legacy, só prevalece em versões mais antigas das distribuições Linux, algumas ainda estão em uso e têm suporte, por exemplo, no CentOS 5. A versão 2 do GRUB, denominada GRUB 2, foi escrita do zero e destinada a substituir seu antecessor, e agora é usada pela maioria das distribuições Linux.
Versão 1 (GRUB Legacy) miniaturadaimagem|GRUB v1 em execução como parte de uma instalação do Ubuntu 8.04
O registro mestre de inicialização (MBR) geralmente contém o estágio 1 do GRUB, ou pode conter uma implementação padrão no MBR que faz o carregamento em cadeia do estágio 1 do GRUB a partir do setor de inicialização da partição ativa. Dado o tamanho pequeno de um setor de inicialização (512 bytes), o estágio 1 pode fazer pouco mais do que carregar o próximo estágio do GRUB carregando alguns setores do disco a partir de um local fixo próximo ao início do disco (nos primeiros 1024 cilindros).
O estágio 1 pode carregar o estágio 2 diretamente, mas normalmente é configurado para carregar o estágio 1.5, localizado nos primeiros 30 KiB do disco rígido, imediatamente após o MBR e antes da primeira partição. Caso esse espaço não esteja disponível (tabela de partição incomum, drivers de disco especiais, disco GPT ou LVM), a instalação do estágio 1.5 falhará. A imagem do estágio 1.5 contém drivers do sistema de arquivos, permitindo que ele carregue diretamente o estágio 2 de qualquer local conhecido no sistema de arquivos, por exemplo, de /boot/grub. O estágio 2 carregará então o arquivo de configuração padrão e quaisquer outros módulos necessários.
Versão 2 (GRUB 2) miniaturadaimagem|GRUB 2 - particionamento MBR vs. GPT e sequência de inicialização visualizada (sistemas que usam firmware BIOS) Inicialização em sistemas que usam firmware BIOS 1º Estágio: o boot.img é armazenado nos primeiros 440 bytes do Registro Mestre de Inicialização (MBR no setor 0) ou, opcionalmente, em um setor de inicialização de uma partição (PBR/VBR). Ele endereça o diskboot.img por um endereço LBA de 64 bits, portanto, pode carregar acima do limite de 2 TiB do MBR. O número real do setor é gravado pelo grub-install. 2º Estágio: diskboot.img é o primeiro setor do core.img (chamado de estágio 1.5 no Grub Legacy) com o único propósito de carregar o restante do core.img identificado por números de setor LBA também escritos pelo grub-install. Em discos particionados em MBR: o core.img (chamado de estágio 1.5 no Grub Legacy) é armazenado nos setores vazios entre o MBR e a primeira partição. Os sistemas operacionais recentes sugerem um espaço de 1 MiB aqui para alinhamento (2047*512 bytes ou 255*4KiB setores). Essa lacuna costumava ser de 62 (32 KiB) como um lembrete do limite de número de setor do endereçamento C/H/S usado pelo BIOS antes de 1998; portanto, o core.img foi projetado para ser menor que 32 KiB. Em discos particionados em GPT: as partições não são limitadas a 4, portanto o core.img é gravado em sua própria partição de inicialização do BIOS, minúscula (1 MiB) e sem sistema de arquivos. 3º estágio: o core.img entra no modo protegido de 32 bits, descompacta a si mesmo (o núcleo do grub e os módulos do sistema de arquivos para alcançar o /boot/grub) e, em seguida, carrega o /boot/grub/<plataforma>/normal.mod a partir da partição configurada pelo grub-install. Se o índice da partição tiver mudado, o Grub não conseguirá encontrar o normal.mod e apresentará ao usuário o prompt do Grub Rescue, onde o usuário "pode" encontrar e carregar o normal.mod ou o núcleo Linux. O diretório /boot/grub pode estar localizado em qualquer partição (o Grub pode ler muitos sistemas de arquivos, inclusive o NTFS). Dependendo de como foi instalado, ele está na partição raiz da distribuição ou em uma partição /boot separada. 4º estágio: normal.mod (equivalente ao estágio 2 no Grub Legacy) analisa /boot/grub/grub.cfg, opcionalmente carrega módulos (por exemplo, para a interface gráfica do usuário) e mostra o menu.
Inicialização em sistemas que usam firmware UEFI Comum em placas-mãe desde ca. 2012.