# GNU GRUB

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
### 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)

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)
#### 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.
* O /efi/<distro>/grubx64.efi é instalado como um arquivo na partição do sistema EFI, e inicializado diretamente pelo firmware, sem um boot.img no setor 0.
* O /boot/grub/ também pode ser instalado na partição do sistema EFI.

#### Depois da inicialização

O GRUB apresenta um menu, no qual o usuário pode escolher entre os sistemas operacionais (SO) encontrados pelo grub-install. O GRUB pode ser configurado para carregar automaticamente um SO especificado após um tempo limite definido pelo usuário; se o tempo limite for definido como zero segundos, pressionar e manter pressionada a tecla Shift enquanto o computador estiver sendo inicializado permite acessar o menu de inicialização.
No menu de seleção do sistema operacional, o GRUB aceita alguns comandos:
* Ao pressionar e, é possível editar os parâmetros do item de menu selecionado antes que o sistema operacional seja iniciado. O motivo para fazer isso no GRUB (ou seja, não editar os parâmetros em um sistema já inicializado) pode ser um caso de emergência: o sistema falhou na inicialização. Usando a linha de parâmetros do núcleo, é possível, entre outras coisas, especificar um módulo a ser desativado (colocado na lista negra) para o núcleo. Isso pode ser necessário se o módulo específico do núcleo estiver quebrado e, portanto, impedir a inicialização. Por exemplo, para colocar na lista negra o módulo do núcleo nvidia-current, pode-se acrescentar modprobe.blacklist=nvidia-current no final dos parâmetros do núcleo.
* Ao pressionar c, o usuário entra na linha de comando do GRUB. A linha de comando do GRUB não é um shell normal do Linux, como, por exemplo, o bash, e aceita apenas determinados comandos específicos do GRUB, documentados por várias distribuições do Linux.
Depois que as opções de inicialização são selecionadas, o GRUB carrega o núcleo selecionado na memória e passa o controle para o núcleo. Como alternativa, o GRUB pode passar o controle do processo de inicialização para outro carregador de inicialização, usando o carregamento em cadeia. Esse é o método usado para carregar sistemas operacionais que não são compatíveis com a Especificação Multiboot ou que não são suportados diretamente pelo GRUB.
Se o uso do dm-crypt for pretendido, o conteúdo do /boot, ou seja, /boot/grub, o núcleo Linux e o initramfs, respectivamente o initrd, precisam estar em uma partição não criptografada distinta, pois a lógica para lidar com partições criptografadas reside dentro do núcleo do Linux.

## História

O GRUB foi inicialmente desenvolvido por Erich Boleyn como parte do trabalho de inicialização do sistema operacional GNU/Hurd, desenvolvido pela Free Software Foundation. Em 1999, Gordon Matzigkeit e Yoshinori K. Okuji tornaram o GRUB um pacote de software oficial do Projeto GNU e abriram o processo de desenvolvimento ao público. A partir de 2014, a maioria das distribuições Linux adotou o GNU GRUB 2, bem como outros sistemas, como o PlayStation 4 da Sony.

### Desenvolvimento

O GRUB versão 1 (também conhecido como "GRUB Legacy") não está mais em desenvolvimento e está sendo eliminado gradualmente. Os desenvolvedores do GNU GRUB mudaram seu foco para o GRUB 2, uma reescrita completa com objetivos que incluem tornar o GNU GRUB mais limpo, mais robusto, mais portátil e mais poderoso. O GRUB 2 começou com o nome PUPA. O PUPA foi apoiado pela Agência de Promoção da Tecnologia da Informação (Information-technology Promotion Agency, IPA) do Japão. O PUPA foi integrado ao desenvolvimento do GRUB 2 por volta de 2002, quando a versão 0.9x do GRUB foi renomeada para GRUB Legacy.
Alguns dos objetivos do projeto GRUB 2 incluem suporte a plataformas não-x86, internacionalização e localização, caracteres não-ASCII, módulos dinâmicos, gerenciamento de memória, uma mini-linguagem de script, migração de código específico de plataforma (x86) para módulos específicos de plataforma e uma estrutura orientada a objetos. O GNU GRUB versão 2.00 foi lançado oficialmente em 26 de junho de 2012.
Três das distribuições Linux mais amplamente utilizadas usam o GRUB 2 como seu gerenciador de inicialização principal. O Ubuntu adotou ele como o gerenciador de inicialização padrão em sua versão 9.10 de outubro de 2009. O Fedora seguiu o exemplo com o Fedora 16, lançado em novembro de 2011. O openSUSE adotou o GRUB 2 como gerenciador de inicialização padrão em sua versão 12.2, de setembro de 2012. O Solaris também adotou o GRUB2 na plataforma x86 na versão Solaris 11.1.
No final de 2015, o exploit de pressionar backspace 28 vezes para contornar a senha de login foi encontrado e rapidamente corrigido.

