Configurando o grub

Com exceção do Slackware, que continua a utilizar o Lilo devido à simplicidade, praticamente todas as outras distribuições migraram para o Grub ao longo da década passada. O Grub é um gerenciador de boot bem mais moderno, que oferece mais opções e remedia muitas das limitações do antigo Lilo.

Conforme os PCs foram avançando, entretanto, mesmo o Grub começou a parecer antiquado em algumas situações, levando surgimento do Grub 2, um sucessor modular que se tornou o gerenciador default no Ubuntu a partir do 9.10 e aos poucos vem sendo adotado também em outras distribuições. O gerenciador de boot é um componente tão importante do sistema que vale a pena estudar um pouco sobre ele para ser capaz de solucionar problemas. Já vimos detalhes sobre a configuração do Lilo e do Grub, vamos agora conhecer um pouco sobre o Grub 2.

Com o lançamento do Grub 2, o Grub original passou a ser chamado de “Grub Legacy”. Ele continua sendo mantido, mas vem recebendo basicamente correções de bugs. O desenvolvimento de novas funções passou a ser concentrado no Grub 2. Você pode checar qual versão está sendo usada usando o comando “grub-install -v”:

$ grub-install -v

grub-install (GRUB) 1.99-18ubuntu1

Neste caso estou rodando a versão 1.99-18, que é a versão usada por default no Ubuntu 12.04. As versões do Grub original vão até a 0.97, enquanto o Grub 2 começa a partir da 1.98.

O Grub 2 trás vários novos recursos, incluindo a possibilidade de carregar módulos para acesso a diferentes sistemas de arquivos, possibilidade de personalização através de shell-scripts, bem como o uso de temas visuais e assim por diante. Ele é capaz até mesmo de inicializar imagens ISO de distribuições Live-CD ou outros sistemas diretamente a partir do HD, sem que você precise gravá-las num CD ou pendrive. Como sempre, ms recursos significam uma configuração mais complexa, o que faz com que, embora bem organizado, os recursos do Grub 2 acabem sendo mais difíceis de dominar.

No Grub 2, o arquivo “/boot/grub/menu.lst” de lugar ao “/boot/grub/grub.cfg”. Entretanto, este é um arquivo gerado como produto da execução de diversos scripts situados na pasta “/etc/grub.d/” que são executados ao instalar ou atualizar o Grub 2 e, diferente do menu.lst, nunca deve ser editado manualmente. O arquivo editável de configuração passou a ser o “/etc/default/grub/“, onde vão as preferências e configurações pessoais, que são salvas no /boot/grub/grub.cfg quando as alterações são aplicadas. Tudo isso é lido pelo sistema ao executar o comando “sudo update-grub”, que se encarrega de executar todos estes scripts e configurações, gerando o arquivo /boot/grub/grub.cfg e instalando os outros componentes do grub.

Para entender melhor como funciona este processo de geração, o primeiro passo é dar uma olhada no conteúdo da pasta /etc/grub.d:

Como pode ver, esta pasta é populada por vários scripts, numerados sequencialmente. Sempre que o update-grub é executado, estes scripts são executados na ordem em que são numerados, fazendo com que um novo arquivo /boot/grub/grub.cfg seja gerado e a configuração atualizada. Este é mais um motivo para que você não perca tempo tentando editar este arquivo diretamente, já que além de muito complexo, qualquer configuração feita nele será perdida ao atualizar a configuração do Grub. A ideia é exatamente que a configuração seja gerada e atualizada automaticamente, aplicando as suas configurações, definidas no /etc/default/grub.

O primeiro script, o “00_header” lê as variáveis de ambiente e ajusta vários parâmetros e configurações, preparando o terreno para a execução dos outros scripts. O seguinte é o “05_debian_theme”, que aplica o tema visual, carregando a imagem de background, definindo as cores do menu e assim por diante.

