9.2. Inicializando com o GRUB

O GRUB (Grand Unified Bootloader) tem dois estágios. O stage1 consiste em 512 bytes e sua única tarefa é carregar o segundo estágio do carregador de boot. Depois disso, o stage2 é carregado. Este estágio contém a parte principal do carregador de boot.

Em algumas configurações, um estágio intermediário 1.5 pode ser usado, que localiza e carrega o estágio 2 de um sistema de arquivos apropriado. Se possível, este método é escolhido por padrão durante a instalação ou durante a configuração inicial do GRUB com o YaST.

O stage2 consegue acessar vários 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, a linha de comando do GRUB pergunta ao usuário como proceder (consulte Seção 9.2.1.3, “Editando as entradas de menu durante o procedimento de boot” para obter detalhes).

/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 comandos, 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 Seção 9.2.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 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. Ele fornece uma emulação do GRUB no sistema instalado e pode ser usado para instalar o GRUB ou testar novas configurações antes de aplicá-las. 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.

9.2.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 9.3, “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, defina 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 9.2.1.1, “Convenções de nomenclatura para discos rígidos e partições”. Este exemplo 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 ou um sistema Linux recente com recursos de hotplug avançados for usado, 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 ou uma partição. 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.

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, após o qual a entrada padrão deve inicializar. timeout e default geralmente precedem as entradas de menu. Um arquivo de exemplo é descrito em Seção 9.2.1.2, “Um exemplo de arquivo de menu”.

9.2.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. Isso significa que (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 
    

Sendo dependente de dispositivos BIO, o GRUB não distingue entre dispositivos IDE, SATA, SCSI e RAID de hardware. 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, geralmente não é possível mapear os nomes dos dispositivos do Linux exatamente para os nomes dos dispositivos do BIOS. Ele gera esse mapeamento com a ajuda de um algoritmo e o salva no arquivodevice.map, que pode ser editado se necessário. Na Seção 9.2.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

9.2.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.

gfxmenu (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 Seção 9.2.1.3, “Editando as entradas de menu durante o procedimento de boot”.

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

No menu gráfico de boot, 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 entrar no menu baseado em texto do GRUB e depois pressione E. As alterações feitas desta maneira só se aplicam ao boot atual, 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.

Editar entradas de menu facilita o reparo 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.

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 novamente. 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.

9.2.2. O arquivo device.map

O arquivo device.map mapeia os nomes de dispositivos do GRUB e do BIOS 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 prompt do GRUB para modificá-la temporariamente, se 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.

[Important]Discos SATA

Dependendo do controlador, os discos SATA são reconhecidos como dispositivos IDE (/dev/hdx) ou SCSI (/dev/sdx).

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

9.2.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 comandos, os parâmetros e as opções que o shell do GRUB precisa para instalar corretamente o carregador de boot:

root (hd0,4)
   install /grub/stage1 (hd0,3) /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 container da partição estendida (/grub/stage1 (hd0,3)). O stage2 deve ser carregado no endereço da 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.

9.2.4. 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.