Introdução
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.
Entendendo o novo sistema de configuração
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
}
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
}
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
}
Mais configurações
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
GRUB_DEFAULT=3
$ sudo grub-set-default 3
É 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
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
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"
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"
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.
Dicas de recuperação e solução de problemas
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
Nenhum comentário:
Postar um comentário