Os demais scripts são dedicados à detecção e inserção dos diferentes sistemas operacionais, gerando a lista que permite escolher qual usar durante o boot. O “10_linux” adiciona as entradas do sistema principal, incluindo as diferentes versões do kernel que estejam instaladas. O “10_linux_xen” faz o mesmo com versões do kernel com suporte ao Xen (caso alguma esteja instalada). O “20_memtest86+” adiciona a entrada do Memtest, enquanto o “30_os-prober” detecta e adiciona entradas para outros sistemas operacionais instalados, incluindo o Windows. Os dois últimos, “40_custom” e “41_custom” são dedicados à inserção de scripts personalizados com outras funções que você queira executar.

A ordem com que as diferentes entradas aparecem na tela de boot é definida pela ordem com a qual estes scripts são executados. Ao rodar o “sudo update-grub ” neste PC, por exemplo, obtenho:

$ sudo update-grub

    Generating grub.cfg …
    Found background image: /usr/share/images/desktop-base/desktop-grub.png

    Found linux image: /boot/vmlinuz-3.2.0-21-generic
    Found initrd image: /boot/initrd.img-3.2.0-21-generic
    Found linux image: /boot/vmlinuz-3.2.0-19-generic
    Found initrd image: /boot/initrd.img-3.2.0-19-generic
    Found memtest86+ image: /boot/memtest86+.bin
    Found Windows 7 (loader) on /dev/sda2
    done

Veja que ele inclui um total de 4 entradas: duas para o sistema principal (incluindo uma versão antiga do kernel que ainda está instalada), uma para o Memtest e outra para uma cópia do Windows 7 esquecida em uma partição no início do HD.

Se retiro a permissão de execução do script do Memtest (chmod -x /etc/grub.d/20_memtest86+), fazendo com que ele deixe de ser executado, as outras entradas continuarão sendo adicionadas, mas o Memtest será deixado de fora:

$ sudo chmod -x /etc/grub.d/20_memtest86+
$ sudo update-grub

    Generating grub.cfg …
    Found background image: /usr/share/images/desktop-base/desktop-grub.png

    Found linux image: /boot/vmlinuz-3.2.0-21-generic
    Found initrd image: /boot/initrd.img-3.2.0-21-generic
    Found linux image: /boot/vmlinuz-3.2.0-19-generic
    Found initrd image: /boot/initrd.img-3.2.0-19-generic
    Found Windows 7 (loader) on /dev/sda2
    done

Caso renomeie o script “30_os-prober”, para “09_os-prober” (fazendo com que ele seja executado antes do “10_linux” que adiciona as entradas referentes ao Linux) faço com que o Windows apareça no topo da lista:

$ sudo mv 30_os-prober 09_os-prober
$ sudo update-grub

    [sudo] password for gdh:
    Generating grub.cfg …
    Found background image: /usr/share/images/desktop-base/desktop-grub.png

    Found Windows 7 (loader) on /dev/sda2
    Found linux image: /boot/vmlinuz-3.2.0-21-generic
    Found initrd image: /boot/initrd.img-3.2.0-21-generic
    Found linux image: /boot/vmlinuz-3.2.0-19-generic
    Found initrd image: /boot/initrd.img-3.2.0-19-generic
    done

Da mesma forma, é possível editar o conteúdo dos scripts ou adicionar outros que executem funções adicionais. Esta acaba sendo a principal vantagem do Grub 2 e o grande motivo da mudança.

Como pode imaginar, a melhor forma de adicionar entradas personalizadas no menu do grub, sem depender da detecção automática é adicionar as instruções desejadas no final do arquivo “/etc/grub.d/40_custom”, o que faz com que a sua entrada personalizada apareça no final da lista.

Basta adicionar as entradas da forma como quer que elas sejam incluídas no arquivo, após a linha “exec tail -n +3 $0” dentro do arquivo. Para adicionar uma entrada que carrega o Windows em chainload (como a que vimos no capítulo sobre o Mandriva), por exemplo, você adicionaria as seguintes linhas ao arquivo “40_custom”:

menuentry "Windows 7 em chainload" {
      set root=(hd0,1)
      chainloader +1
}