### Variantes

O GNU GRUB é um software livre e de código aberto, por isso foram criadas diversas variantes. Algumas notáveis, que não foram incorporadas à linha principal do GRUB:
* O OpenSolaris inclui um GRUB Legacy modificado que suporta rótulos de disco BSD, seleção automática de núcleo de 64 bits e inicialização a partir do ZFS (com compactação e vários ambientes de inicialização).
* O Google Summer of Code 2008 tinha um projeto de suporte ao GRUB legacy para inicializar a partir de partições formatadas em ext4.
* O projeto Syllable criou uma versão modificada do GRUB para carregar o sistema a partir de seu sistema de arquivos AtheOS.
* O TrustedGRUB amplia o GRUB implementando a verificação da integridade do sistema e a segurança do processo de inicialização, usando o Trusted Platform Module (TPM).
* O Intel BIOS Implementation Test Suite (BITS) fornece um ambiente GRUB para testar BIOSes e, em particular, a inicialização de processadores, hardware e tecnologias Intel. O BITS é compatível com scripts via Python e inclui APIs Python para acessar várias funcionalidades de baixo nível da plataforma de hardware, incluindo ACPI, registros da CPU e do chipset, PCI e PCI Express.
* O GRUB4DOS é um fork do GRUB legacy que aprimora a experiência de instalação no DOS e no Microsoft Windows, colocando tudo além da configuração do GRLDR em um arquivo de imagem. Ele pode ser carregado diretamente do DOS ou pelo NTLDR ou Windows Boot Manager. O GRUB4DOS está em desenvolvimento ativo e, a partir de 2021, será compatível com UEFI.

## Utilitários
### Ferramentas de configuração do GRUB

As ferramentas de configuração em uso por várias distribuições geralmente incluem módulos para configurar o GRUB. Por exemplo, o YaST2 nas distribuições SUSE Linux e openSUSE e o Anaconda nas distribuições Fedora/RHEL. O StartUp-Manager e o GRUB Customizer são editores de configuração gráfica para distribuições baseadas no Debian.
Para o GRUB 2, existem os módulos de controle do KDE.
O GRLDR ICE é uma pequena ferramenta para modificar a configuração padrão do arquivo grldr para o GRUB4DOS.

### Outros utilitários

O GRUB Utilities é uma coleção de utilitários multiplataforma para o GRUB Legacy, o GRUB 2 e o GRUB para DOS.
O Boot-Repair é uma ferramenta gráfica simples para recuperação de problemas frequentes relacionados à inicialização com o GRUB e o carregador de inicialização do Microsoft Windows. Esse aplicativo está disponível sob a licença GNU GPL. O Boot-Repair pode reparar o GRUB em várias distribuições Linux, incluindo, mas não se limitando a, Debian, Ubuntu, Mint, Fedora, openSUSE e Arch Linux.
O Grub2Win é um pacote de software de código aberto para Windows. Ele permite que o GNU Grub inicialize a partir de um diretório do Windows. O programa de configuração instala o GNU Grub versão 2.02 em uma partição NTFS. Em seguida, um aplicativo GUI no Windows é usado para personalizar o menu de inicialização do Grub, os temas, a ordem de inicialização no UEFI, os scripts etc. Todos os scripts e comandos do GNU Grub são compatíveis com sistemas UEFI e legados. O Grub2Win pode configurar o Grub para inicialização múltipla do Windows, Ubuntu, openSuse, Fedora e muitas outras distribuições Linux. Ele está disponível gratuitamente sob a licença GNU GPL no SourceForge.