29.3. Inicializando com o GRUB

O GRUB (Grand Unified Bootloader) compreende dois estágios: o stage1 consiste em 512 bytes e é gravado no MBR ou no setor de boot da partição de um disco rígido ou de um disquete. Depois disso, o stage2 é carregado. Este estágio contém o código real do programa. A única tarefa do primeiro estágio é carregar o segundo estágio do carregador de boot.

O stage2 consegue acessar os sistemas de arquivos. Atualmente, são suportados o Ext2, Ext3, ReiserFS, Minix e o sistema de arquivos FAT do DOS usado pelo Windows. Até certo ponto, JFS, XFS, e UFS e FFS usados pelos sistemas BSD também são suportados. Desde a versão 0.95, o GRUB também pode ser inicializado de um CD ou DVD que contenha um sistema de arquivos padrão ISO 9660 que está de acordo com a especificação “El Torito”. Mesmo antes de o sistema ser inicializado, o GRUB pode acessar os sistemas de arquivos dos dispositivos de disco BIOS suportados (disquetes ou discos rígidos, unidades de CD e unidades de DVD detectadas pelo BIOS). Portanto, as alterações realizadas no arquivo de configuração do GRUB (menu.lst) não exigem a reinstalação do gerenciador de boot. Quando o sistema é inicializado, o GRUB carrega o arquivo de menu com os caminhos e dados de partição válidos do kernel ou do disco RAM inicial (initrd) e localiza os arquivos.

A configuração atual do GRUB se baseia em três arquivos que são descritos a seguir:

/boot/grub/menu.lst

Este arquivo contém todas as informações sobre partições ou sistemas operacionais que podem ser inicializados com o GRUB. Sem essas informações, o controle de sistema não pode ser passado para o sistema operacional.

/boot/grub/device.map

Esse arquivo traduz os nomes dos dispositivos da notação do GRUB e do BIOS para os nomes de dispositivos do Linux.

/etc/grub.conf

Esse arquivo contém os parâmetros e as opções que o shell do GRUB precisa para instalar corretamente o carregador de boot.

O GRUB pode ser controlado de várias maneiras. As entradas de boot de uma configuração existente podem ser selecionadas no menu gráfico (tela de apresentação). A configuração é carregada a partir do arquivo menu.lst.

No GRUB, todos os parâmetros de boot podem ser alterados antes do boot. Por exemplo, os erros cometidos durante a edição do arquivo de menu podem ser corrigidos desta maneira. Os comandos de boot também podem ser inseridos de forma interativa através de um tipo de prompt de entrada (consulte o item Seção 29.3.1.3, “Editando as entradas de menu durante o procedimento de boot”). O GRUB oferece a possibilidade de determinar a localização do kernel e do initrd antes do boot. Dessa maneira, você pode até inicializar um sistema operacional instalado para o qual não existe entrada na configuração do carregador de boot.

O shell do GRUB fornece uma emulação do GRUB no sistema instalado. Ele pode ser usado para instalar o GRUB ou testar novas configurações antes de aplicá-las. Consulte o item Seção 29.3.4, “O shell do GRUB”.

29.3.1. O menu de boot do GRUB

A tela de apresentação gráfica com o menu de boot baseia-se no arquivo de configuração do GRUB /boot/grub/menu.lst, que contém todas as informações sobre todas as partições ou sistemas operacionais que podem ser inicializados pelo menu.

Todas as vezes em que o sistema é inicializado, o GRUB carrega o arquivo de menu a partir do sistema de arquivos. Por essa razão, o GRUB não precisa ser reinstalado depois de todas as modificações no arquivo. Use o carregador de boot YaST para modificar a configuração do GRUB conforme descrito no Seção 29.4, “Configurando o carregador de boot com o YaST”.

