Pesquisa de site

LFCS: Como configurar e solucionar problemas do Grand Unified Bootloader (GRUB) - Parte 13


Devido às recentes mudanças nos objetivos do exame de certificação LFCS em vigor a partir de 2 de fevereiro de 2016, estamos adicionando os tópicos necessários à série LFCS publicada aqui. Para se preparar para este exame, é altamente recomendável que você siga também a série LFCE.

Neste artigo apresentaremos o GRUB e explicaremos por que um gerenciador de boot é necessário e como ele adiciona versatilidade ao sistema.

O processo de inicialização do Linux, desde o momento em que você pressiona o botão liga/desliga do computador até obter um sistema totalmente funcional, segue esta sequência de alto nível:

  1. 1. Um processo conhecido como POST (Power-On Self Test) realiza uma verificação geral dos componentes de hardware do seu computador.
  2. 2. Quando o POST é concluído, ele passa o controle para o carregador de boot, que por sua vez carrega o kernel do Linux na memória (junto com o initramfs ) e o executa. O carregador de boot mais usado no Linux é o GRand Unified Boot loader, ou GRUB, para abreviar.
  3. 3. O kernel verifica e acessa o hardware e então executa o processo inicial (conhecido principalmente pelo nome genérico “init”) que por sua vez completa a inicialização do sistema iniciando Serviços.

Na Parte 7 desta série (“SysVinit, Upstart e Systemd”), apresentamos os sistemas e ferramentas de gerenciamento de serviços usados pelas distribuições Linux modernas. Você pode revisar esse artigo antes de prosseguir.

Apresentando o carregador de inicialização GRUB

Duas versões principais do GRUB (v1 às vezes chamada de GRUB Legacy e v2) podem ser encontradas em sistemas modernos, embora a maioria distribuições usam v2 por padrão em suas versões mais recentes. Somente o Red Hat Enterprise Linux 6 e seus derivados ainda usam a v1 hoje.

Assim, focaremos principalmente nos recursos da v2 neste guia.

Independentemente da versão do GRUB, um carregador de boot permite ao usuário:

  1. 1). modificar a maneira como o sistema se comporta, especificando diferentes kernels para usar,
  2. 2). escolha entre sistemas operacionais alternativos para inicializar e
  3. 3). adicione ou edite sub-rotinas de configuração para alterar opções de inicialização, entre outras coisas.

Hoje, o GRUB é mantido pelo projeto GNU e está bem documentado em seu website. Você é encorajado a usar a documentação oficial do GNU ao ler este guia.

Quando o sistema inicializa, você verá a seguinte tela GRUB no console principal. Inicialmente, você será solicitado a escolher entre kernels alternativos (por padrão, o sistema inicializará usando o kernel mais recente) e poderá inserir uma linha de comando GRUB (com c) ou edite as opções de inicialização (pressionando a tecla e).

Uma das razões pelas quais você consideraria inicializar com um kernel mais antigo é um dispositivo de hardware que costumava funcionar corretamente e começou a “agir” após uma atualização (consulte este link no AskUbuntu fóruns, por exemplo).

A configuração do GRUB v2 é lida na inicialização em /boot/grub/grub.cfg ou /boot/grub2/grub.cfg, enquanto /boot/grub/grub.conf ou /boot/grub/menu.lst são usados em v1. Esses arquivos NÃO devem ser editados manualmente, mas são modificados com base no conteúdo de /etc/default/grub e nos arquivos encontrados em /etc/grub.d.

Em um CentOS 7, aqui está o arquivo de configuração que é criado quando o sistema é instalado pela primeira vez:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Além da documentação online, você também pode encontrar o manual do GNU GRUB usando as informações a seguir:

info grub

Se você estiver interessado especificamente nas opções disponíveis para /etc/default/grub, você pode invocar a seção de configuração diretamente:

info -f grub -n 'Simple configuration'

Usando o comando acima você descobrirá que GRUB_TIMEOUT define o tempo entre o momento em que a tela inicial aparece e a inicialização automática do sistema começa, a menos que seja interrompida pelo usuário. Quando esta variável é definida como -1, a inicialização não será iniciada até que o usuário faça uma seleção.

Quando vários sistemas operacionais ou kernels são instalados na mesma máquina, GRUB_DEFAULT requer um valor inteiro que indica qual sistema operacional ou entrada de kernel na tela inicial do GRUB deve ser selecionado para inicializar por padrão. A lista de entradas pode ser visualizada não apenas na tela inicial mostrada acima, mas também usando o seguinte comando:

No CentOS e no openSUSE:

awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg

No Ubuntu:

awk -F\' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg

No exemplo mostrado na imagem abaixo, se quisermos inicializar com a versão do kernel 3.10.0-123.el7.x86_64 (4ª entrada), precisamos definir GRUB_DEFAULT até 3 (as entradas são numeradas internamente começando com zero) da seguinte forma:

GRUB_DEFAULT=3

Uma variável de configuração final do GRUB que é de interesse especial é GRUB_CMDLINE_LINUX, que é usada para passar opções para o kernel. As opções que podem ser passadas através do GRUB para o kernel estão bem documentadas no arquivo Kernel Parameters e no man 7 bootparam.

As opções atuais em meu servidor CentOS 7 são:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"

Por que você deseja modificar os parâmetros padrão do kernel ou passar opções extras? Em termos simples, pode haver momentos em que você precise informar ao kernel determinados parâmetros de hardware que ele pode não ser capaz de determinar por conta própria ou substituir os valores que ele detectaria.

Isso aconteceu comigo há pouco tempo, quando experimentei o Vector Linux, um derivado do Slackware, em meu laptop de 10 anos. Após a instalação ele não detectou as configurações corretas para minha placa de vídeo então tive que modificar as opções do kernel passadas pelo GRUB para fazê-la funcionar.

Outro exemplo é quando você precisa colocar o sistema no modo de usuário único para realizar tarefas de manutenção. Você pode fazer isso anexando a palavra single a GRUB_CMDLINE_LINUX e reiniciando:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"

Após editar /etc/defalt/grub, você precisará executar update-grub (Ubuntu) ou grub2-mkconfig -o /boot/grub2/grub. cfg (CentOS e openSUSE) posteriormente para atualizar grub.cfg (caso contrário, as alterações serão perdidas na inicialização).

Este comando processará os arquivos de configuração de inicialização mencionados anteriormente para atualizar o grub.cfg. Este método garante que as alterações sejam permanentes, enquanto as opções passadas pelo GRUB no momento da inicialização durarão apenas durante a sessão atual.

Corrigindo problemas do Linux GRUB

Se você instalar um segundo sistema operacional ou se o arquivo de configuração do GRUB for corrompido devido a erro humano, existem maneiras de recuperar o sistema e inicializar novamente.

Na tela inicial, pressione c para obter uma linha de comando do GRUB (lembre-se que você também pode pressionar e para editar as opções de inicialização padrão) e use a ajuda para trazer as disponíveis comandos no prompt do GRUB:

Vamos nos concentrar em ls, que listará os dispositivos e sistemas de arquivos instalados, e examinaremos o que ele encontra. Na imagem abaixo podemos ver que existem 4 discos rígidos (hd0 até hd3).

Apenas hd0 parece ter sido particionado (como evidenciado por msdos1 e msdos2, onde 1 e 2 são os números das partições e msdos é o esquema de particionamento).

Vamos agora examinar a primeira partição em hd0 (msdos1) para ver se conseguimos encontrar o GRUB lá. Esta abordagem nos permitirá inicializar o Linux e usar outras ferramentas de alto nível para reparar o arquivo de configuração ou reinstalar o GRUB completamente, se necessário:

ls (hd0,msdos1)/

Como podemos ver na área destacada, encontramos o diretório grub2 nesta partição:

Assim que tivermos certeza de que o GRUB reside em (hd0,msdos1), vamos dizer ao GRUB onde encontrar seu arquivo de configuração e então instruí-lo a tentar abrir seu menu:

set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal

Em seguida, no menu GRUB, escolha uma entrada e pressione Enter para inicializar usando-a. Depois que o sistema for inicializado, você pode emitir o comando grub2-install /dev/sdX (altere sdX com o dispositivo no qual deseja instalar o GRUB). As informações de inicialização serão atualizadas e todos os arquivos relacionados serão restaurados.

grub2-install /dev/sdX

Outros cenários mais complexos estão documentados, juntamente com suas correções sugeridas, no guia de solução de problemas do Ubuntu GRUB2. Os conceitos explicados ali também são válidos para outras distribuições.

Resumo

Neste artigo, apresentamos o GRUB, indicamos onde você pode encontrar documentação online e offline e explicamos como abordar um cenário em que um sistema parou de inicializar corretamente devido a um problema relacionado ao bootloader.

Felizmente, GRUB é uma das ferramentas mais bem documentadas e você pode facilmente encontrar ajuda nos documentos instalados ou online usando os recursos que compartilhamos neste artigo.

Você tem perguntas ou comentários? Não hesite em nos informar usando o formulário de comentários abaixo. Estamos ansiosos para ouvir de você!