segunda-feira, 6 de julho de 2009

ENTENDENDO A CONFIGURAÇÃO DO GRUB NO UBUNTU

Se você é das antigas, deve se lembrar da época em que o lilo era o gerenciador de boot mais usado no Linux. Ele oferece uma configuração relativamente simples e um arquivo de configuração bem organizado, mas tem suas limitações, o que levou ao crescimento do grub, que é usado por padrão no Ubuntu. Mandriva, OpenSUSE, Fedora e quase todas as outras principais distribuições, com exceção do Slackware.

A configuração do grub é feita através do arquivo "/boot/grub/menu.lst", encontrado em todas as distribuições que o utilizam como gerenciador.

O diretório "/etc" armazena quase todos os arquivos de configuração. O menu.lst é uma das exceções e isso tem um bom motivo. O grub lê este arquivo de configuração no início de cada boot, antes de mostrar o splash e o menu de opções, de forma que é preciso ter certeza de que ele estará sempre disponível.

Como muitos administradores reservam uma partição separada para o diretório /boot, ou para o /etc (o que seria um problema, uma vez que partições separadas são montadas bem depois que o grub já fez trabalho) os desenvolvedores do grub optaram por colocar o arquivo de configuração diretamente na pasta /boot, junto com o kernel e outros arquivos usados no início do boot, afastando qualquer possibilidade de ele não estar disponível por ter sido armazenado em uma partição separada.

Uma vantagem dessa abordagem é que você não precisa reinstalar o gerenciador de boot depois de fazer alterações na configuração, como era necessário no caso do lilo.