A linha “set root=(hd0,1) ” especifica qual é a partição. Uma diferença entre o Grub 2 e o Grub antigo é que no Grub 2 as partições são numeradas a partir do 1 (e não mais a partir do zero), de forma que “set root=(hd0,1) ” especifica que o Windows está instalado na primeira partição do HD.

Para que seja adicionada uma entrada para o boot de uma imagem ISO localizada em uma partição do HD (que é uma das possibilidades interessantes do novo grub), você adicionaria as linhas a seguir no “40_custom”

menuentry "ISO do Ubuntu" {
      loopback loop (hd0,1)/home/gdh/ubuntu.iso
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=home/gdh/ubuntu.iso noprompt noeject quiet splash
      initrd (loop)/casper/initrd.lz
}

Veja que esta entrada já é mais complicada, especificando a partição do HD onde está o ISO, como em “(hd0,1)”, que se refere à primeira partição do primeiro HD e o caminho para o arquivo dentro da partição (/home/gdh/ubuntu.iso). A linha “linux…” inclui opções diversas para que o sistema inicialize através do CD; veja que ela inclui novamente a localização do arquivo dentro da partição.

Incluindo as duas entradas, seu arquivo “/etc/grub.d/40_custom” ficaria como o a seguir e depois de executar o “sudo update-grub” você veria as duas novas entradas no final da lista.

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.

 

menuentry "Windows 7 em chainload" {
      set root=(hd0,1)
      chainloader +1
}

menuentry "ISO do Ubuntu" {
      loopback loop (hd0,1)/home/gdh/ubuntu.iso
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=home/gdh/ubuntu.iso noprompt noeject quiet splash
      initrd (loop)/casper/initrd.lz
}

É importante enfatizar que o boot de imagens ISO só funciona em distribuições Linux que suportem a inicialização a partir do ISO (o que inclui a grande maioria dos live-CDs atuais). Devido a esta dependência de suporte por parte do hóspede, esta função não funciona para dar boot em ISOs com outros sistemas operacionais, incluindo imagens de instalação do Windows.

Em seguida, temos o arquivo “/etc/default/grub” que concentra muitas das opções que no Grub legacy estão concentradas no menu.lst. A primeira delas é a linha “GRUB_DEFAULT“, que permite definir qual será o sistema inicializado por padrão. Por default a linha é:

GRUB_DEFAULT=0