O arquivo de menu contém comandos. A sintaxe é muito simples. Cada linha contém um comando seguido de parâmetros opcionais separados por espaços, como ocorre no shell. Por razões históricas, alguns comandos admitem um = na frente do primeiro parâmetro. Os comentários são introduzidos por um hash (#).

Para identificar os itens do menu na visão geral do menu, especifique um título para cada entrada. O texto (incluindo os espaços) que vem depois da palavra-chave título é exibido como opção selecionável no menu. Todos os comandos até o próximo título são executados quando se seleciona esse item de menu.

O caso mais simples é o redirecionamento para os carregadores de boot de outros sistemas operacionais. O comando é chainloader, e o argumento é geralmente o bloco de boot de outra partição na notação do bloco do GRUB. Por exemplo:

chainloader (hd0,3)+1

Os nomes de dispositivo no GRUB são explicados em Seção 29.3.1.1, “Convenções de nomenclatura para discos rígidos e partições”. O exemplo apresentado especifica o primeiro bloco da quarta partição do primeiro disco rígido.

Use o comando kernel para especificar uma imagem do kernel. O primeiro argumento é o caminho para a imagem do kernel em uma partição. Os outros argumentos são passados para o kernel na linha de comando.

Se o kernel não contiver drivers incorporados para acesso à partição raiz, o initrd deve ser especificado com um comando separado do GRUB cujo único argumento é o caminho para o arquivo initrd. Como o endereço de carregamento do initrd é gravado na imagem do kernel carregado, o comando initrd deve vir imediatamente após o comando kernel.

O comando root simplifica a especificação do kernel e dos arquivos initrd. O único argumento de root é um dispositivo do GRUB ou uma partição em um dispositivo do GRUB. Esse dispositivo é usado para todos os kernels, initrd, ou para outros caminhos de arquivo para os quais não há dispositivos explicitamente especificados até o próximo comando root. Esse comando não é usado no arquivo menu.lst gerado durante a instalação. Ele apenas facilita a edição manual.

O comando boot está implícito no fim de cada entrada do menu, assim ele não precisa ser gravado no arquivo de menu. No entanto, para usar o GRUB interativamente para o boot, você deve inserir o comando boot no final. O comando em si não tem argumentos. Ele meramente inicializa a imagem do kernel carregado ou do carregador de cadeia especificado.

Depois de gravar todas as entradas de menu, defina uma delas como entrada default. Do contrário, é utilizada a primeira (entrada 0). Você também pode especificar um tempo de espera em segundos depois do qual a entrada default deve ser inicializada. timeout e default geralmente precedem as entradas de menu. Um arquivo de exemplo é descrito em Seção 29.3.1.2, “Um exemplo de arquivo de menu”.

29.3.1.1. Convenções de nomenclatura para discos rígidos e partições

As convenções de nomenclatura que o GRUB utiliza para discos rígidos e partições diferem daquelas usadas para os dispositivos normais do LINUX. No GRUB, a numeração das partições começa no zero. Assim, (hd0,0) é a primeira partição do primeiro disco rígido. Em uma máquina desktop comum, com um disco rígido conectado como master principal, o nome do dispositivo correspondente no Linux é /dev/hda1.

As quatro partições principais possíveis são atribuídas aos números de partição de 0 a 3. As partições lógicas são numeradas a partir de 4:

(hd0,0)   primeira partição primária do primeiro disco rígido
(hd0,1)   segunda partição primária
(hd0,2)   terceira partição primária
(hd0,3)   quarta partição primária (em geral uma partição estendida)
(hd0,4)   primeira partição lógica
(hd0,5)   segunda partição lógica
    

O GRUB não faz distinção entre os dispositivos IDE, SCSI e RAID. Todos os discos rígidos reconhecidos pelo BIOS ou por outras controladoras são numerados de acordo com a seqüência de boot predefinido no BIOS.

Infelizmente, o GRUB não consegue mapear os nomes dos dispositivos do Linux exatamente para os nomes dos dispositivos da BIOS. Ele gera esse mapeamento com a ajuda de um algoritmo e o salva no arquivodevice.map, que pode ser editado se necessário. Em Seção 29.3.2, “O arquivo device.map”, há informações sobre o arquivo device.map.

O caminho completo do GRUB consiste em um nome de dispositivo escrito entre parênteses e no caminho para o arquivo no sistema de arquivos na partição especificada. O caminho começa com uma barra. Por exemplo, o kernel inicializável poderia ser especificado como segue em um sistema com um disco rígido único de IDE que contém o Linux em sua primeira partição:

(hd0,0)/boot/vmlinuz

29.3.1.2. Um exemplo de arquivo de menu

O exemplo a seguir mostra a estrutura de um arquivo de menu do GRUB. A instalação de exemplo compreende uma partição de boot do Linux em /dev/hda5, uma partição raiz em /dev/hda7 e uma instalação do Windows em /dev/hda1.

ggfxmenu (hd0,4)/message 
color white/blue black/light-gray 
default 0
timeout 8 

title linux 
   kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd 

title windows 
   chainloader(hd0,0)+1 

title floppy
   chainloader(fd0)+1 

title failsafe 
   kernel (hd0,4)/vmlinuz.shipped root=/dev/hda7 ide=nodma \ 
   apm=off acpi=off vga=normal nosmp maxcpus=0 3 
   initrd (hd0,4)/initrd.shipped

O primeiro bloco define a configuração da tela de apresentação:

gfxmenu (hd0,4)/message

A mensagem da imagem de segundo plano localiza-se em /dev/hda5.

color white/blue black/light-gray

Esquema de cor: branco (primeiro plano), azul (segundo plano), preto (seleção) e cinza-claro (segundo plano da seleção). O esquema de cores não tem efeito sobre a tela de apresentação, apenas sobre o menu personalizável do GRUB que você pode acessar saindo da tela de apresentação com Esc.

default 0

Por padrão, a primeira entrada do menu, title linux, é a utilizada para inicializar.

timeout 8

Após oito segundos sem nenhuma entrada do usuário, o GRUB inicializa automaticamente a entrada default. Para desativar o boot automático, exclua a linha timeout. Se você definir timeout 0, o GRUB inicializa a entrada default imediatamente.

O segundo e maior bloco lista os vários sistemas operacionais inicializáveis. As seções para os sistemas operacionais individuais são introduzidas pelo título.

  • A primeira entrada (title linux) é responsável por inicializar o SUSE Linux. O kernel (vmlinuz) localiza-se na primeira partição lógica (a partição de boot) do primeiro disco rígido. Os parâmetros do kernel, tais como a partição raiz e o modo VGA, são anexados aqui. A partição raiz é especificada de acordo com a convenção de nomenclatura do Linux (/dev/hda7/), pois essas informações são lidas pelo kernel e não têm nada a ver com o GRUB. O initrd também se localiza na primeira partição lógica do primeiro disco rígido.

  • A segunda entrada é responsável por carregar o Windows. O Windows é inicializado a partir da primeira partição do primeiro disco rígido (hd0,0). O comando chainloader +1 faz com que o GRUB leia e execute o primeiro setor da partição especificada.

  • A próxima entrada permite o boot a partir do disco rígido sem modificar as configurações do BIOS.

  • A opção de boot failsafe inicia o Linux com uma seleção de parâmetros do kernel que permite que o Linux seja inicializado nos sistemas problemáticos.

O arquivo de menu pode ser alterado sempre que for necessário. O GRUB utiliza, então, as configurações modificadas durante o próximo boot. Edite o arquivo permanentemente usando o YaST ou um editor da sua escolha. Como alternativa, faça as alterações temporárias de forma interativa usando a função de edição do GRUB. Consulte o item Seção 29.3.1.3, “Editando as entradas de menu durante o procedimento de boot”.

29.3.1.3. Editando as entradas de menu durante o procedimento de boot

No menu gráfico de boot do GRUB, selecione o sistema operacional a ser inicializado com as teclas de seta. Se selecionar um sistema Linux, você pode inserir parâmetros extras de boot no prompt de boot. Para editar diretamente as entradas individuais do menu, pressione Esc para sair da tela de apresentação e depois pressione E. As alterações feitas desta maneira só se aplicam ao procedimento atual de boot, não sendo adotadas permanentemente.

[Important]Layout do teclado durante o procedimento de boot

O layout do teclado norte-americano é o único disponível na hora de inicializar.

Depois de ativar o modo de edição, use as teclas de seta para selecionar a entrada de menu cuja configuração deve ser editada. Para tornar a configuração editável, pressione E uma vez mais. Dessa maneira, edite as especificações incorretas das partições ou do caminho antes que tenham um efeito negativo sobre o processo de boot. Pressione Enter para sair do modo de edição e retornar ao menu. Depois pressione B para inicializar essa entrada. No texto de ajuda da parte inferior, são mostradas mais ações possíveis.

Para inserir permanentemente as opções alteradas de boot e passá-las para o kernel, abra o arquivo menu.lst como raiz do usuário e anexe os respectivos parâmetros do kernel à linha existente, separados por espaços:

title linux 
   kernel (hd0,0)/vmlinuz root=/dev/hda3 additional parameter
   initrd (hd0,0)/initrd

O GRUB adota automaticamente os novos parâmetros na próxima vez em que o sistema é inicializado. Como alternativa, essa alteração também pode ser feita com o módulo do carregador de boot YaST. Anexe os novos parâmetros à linha existente, separados por espaços.

29.3.1.4. Usando curingas para selecionar o kernel de boot

Especialmente quando se desenvolvem ou se usam kernels personalizados, você deve mudar as entradas no menu.lst ou editar a linha de comando para refletir o kernel atual e os nomes de arquivos initrd. Para simplificar esse procedimento, use curingas para atualizar dinamicamente a lista do kernel do GRUB. Assim, todas as imagens do kernel que correspondem a um padrão específico são automaticamente acrescentadas à lista de imagens inicializáveis. Observe que não há suporte a esse recurso.

Ative a opção do curinga inserindo uma entrada extra de menu no menu.lst. Para serem úteis, todas as imagens initrd e do kernel têm um nome-base comum e um identificador que corresponde ao kernel com o seu initrd associado. Considere a seguinte configuração:

initrd-default
initrd-test
vmlinuz-default
vmlinuz-test

Nesse caso, você pode acrescentar imagens de boot em uma configuração do GRUB. Para obter as entradas do menu linux-default e linux-test, seria necessária a seguinte entrada no menu.lst:

title linux-*
   wildcard (hd0,4)/vmlinuz-*
   kernel (hd0,4)/vmlinuz-* root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-*

Nesse exemplo, o GRUB pesquisa a partição (hd0,4) para ver se há entradas que correspondam ao curinga. Essas entradas são usadas para gerar novas entradas de menu do GRUB. No exemplo anterior, o GRUB comporta-se como se as seguintes entradas existissem no menu.lst:

title linux-default
   wildcard (hd0,4)/vmlinuz-default
   kernel (hd0,4)/vmlinuz-default root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-default 
title linux-test
   wildcard (hd0,4)/vmlinuz-test
   kernel (hd0,4)/vmlinuz-test root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-test
    

Com essa configuração, podem-se esperar problemas caso os nomes de arquivo não forem usados de forma consistente, ou se estiver faltando um dos arquivos expandidos, como uma imagem initrd.

29.3.2. O arquivo device.map

O arquivo device.map mapeia os nomes de dispositivos do GRUB para os nomes de dispositivos do Linux. Em um sistema misto que contém discos rígidos IDE e SCSI, o GRUB deve tentar determinar a seqüência de boot através de um procedimento especial, pois o GRUB não tem acesso às informações do BIOS na seqüência de boot. O GRUB salva o resultado desta análise no arquivo /boot/grub/device.map. Para um sistema no qual a seqüência de boot no BIOS é configurada como IDE antes de SCSI, o arquivo device.map poderia aparecer da seguinte forma:

(fd0)  /dev/fd0
(hd0)  /dev/hda
(hd1)  /dev/sda

Como a ordem da IDE, da SCSI e de outros discos rígidos depende de vários fatores, e como o Linux não consegue identificar o mapeamento, a seqüência no arquivo device.map pode ser configurada manualmente. Se você encontrar problemas na hora do boot, verifique se a seqüência neste arquivo corresponde à seqüência no BIOS e use o shell do GRUB, descrito em Seção 29.3.4, “O shell do GRUB”, para modificá-la temporariamente, conforme se fizer necessário. Depois que o sistema Linux for inicializado, o arquivo device.map pode ser permanentemente editado com o módulo do carregador de boot YaST ou com um editor da sua preferência.

Depois de alterar manualmente o device.map, execute o seguinte comando para reinstalar o GRUB. Este comando faz com que o arquivo device.map seja recarregado e os comandos listados em grub.conf sejam executados:

grub --batch < /etc/grub.conf

29.3.3. O arquivo /etc/grub.conf

O terceiro arquivo importante de configuração do GRUB, depois do menu.lst e do device.map, é o /etc/grub.conf. Esse arquivo contém os parâmetros e as opções que o comando grub precisa para instalar corretamente o carregador de boot:

root (hd0,4) 
   install /grub/stage1 d (hd0) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst 
   quit

Significado das entradas individuais:

root (hd0,4)

Esse comando diz para o GRUB aplicar os seguintes comandos à primeira partição lógica do primeiro disco rígido (o local dos arquivos de boot).

install parameter

O comando grub deve ser executado com o parâmetro install. O stage1 do carregador de boot deve ser instalado no MBR do primeiro disco rígido (/grub/stage1 d (hd0)). O stage2 deve ser carregado no endereço de memória 0x8000 (/grub/stage2 0x8000). A última entrada ((hd0,4)/grub/menu.lst) mostra para o GRUB onde ele deve procurar o arquivo de menu.

29.3.4. O shell do GRUB

O GRUB existe em duas versões: como carregador de boot e como programa normal do Linux em /usr/sbin/grub. Esse programa é conhecido como shell do GRUB. A funcionalidade para instalar o GRUB como carregador de boot em um disco rígido ou em um disquete é integrada no GRUB na forma dos comandos install e setup. Isso está disponível no shell do GRUB quando o Linux é carregado.

No entanto, os comandos setup e install também estão disponíveis durante o procedimento de boot antes de o Linux ser iniciado. Isso facilita a reparação de um sistema com defeito que não pode mais ser inicializado, pois o arquivo de configuração defeituoso do carregador de boot pode ser evitado ao se inserir parâmetros manualmente. A inserção manual de parâmetros durante o procedimento de boot também é útil para testar novas configurações sem danificar o sistema nativo. Basta inserir o arquivo de configuração experimental com uma sintaxe semelhante àquela existente no menu.lst. Depois teste a funcionalidade dessa entrada sem alterar o arquivo de configuração atual. Por exemplo, para testar um novo kernel, insira o comando kernel e o caminho para o novo kernel. Se o procedimento de boot falhar, você poderá continuar a usar o arquivo menu.lst intacto na próxima vez em que inicializar o sistema. Da mesma forma, a interface da linha de comando também pode ser usada para inicializar um sistema apesar de um arquivo menu.lst defeituoso, inserindo-se os parâmetros corrigidos. No sistema em execução, os parâmetros corretos podem ser inseridos no menu.lst para tornar o sistema permanentemente inicializável.

O mapeamento dos dispositivos do GRUB com os nomes dos dispositivos do Linux só é relevante quando se executa o shell do GRUB como um programa Linux (inserindo-se grub como descrito em Seção 29.3.2, “O arquivo device.map”). Para essa finalidade, o programa lê o arquivo device.map. Para obter mais informações, consulte o item Seção 29.3.2, “O arquivo device.map”.

29.3.5. Configurando uma senha de boot

Mesmo antes de o sistema operacional ser inicializado, o GRUB permite acesso aos sistema de arquivos. Os usuários que não têm permissões raiz podem acessar os arquivos no seu sistema Linux aos quais não têm acesso depois que o sistema é inicializado. Para bloquear esse tipo de acesso ou impedir que os usuários inicializem certos sistemas operacionais, defina uma senha de boot.

[Important]Senha de boot e tela de apresentação

Se você usar uma senha de boot para o GRUB, a tela normal de apresentação não será exibida.

Como a raiz do usuário, proceda da seguinte forma para definir uma senha de boot:

  1. No prompt raiz, insira grub.

  2. Criptografe a senha no shell do GRUB:

    grub> md5crypt
    Password: ****
    Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
  3. Cole a string criptografada na seção global do arquivo menu.lst:

    gfxmenu (hd0,4)/message
    color white/blue black/light-gray
    default 0
    timeout 8
    password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/

    Agora os comandos do GRUB só podem ser executados no prompt raiz depois que se pressionar P e se inserir a senha. No entanto, os usuários ainda podem inicializar todos os sistemas operacionais a partir do menu de boot.

  4. Para impedir que um ou vários sistemas operacionais sejam inicializados a partir do menu de boot, acrescente a entrada lock em cada seção no menu.lst que não deveria ser inicializada sem se inserir uma senha. Por exemplo:

    title linux
    kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791
    initrd (hd0,4)/initrd
    lock

    Depois de reiniciar o sistema e selecionar a entrada no Linux no menu de boot, é exibida a seguinte mensagem de erro:

    Erro 32: Precisa de autenticação

    Pressione Enter para inserir o menu. Depois pressione P para obter o prompt da senha. Depois de inserir a senha e pressionar Enter, o sistema operacional selecionado (o Linux, neste caso) não deve inicializar.