Assim como em utras distribuições, o instalador do Ubuntu se encarrega de gerar o arquivo automaticamente, incluindo entradas para outros sistemas operacionais instalados. O arquivo é muito grande, devido aos comentários (#), mas ao removê-los sobra uma configuração relativamente inteligível, como nesse exemplo:

default 0
timeout 10
title Ubuntu 8.10, kernel 2.6.27-7-generic
uuid 77e43f2b-063f-4e4f-8708-be403c49a982
kernel /boot/vmlinuz-2.6.27-7-generic root=UUID=77e43f2b-063f-4e4f-8708-be403c49a982 ro locale=pt_BR quiet splash
initrd /boot/initrd.img-2.6.27-7-generic
quiet

title Ubuntu 8.10, kernel 2.6.27-7-generic (recovery mode)
uuid 77e43f2b-063f-4e4f-8708-be403c49a982
kernel /boot/vmlinuz-2.6.27-7-generic root=UUID=77e43f2b-063f-4e4f-8708-be403c49a982 ro locale=pt_BR single
initrd /boot/initrd.img-2.6.27-7-generic

title Ubuntu 8.10, memtest86+
uuid 77e43f2b-063f-4e4f-8708-be403c49a982
kernel /boot/memtest86+.bin
quiet

title Other operating systems:
root

title Windows Vista/Longhorn (loader)
root (hd0,0)
savedefault
makeactive
chainloader +1

Nesse exemplo, temos 4 entradas: Ubuntu, Ubuntu recovery, memtest86+ e Windows. Como pode imaginar, a primeira se refere ao boot normal do Ubuntu, enquanto a segunda diz respeito ao modo de recuperação, onde o sistema aber apenas um prompt de comando, sem carregar nenhum outro serviços. A grande diferença entre as duas entradas reside no parâmetro "single", que altera o comportamento do sistema, disparando as mudanças que ativam o modo de recuperação.

Temos em seguida a entrada do memtest86+ (o teste de memória) e a entrada do Windows, que usa um modo chainload, onde o grub carrega o gerenciador de boot do Windows e deixa que ele inicialize o sistema. Ela é adicionada automaticamente, sempre que o instalador detecta uma instalação do Windows no HD.

Dentro da nomenclatura do grub, as entradas são numeradas a partir do zero, de forma que o Ubuntu é o 0 e o Windows é o 3.

A linha "default 0" no início do arquivo indica qual sistema ficará pré-selecionado na tela de boot, ou seja, o Ubuntu. Caso quisesse que o Windows passasse a ser o default, mudaria a opção para "default 3". Se você tiver outros sistemas instalados, basta ver em qual ordem o sistema aparece na lista e indicar o número correspondente.

A linha "timeout 9" indica o tempo de espera antes de carregar o sistema default, em segundos. Uma boa maneira de acelerar o boot se você usa sempre o mesmo sistema é alterar para 1, o que faz com que o carregamento comece quase instantaneamente e você não perca a chance de escolher outra entrada quando necessário (basta ser rápido :).

Por default, o Ubuntu exibe apenas uma barra de progresso durante o boot, escondendo todas as informações sobre o boot, uma abordagem que tem suas desvantagens, já que torna o processo de boot uma caixa preta à qual você não tem acesso. Se o boot parar em algum ponto, devido à qualquer erro inesperado, você fica sem saber o que aconteceu.

Você pode ter de volta as mensagens de boot de maneira muito simples, removendo o parâmetro "quiet" da linha "kernel", na entrada referente ao sistema, como em:


title Ubuntu 8.10, kernel 2.6.27-7-generic
uuid 77e43f2b-063f-4e4f-8708-be403c49a982
kernel /boot/vmlinuz-2.6.27-7-generic root=UUID=77e43f2b-063f-4e4f-8708-be403c49a982 ro locale=pt_BR splash
initrd /boot/initrd.img-2.6.27-7-generic

Ela é justamente a opção que faz o sistema fica mudo durante o boot. Ao retirá-la, passam a ser exibidas mensagens de boot resumidas (no estilo Red Hat), mostrando os passos que estão sendo executados:

Se você quiser ir adiante, pode remover também o parâmetro "splash", que é o responsável pelo fundo gráfico. Sem ele, o sistema passa a botar em modo texto, exibindo todas as mensagens, assim como no Slackware.

Em outras distribuições, você encontra também linhas como:

color cyan/blue white/blue
gfxmenu (hd0,0)/boot/message

A primeira permite personalizar as cores da tela de boot, enquanto a segunda exibe um fundo gráfico (o arquivo "/boot/message", que é comprimido em um formato específico). Entretanto, o Ubuntu (pelo menos até o 8.10) não usa estas opções cosméticas, exibindo um menu em texto, branco sobre preto.

Uma das dúvidas mais frequentes sobre a configuração do grub é a nomenclatura usada para designar os HDs e partições. No Linux os HDs e partições são acessados através de dispositivos especiais, localizados dentro do diretório "/dev". Um HD SATA é visto pelo sistema como "/dev/sda" e a primeira partição dentro dele é vista como "/dev/sda1".

Entretanto, isso não vale para o grub, onde os desenvolvedores decidiram adotar uma nomenclatura própria, na qual os HDs e partições são nomeados a partir do zero. Com isso, o "/dev/sda1" é referenciado na configuração do grub como "(hd0,0)" (primeiro HD, primeira partição). O "(hd0,2)" diz respeito à terceira partição do primeiro HD (ou seja o /dev/hda3) e assim por diante

O grande problema é que os mesmos devices são usados por diversos tipos de dispositivos de armazenamento, como por exemplo pendrives e cartões de memória. Se você plugar dois pendrives, em sequência, o primeiro será visto pelo sistema como "/dev/sdb" e o segundo como "/dev/sdc". Invertendo a ordem em que os dois são plugados, você inverte também a ordem dos devices que são atribuídos a eles.

O problema é que de acordo com a configuração do setup e outras variáveis, essa mesma variação pode ocorrer em máquinas com vários HDs, fazendo com que o segundo HD assuma o lugar do primeiro e fazendo com que o sistema deixe de inicializar.

Para evitar isso os desenvolvedores do Ubuntu (e diversas outras distribuições atuais) adotaram o uso de UUIDs para identificação das partições, tanto na configuração do fstab, quanto na configuração do grub. O UUID é um identificador único, que permite ao sistema identificar a partição, mesmo que o device seja alterado.

É por isso que as entradas referentes ao Ubuntu dentro do arquivo não especificam a partição onde o sistema está instalado, mas o UUID (que é inserido automaticamente pelo instalador), como em:


title Ubuntu 8.10, kernel 2.6.27-7-generic
uuid 77e43f2b-063f-4e4f-8708-be403c49a982
kernel /boot/vmlinuz-2.6.27-7-generic root=UUID=77e43f2b-063f-4e4f-8708-be403c49a982 ro locale=pt_BR quiet splash
initrd /boot/initrd.img-2.6.27-7-generic
quiet

A linha "title" contém apenas o nome do sistema, da forma como ele irá aparecer na tela de boot. Não é preciso que o nome indique corretamente o sistema, você pode usar apelidos, o importante é apenas que um sistema receba um apelido diferente do outro.

Em seguida temos a linha, "kernel", que indica o arquivo com o kernel, que será carregado no início do boot. O Kernel vai sempre dentro da pasta "/boot" (muitas vezes é colocado um atalho para ele no diretório raiz, mas isso não é regra) e o arquivo sempre se chama "vmlinuz", seguido da versão, como "vmlinuz-2.6.27-7-generic". Além de indicar a localização do arquivo, você pode incluir opções que serão passadas para ele no início do boot, como é o caso da "locate=pt_BR" (que especifica a linguagem) e do "quiet slash" que comentei há pouco.

Em caso de necessidade, seria nela que você incluiria opções para solução de problemas, como o "acpi=off", "irqpoll", "noapic", "all-generic-ide" e assim por diante.

Finalmente, temos a linha "initrd", que é opcional, permitindo indicar a localização de um arquivo initrd, que será carregado junto com o Kernel. O initrd nem sempre é usado. Quando necessário, ele é gerado durante a instalação, incluindo módulos de que o sistema precisará no início do boot.

Em seguida temos a seção referente ao Windows, que é na verdade a mais simples:


title Windows Vista/Longhorn (loader)
root (hd0,0)
savedefault
makeactive
chainloader +1

O Windows é um caso especial, pois ele não é carregado diretamente pelo grub. Em vez disso ele é carregado em um modo chamado de "chainload", onde o grub simplesmente carrega o gerenciador de boot do Windows (que é instalado dentro da partição) e deixa que ele se encarregue de carregar o sistema. Isso é indicado pela linha "chainloader +1".

Isto simplifica as coisas, pois você precisa apenas indicar um nome ou apelido na linha "title" e indicar a partição onde ele está instalado na linha "root". No nosso exemplo, o Windows está instalado na primeira partição do HD, por isso o "(hd0,0)". A opção "makeactive" marca a partição do Windows como ativa, uma configuração que é necessária ao inicializar o Windows 95/98/ME, que ainda utilizam o DOS na fase inicial do boot.

Em casos em que você tem uma instalação do Windows no segundo HD ("hd1,0" no grub), como em situações onde você compra outro HD para instalar Linux e instala o HD com o Windows como secundário, é necessário adicionar duas linhas na seção do grub referente ao Windows. Elas fazem com que a posição lógica dos dois HD seja trocada, fazendo com que o Windows pense que está inicializando a partir do primeiro. Sem isso, você tem um erro de "partição inválida" durante o boot e o Windows não é carregado.

Ao adicionar as duas linhas, a seção referente ao Windows ficaria:


title Windows
root (hd1,0)
savedefault
makeactive
chainloader +1
map (hd1) (hd0)
map (hd0) (hd1)

Caso você tivesse outras distribuições Linux instaladas no HD, veria também seções adicionais dedicadas a elas, como em:

title Linux (on /dev/sda3)
root (hd0,2)
kernel /boot/vmlinuz root=/dev/sda3 ro vga=791
savedefault
boot

Nesse exemplo, a segunda distribuição está instalada na partições "/dev/sda3" que, na nomenclatura do grub, equivale ao "(hd0,2)". O importante é indicar corretamente o arquivo com o Kernel, dentro da partição e o initrd (caso exista). O "root=/dev/sda3 ro vga=791" são opção destinadas ao kernel, que especificam a partição onde o sistema está instalado e a resolução de tela para o framebuffer que será usada durante o boot.

Você poderia duplicar estas quatro linhas para incluir outras distribuições. Bastaria alterar a partição dentro da linha "root" e indicar corretamente o arquivo do Kernel e o initrd que serão usados.

Continuando, a configuração feita no arquivo "/boot/grub/menu.lst" é lida pelo grub a cada boot, por isso você não precisa se preocupar em regravar o grub a cada alteração no arquivo, como no caso do lilo. Em geral, você só precisa regravar o grub em caso de acidentes, como quando ele é subscrito acidentalmente, ao reinstalar o Windows ou instalar outra distribuição no mesmo HD.

No caso das distribuições Linux, quase sempre você tem a opção de instalar gravando o gerenciador de boot na partição, o que permite reinstalar sem subscrever o grub "titular". Aqui, por exemplo, temos um screenshot do instalador do Alternate CD do Ubuntu:

O problema é o Windows, que sempre grava o gerenciador de boot na MBR, subscrevendo o grub e eliminando assim o acesso às distribuições Linux instaladas no HD.

Nestes casos, você pode regravar o grub dando boot com o próprio live-CD do Ubuntu. Dê boot pelo CD e abra um terminal. Defina a senha de root usando o comando "sudo passwd" e logue-se como root usando o "su". A partir daí, use o comando "grub" para entrar no prompt do grub, onde usaremos os comandos para regravar o gerenciador de boot:

# grub

Dentro do prompt, precisamos rodar dois comandos, especificando a partição onde a distribuição Linux principal (a antiga "dona" do MBR) está instalada e também o endereço da partição onde o grub será instalado (usando a nomenclatura do grub).

Comece rodando o comando "root", que especifica a partição onde o sistema está instalado. No exemplo, o sistema está instalado no "(hd0,2)", de forma que o comando fica:

root (hd0,2)

Falta agora o comando "setup", que especifica onde o grub será gravado. Neste caso, estou gravando o grub na MBR do primeiro HD:

setup (hd0)

Terminando, você pode sair o prompt do grub usando o "quit" e reiniciar o micro. No próximo boot você terá de volta o prompt do grub e poderá (se for o caso) recuperar o acesso ao Windows editando o "/boot/grub/menu.lst" e adicionando uma seção referente a ele, seguindo o exemplo que mostrei anteriormente.

Quem é Almir JR