Com o intuito de sanar dúvidas que surgem no nosso grupo do Telegram faremos uma introdução ao funcionamento do GRUB. Explicaremos o funcionamento deste gerenciador de boot mais utilizado nas distribuições Linux atuais. Também apresentaremos alguns conceitos que podem evitar problemas futuros. Este artigo e essencial para quem quer aprender mais sobre o GRUB tão necessário em sistemas Linux. Saiba também quais as diferenças entre o GRUB1, GRUB2, GRUB Legacy e GRUB.
Introdução ao funcionamento do GRUB
1 – O que é GRUB?
GRUB significa GRand Unified Bootloader (“Carregador de inicialização unificado”). Sua função é principalmente assumir o controle da BIOS no tempo de boot, carregar a si mesmo, carregar o kernel do Linux na memória e entregar a execução para o kernel. Uma vez entregue a execução para o kernel, o GRUB terá feito o seu trabalho e enfim não será mais necessário até o próximo boot. Caso queira saber mais sobre o funcionamento completo do processo de boot no Linux, leia o artigo abaixo:
O GRUB suporta múltiplas versões de kernel do Linux e outros sistemas operacionais. Permite que o usuário selecione entre eles no tempo de boot usando um menu. Isso é muito útil pois podem existir diversas aplicações ou serviços de sistemas que podem falhar com determinada versão de kernel. É possível utilizar uma versão mais antiga do kernel através do GRUB.
2 – Quais as diferenças entre o GRUB 1 x GRUB 2 x GRUB Legacy x GRUB no Linux
Conforme os sites GNU GRUB e Wikipedia, o GRUB foi originalmente projetado e implementado por Erich Stefan 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 fizeram do GRUB um pacote oficial do Projeto GNU e abriram o processo de desenvolvimento para o público.
O GRUB 2 é uma rescrita completa do GRUB 1 com várias melhorias. Ou seja, o GRUB 2 é mais limpo, portátil, robusto e poderoso. O GRUB 2 começou sob o nome PUPA. O PUPA foi apoiado pela Agência de Promoção da Tecnologia da Informação (IPA) no Japão. Foi integrado ao desenvolvimento do GRUB 2 por volta de 2002, quando a versão 0.9x do GRUB foi renomeada para GRUB Legacy. O GRUB 1 ou GRUB Legacy não está mais em desenvolvimento e está sendo descontinuado.
A partir de 2014, a maioria das distribuições Linux adotaram o GNU GRUB 2. Por isso, ela foi renomeada para somente GRUB.
Em suma:
- GRUB 1 é a mesma coisa que GRUB Legacy.
- GRUB 2 é a mesma coisa que GRUB e também pode ser chamado de GNU GRUB 2.
Para facilitar no entendimento, neste artigo utilizaremos somente o termo GRUB.
2 – O menu do GRUB no Linux
Primeiramente, a função do menu do GRUB é permitir que o usuário selecione um dos kernels instalados para inicializar. Usar as teclas de seta para cima e para baixo permite selecionar o kernel desejado. Pressionar a tecla Enter continua o processo de inicialização usando o kernel selecionado.
Em segundo lugar, o menu do GRUB também fornece um tempo limite para inicializar com o kernel padrão sem intervenção do usuário. Pressionar qualquer tecla no teclado, exceto a tecla Enter, encerra o cronômetro de contagem regressiva exibido no console. Pressionar a tecla Enter imediatamente continua o processo de inicialização com o kernel padrão ou um opcionalmente selecionado.
Assim também o menu do GRUB fornece um kernel de “resgate” para uso na resolução de problemas ou quando os kernels normais não completam o processo de inicialização.
Além disso, temos um artigo onde abordamos os principais problemas apresentados durante o boot no Linux.
3 – O arquivo grub.cfg do GRUB Linux
O grub.cfg é o arquivo principal de configuração do GRUB. No entanto ele é gerado pelo programa grub-mkconfig usando um conjunto de arquivos de configuração primários e o arquivo padrão do GRUB como uma fonte para as especificações de configuração do usuário. O arquivo /boot/grub/grub.cfg é gerado primeiro durante a instalação do Linux e regenerado quando um novo kernel é instalado.
O arquivo grub.cfg contém código semelhante ao bash e uma lista de kernels instalados em uma matriz ordenada pela sequência de instalação. Por exemplo, se você tiver quatro kernels instalados, o kernel mais recente estará no índice 0, o kernel anterior estará no índice 1 e o kernel mais antigo será o índice 3. O arquivo grub.cfg é bem grande, mas abaixo segue um trecho com as entradas das versões de kernel destacadas.
4 – Arquivos de configuração do GRUB no Linux
O conjunto principal de arquivos de configuração para o grub.cfg está localizado no diretório /etc/grub.d/. Cada um dos arquivos nesse diretório contém o código do GRUB que é coletado no arquivo grub.cfg. O esquema de numeração usado nos nomes desses arquivos de configuração é projetado para fornecer ordenação para que o arquivo grub.cfg final seja montado na sequência correta. Cada um desses arquivos tem um comentário para indicar o início e o fim da seção. Então esses comentários também fazem parte do arquivo grub.cfg para ser possível ver de qual arquivo cada seção é gerada.
Os comentários delimitadores são assim:
### BEGIN /etc/grub.d/00_header ###
### END /etc/grub.d/00_header ###
Como o arquivo grub.cfg é gerado deste conjunto de arquivos no /etc/grub.d/ através do comando grub-mkconfig, não é recomendável editar estes arquivos. A maioria das distribuições, ao fazer a instalação de novas versões de kernel, executam automaticamente o comando grub-mkconfig.
Os erros do GRUB estão principalmente relacionados a essas modificações indevidas. Só edite estes arquivos se você for um especialista GRUB ou está estudando melhor esta ferramenta por conta própria.
Você deve ter ciência das consequências de qualquer alteração feita nesses arquivos e deve manter um backup do arquivo grub.cfg original. Caso você queira fazer alguma modificação relacionada ao menu do GRUB, recomendamos instalar o pacote grub-customizer.
5 – O único arquivo “modificável” do GRUB
Em contrapartida, o único arquivo que é interessante modificar é o /etc/default/grub e ele é bem simples. Podemos alterar os valores das palavras-chave existentes ou adicionar outras palavras-chave que ainda não estejam no arquivo, por exemplo:
A seção 6 do manual do GRUB possui todas as informações sobre as possíveis palavras-chave que podem ser incluídas neste arquivo. Só para exemplificar, abaixo descrevemos algumas palavras-chave. No entanto, cada distribuição Linux pode não ter alguns itens listados. Desta forma, falaremos do padrão conforme o que consta na literatura.
- GRUB_TIMEOUT: O valor dessa chave determina o tempo que o menu de seleção do GRUB é exibido. O GRUB oferece a capacidade de manter múltiplos kernels instalados e escolher entre eles usando um menu. O valor padrão para essa chave é de 5 segundos. Mas você pode modificá-lo para permitir mais tempo para visualizar as opções e fazer uma seleção.
- GRUB_DISTRIBUTOR: Essa chave define uma expressão sed que extrai o número da release de distribuição do arquivo /etc/system-release. Então esta informação é usada para gerar os nomes de texto para cada release do kernel que aparece no menu GRUB, como “Debian”. No entanto, a imagem exemplo foi tirada do Ubuntu que é uma derivação do Debian. Mas devido a variações na estrutura dos dados entre distribuições, essa expressão pode diferir em cada sistema.
- GRUB_DEFAULT: Determina qual kernel é inicializado por padrão. O padrão normalmente utilizado é o kernel mais recente. Outras opções aqui são um número que representa o índice da lista de kernels no grub.cfg, que inicia em 0.
- GRUB_DISABLE_SUBMENU: É possível criar uma estrutura de menus hierárquica de kernels para a tela do menu do GRUB. Essa chave, junto com algumas configurações adicionais das sub-rotinas do kernel em grub.cfg criam tal hierarquia. Por exemplo, um pode ter o menu principal com sub-menus “produção” e “teste” onde cada submenu conteria os kernels apropriados. Definir isso como “false” permitiria o uso de submenus.
- GRUB_TERMINAL_OUTPUT: Em alguns ambientes pode ser necessário redirecionar a saída de texto para um terminal de exibição diferente. O padrão é enviar a saída para a tela / monitor local. Por exemplo, podemos especificar uma porta serial no qual as informações de todo o data center é centralizado.
- GRUB_CMDLINE_LINUX: Esta chave contém os argumentos da linha de comando que serão passados para o kernel no momento da inicialização. Portanto estes argumentos serão adicionados à linha do kernel do grub.cfg para todos os kernels instalados.
- GRUB_DISABLE_RECOVERY: Cria opções de “resgate” para cada kernel.
- false: Uma entrada de recuperação é criada no menu GRUB para cada kernel instalado.
- true: Nenhuma entrada de recuperação é criada. Independentemente dessa configuração, a última entrada do kernel é sempre uma opção de “resgate”.
6 – Gerando o grub.cfg
Após concluir a configuração desejada, é necessário gerar o arquivo /boot/grub/grub.cfg. Isso é feito com o seguinte comando.
sudo grub-mkconfig -o /boot/grub/grub.cfg
Portanto o grub-mkconfig pega os arquivos de configuração localizados em /etc/grub.d em sequência para construir o arquivo grub.cfg. Assim também usa o conteúdo do arquivo /etc/default/grub para modificar a saída para obter a configuração final desejada. O comando grub-mkconfig localiza todos os kernels instalados e cria uma entrada para cada um na seção 10_Linux do arquivo grub.cfg. Além disso é criado uma entrada de “resgate” para fornecer um método de recuperação de problemas significativos que impedem o Linux de inicializar.
Em conclusão, o GRUB é o primeiro passo após o BIOS na sequência de eventos que inicializam um sistema Linux. Esperamos que essa introdução ao funcionamento do GRUB tenha ajudado a entender melhor os conceitos e o seu funcionamento. Entender como configurar o GRUB é importante para recuperar ou contornar vários tipos de problemas na hora do boot.
Até a próxima!