… o que faz com que o primeiro sistema operacional da lista seja inicializado por default. Se você quer que o sistema da quarta entrada da lista passe a ser o default, você trocaria o valor para “3” (lembre-se, os sistemas são contados a partir do zero, o que faz com que a quarta linha seja “3” e assim por diante:

GRUB_DEFAULT=3

Você pode também alterar esta configuração diretamente a qualquer momento, sem precisar editar o arquivo e rodar o update-grub usando o comando “grub-set-default”, como em:

$ sudo grub-set-default 3

A linha “GRUB_TIMEOUT=10” especifica o tempo de espera antes de inicializar o sistema default (em segundos). Por default são 10 segundos, mas você pode aumentar ou reduzir o valor como desejado. O valor “0” faz com que o boot ocorra imediatamente, sem a exibição do menu (nesse caso é necessário manter a tecla Shift pressionada das vezes que você queira que o menu seja exibido), enquanto o valor “-1” faz com que ele espere indefinidamente.

É possível também fazer com que o grub espere um tempo especificado porém sem exibir o menu de seleção, o que é útil em casos em que o micro for usado por outras pessoas e você não quer que elas vejam os outros sistemas instalados. Nesse caso o grub espera o tempo especificado, em segundos, mas você vê a tela de seleção apenas caso pressione a tecla Shift dentro do tempo especificado, como em:

GRUB_HIDDEN_TIMEOUT=5

Em seguida temos a opção ” GRUB_CMDLINE_LINUX_DEFAULT“, que permite inserir parâmetros a serem passados para o kernel, como o noapic, noacpi, nolapic, etc., como em:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Ela é usada em conjunto com a opção “GRUB_CMDLINE_LINUX”. Estas duas opções existem por que o grub adiciona duas entradas para cada versão do kernel encontrada, uma para boot normal e outra para o modo de recuperação. A opção “GRUB_CMDLINE_LINUX_DEFAULT” inclui parâmetros que são passados ao kernel apenas durante um boot normal, enquanto a “GRUB_CMDLINE_LINUX” inclui opções que são passadas em ambos os casos. Como pode ser, as duas opções existem exatamente para permitir que as opções do modo de recuperação sejam diferentes.

Se você nunca usa as entradas de recuperação e quer desativá-las para gerar uma lista com menos entradas e consequentemente mais organizadas, adicione (ou descomente) a linha “GRUB_DISABLE_RECOVERY“, configurando-a com o valor true:

GRUB_DISABLE_RECOVERY="true"

Se você quiser desabilitar o script 30_os-prober, desabilitando a detecção de outros sistemas operacionais instalados, pode adicionar a linha

"GRUB_DISABLE_OS_PROBER=true".

Outra configuração que pode ser útil em algumas situações é a “GRUB_INIT_TUNE”, que toca um beep no início da exibição do menu do grub. Ela é útil no caso de deficientes visuais, que precisam de uma notificação audível para poderem escolher o sistema, bem como para desatentos:

GRUB_INIT_TUNE="480 440 1"

Esta opção pode ser usada para incluir músicas inteiras (experimente por exemplo: GRUB_INIT_TUNE=”480 900 2 1000 2 800 2 400 2 600 3″), mas tenha em mente que a soneta vai atrasar a exibição do menu.

Lembre-se de sempre executar o comando “sudo update-grub” ao fazer alterações, do contrário elas não entrarão em vigor. Caso ele retorne algum erro, verifique a configuração e tente solucionar o problema antes de reiniciar o micro, caso contrário o grub pode ficar em um estado não-funcional, dificultando ou impossibilitando o boot.

Concluindo, caso o grub seja danificado e o sistema deixe de inicializar, você pode recuperá-lo seguindo as instruções a seguir:

a) Dê boot usando o live-CD do Ubuntu, executando um boot normal do sistema

b) Rode o comando “sudo fdisk -l” para verificar quais são as partições do HD. Verifique qual é a partição do sistema.

c) Monte a partição em uma pasta. Se a partição é a “/dev/sda1”, por exemplo, os comandos seriam: sudo mkdir /mnt/sda1; sudo mount /dev/sda1 /mnt/sda1

d) Use o gerenciador de arquivos para checar o conteúdo da pasta e ver se esta é mesma a partição de instalação do sistema.

e) Reinstale o grub, especificando o diretório onde a partição do sistema foi instalada. Como estamos instalando o grub no gerenciador de boot, especificamos o device do HD (e não da partição). Veja que o comando usa a opção “–root-directory”, que especifica a pasta onde a partição foi montada: sudo grub-install –root-directory=/mnt/sda1 /dev/sda

f) Verifique a saída do comando. Se houver algum erro, verifique os arquivos de configuração para localizar o problema (em geral será alguma entrada personalizada adicionada por você). Verifique se os arquivos não foram perdidos ou corrompidos (você pode restaurá-los a partir de outra máquina, ou do próprio CD caso esteja dando boot na mesma versão do sistema que está instalada).

f) Desmonte a partição e reinicie o micro: sudo umount /mnt/sda1; reboot

Em casos em que você precise restaurar o boot de uma instalação do Windows no HD, que deixou se ser inicializável depois de remover uma distribuição Linux instalada no HD, você pode usar o Lilo para regravar o MBR, removendo o grub e permitindo que o Windows volte a inicializar. Depois de dar boot com o Live-CD do Ubuntu, instale o pacote via apt-get e use o comando “lilo -M”, especificando o device do HD e o parâmetro “MBR” para que ele seja gravado:

$ sudo apt-get update; sudo apt-get install lilo
$ sudo lilo -M /dev/sda mbr

 

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X