GRUB

(Os detalhes contidos na seção sobre o GRUB, foram integralmente desenvolvidos por Alexandre Costa como contribuição ao guia FOCA GNU/Linux.)

O GRUB (Grand Unified Boot Loader) é mais uma alternativa como gerenciador de boot e apresenta alguns recursos extras com relação as outras opções disponíveis. Ele é flexível, funcional e poderoso, podendo inicializar sistemas operacionais como o Windows (9x, ME, NT, 2000 e XP), Dos, Linux, GNU Hurd, *BSD, OS/2 e etc. Podemos destacar também o suporte aos sistemas de arquivos ext2 (Linux), ext3 e reiserfs (novos sistemas de arquivos journaling do Linux), FAT16 e FAT32 (Win 9x/ME), FFS (Fast File System usado no *BSD), minix (MINIX OS) e etc.

Por utilizar o padrão Multiboot ele é capaz de carregar diversas imagens de boot e módulos. Por esse motivo ele é o único gerenciador de inicialização capaz de carregar o conjunto de servidores do GNU Hurd. O GRUB também permite buscar imagens do kernel pela rede, por cabo seriais, suporta discos rígidos IDE e SCSI, detecta toda a memória RAM disponível no sistema, tem interface voltada para linha de comandos ou menus de escolha, além de suportar sistemas sem discos e terminais remotos.

Como possui inúmeros recursos, será apresentada sua utilização básica, ficando como sugestão ao leitor procurar se aprofundar mais em suas possibilidades de uso e configuração.

Como o GRUB trabalha com discos e partições

O GRUB trabalha com uma notação diferente para apontar discos e partições sendo necessário algumas explicações antes de prosseguir. Veja a tabela comparativa:

No Linux                No GRUB

/dev/hda                (hd0)
/dev/hda1               (hd0,0)
/dev/hda2               (hd0,1)

/dev/hdb                (hd1)
/dev/hdb1               (hd1,0)
/dev/hdb2               (hd1,1)

/dev/sda                (hd0)   # Disco SCSI ID 0
/dev/sda1               (hd0,0) # Disco SCSI ID 0, partição 1
/dev/sda2               (hd0,1) # Disco SCSI ID 0, partição 2

/dev/sdb                (hd1)   # Disco SCSI ID 1
/dev/sdb1               (hd1,0) # Disco SCSI ID 1, partição 1
/dev/sdb2               (hd1,1) # Disco SCSI ID 1, partição 2

/dev/fd0                (fd0)

OBS: Os discos IDE e SCSI são referenciados ambos como (hd?) pelo GRUB. Não há distinção entre os discos e de modo geral a identificação de unidades IDE é menor do que qualquer tipo de drive SCSI, salvo se você alterar a seqüência de inicialização (boot) na BIOS.

Para saber como o Linux trabalha com partições veja “Identificação de discos e partições em sistemas Linux”.

Instalando o GRUB

A instalação do GRUB ao contrário da instalação do LILO (“LILO”), só precisa ser executada uma única vez. Caso seja necessária alguma mudança como por exemplo adicionar uma nova imagem, esta pode ser feita apenas editando o arquivo de configuração menu.lst.

No MBR

Um método simples de adicionar o GRUB para gerenciar seu MBR (Master Boot Record) é rodando o seguinte comando (como superusuário):

# /sbin/grub-install /dev/hda

Este comando grava o GRUB no MBR do primeiro disco e cria o diretório /boot/grub onde estarão os arquivos necessários para o seu funcionamento. Neste ponto o GRUB já está instalado e quando você reiniciar seu computador irá se deparar com uma linha de comandos, onde terá que carregar a imagem do kernel manualmente. Mais adiante será explorada a utilização desta linha de comando que é muito eficiente.

Provavelmente você achará mais interessante copiar o arquivo de configuração de exemplos do GRUB e otimizá-lo às suas necessidades. Note que isto não exclui a possibilidade de utilizar a linha de comando, apenas cria uma interface de menus onde você pode configurar várias opções de boot de uma forma organizada, automatizada e funcional. Copie este arquivo para o diretório /boot/grub com o seguinte comando:

# cp /usr/share/doc/grub/examples/menu.lst /boot/grub

Por ser um arquivo de exemplos será necessário otimizá-lo de acordo com suas necessidades, o que será abordado mais a frente.

No disco flexível (somente linha de comando)

Quando criamos um disquete de partida, este funcionará em um sistema qualquer, podendo utilizar este disquete em várias máquinas diferentes ou em uma máquina em que tenha tido algum problema com o GRUB no MBR. Coloque um disquete virgem e digite os seguintes comandos:

# dd if=/usr/lib/grub/i386-pc/stage1 of=/dev/fd0 count=1
# dd if=/usr/lib/grub/i386-pc/stage2 of=/dev/fd0 seek=1

Estes comandos permitem que seja apresentada a linha de comando do grub quando este disco for utilizado para boot.

No disco flexível (com interface de menu)

Quando foi criado o disquete de partida anteriormente, este só nos permitia utilizar a linha de comando sendo necessário carregar o menu.lst pelo disco rígido (o qual deve estar presente). Em alguns casos este disco satisfaz as necessidades básicas mas pode haver um momento em que você deseje ter um disquete que funcione com vários sistema e não dependa de um disco fixo.

Digite os seguintes comandos:

# mke2fs /dev/fd0
# mount /dev/fd0 /floppy -t ext2
# mkdir /floppy/grub
# cp /usr/lib/grub/i386-pc/stage[12] /floppy/grub
# cp /usr/share/doc/grub/examples/menu.lst /floppy/grub
# umount /floppy
# /sbin/grub

Este último comando disponibiliza a linha de comando do GRUB. Digite os seguintes comandos:

grub> install (fd0)/grub/stage1 d (fd0) (fd0)/grub/stage2 p (fd0)/grub/menu.lst
grub> quit

Neste momento o disquete está pronto. Note que o menu.lst que foi copiado para ele é um arquivo de exemplo, sendo necessário que você o configure de acordo com suas necessidades.

Opções do arquivo de configuração

Esta seção descreve o arquivo menu.lst com explicações sobre as opções mais usadas. Este arquivo é dividido em parâmetros Globais, que afetam o arquivo todo e parâmetros que só tem efeito para as imagens do sistema que será carregado. Algumas opções podem ser passadas para o kernel do Linux no momento do boot, algumas delas também serão detalhadas.

Parâmetros Globais
  • timeout = Define um tempo (em segundos) de espera. Se nenhuma tecla for pressionada, carrega a imagem padrão.

  • default = Define qual será a opção padrão que deve ser automaticamente selecionada quando nenhuma outra for especificada em um tempo definido por timeout.

  • fallback = Caso ocorra algum erro inesperado e a opção padrão não possa ser carregada, este parâmetro define qual a outra opção deve ser utilizada.

  • color = Permite que você escolha as cores usadas no menu de boot.

  • password = Permite que você especifique uma senha. Está será solicitada sempre que houver necessidade de realizar uma função que não seja carregar as imagens disponíveis, como por exemplo acessar a linha de comandos do GRUB. Você pode utilizar também o parâmetro password para esconder um arquivo que contenha outras configurações, como um menu.lst secreto. O arquivo pode ter um nome qualquer.

    Ex.: password = senha (hd0,0)/boot/grub/secret.conf
    

    Você pode ter várias entradas do parâmetro "password" em um mesmo arquivo sendo que uma delas é usada para bloquear o acesso as imagens/linha de comandos e as outras usadas para carregar arquivos de opções do GRUB. Quando você digitar p para entrar com a senha, você pode digitar a senha que protege as imagens/linha de comandos ou a que é utilizada para carregar os arquivos de opções.

  • hiddenmenu = Está opção faz com que o menu de opções não seja mostrado e de boot na imagem especificada por "default" depois de expirado o tempo definido em timeout. O usuário pode requisitar o menu com as opções pressionando a tecla <ESC> antes que o tempo definido em timeout expire.

Parâmetros que afetam apenas as imagens
  • title = Define um texto que será apresentado no menu de boot para identificar o sistema a ser inicializado.

  • root = Determina qual a partição raiz do sistema a ser inicializada.

  • rootnoverify = Idêntica a opção root, mas não tenta montar a partição-alvo, o que é necessário para alguns sistemas como Dos e Windows.

  • kernel = Nesta opção você informa qual o kernel vai ser inicializado. Você pode passar parâmetros diretamente para o kernel também.

    Ex.: kernel (hd0,0)/boot/vmlinuz-2.4.16 vga=6
    
  • module = Faz com que algum módulo necessário para o boot seja carregado. Lembre-se que estes não são módulos do kernel (módulos de som, rede, etc.) e sim módulos necessários ao boot de alguns sistemas, como por exemplo o GNU Hurd.

  • lock = Quando você quiser controlar se uma pessoa pode iniciar um sistema que esteja listado nas opções do menu de boot, você pode utilizar esta opção que faz com que a senha especificada com o comando "password" seja solicitada no momento em que se tentar carregar a imagem em questão.

  • pause = Emite uma mensagem na tela e espera uma tecla ser pressionada.

  • makeactive = Torna a partição ativa. Este comando está limitado a partições primárias dos discos.

  • chainloader = Alguns sistemas como o Windows ou Dos armazenam seu próprio gerenciador de boot no início da partição em que ele está instalado. Para efetuar o boot destes sistemas através do GRUB, você precisa pedir para que o gerenciador de boot de tal sistema seja carregado e faça seu trabalho, dando o boot.

  • hide e unhide = Esconde e mostra partição respectivamente. Estas duas opções são necessárias quando houver mais de uma versão do Dos ou Windows na máquina em partições diferentes, já que estes sistemas detectam automaticamente a partição e quase sempre o fazem de modo errado. Suponha o Windows na primeira partição primária (hd0,0) e o Dos na segunda partição primária (hd0,1). Quando quisermos carregar estes sistemas devemos proceder da seguinte maneira:

    title Windows
    hide (hd0,1)
    unhide (hd0,0)
    rootnoverify (hd0,0)
    chainloader  +1
    makeactive
    
    title Dos
    hide (hd0,0)
    unhide (hd0,1)
    rootnoverify (hd0,1)
    chainloader  +1
    makeactive
    
  • map = Alguns sistemas não permitem ser inicializados quando não estão no primeiro disco (Dos, Win 9x, etc.). Para resolver esta e outras situações o GRUB tem um comando que permite enganar tal sistema mapeando as unidades de disco do modo como lhe for mais conveniente.

    Imagine que você tenha o primeiro disco (hd0) com o GNU/Linux instalado e em um outro disco (hd1) com o Windows/Dos instalado. O Windows/Dos não permitem serem inicializados desta forma e como solução você poderia usar a seguinte entrada no arquivo de configurações do GRUB:

    title Windows
    unhide (hd1,0)
    rootnoverify (hd1,0)
    chainloader +1
    map (hd1) (hd0)
    makeactive
    

    Isso faz com que o disco (hd1), onde esta o Windows/Dos, seja apresentado a este sistema como (hd0) "enganado" o mesmo e possibilitando o boot.

Parâmetros enviados diretamente ao kernel

Pode ser necessário passar alguns parâmetros para o kernel no momento do boot. Para maiores informações ver a seção “Parâmetros de inicialização passados ao kernel”. Você pode passar os parâmetros da seguinte maneira:

# Exemplo de entrada no 'menu.lst'.
title Linux 2.4.16
root (hd0,0)
kernel (hd0,0)/boot/vmlinuz-2.4.16 vga=6 mem=512M ramdisk=0

Neste exemplo, a linha com o comando "kernel" é usada para indicar qual imagem deve ser carregada. As opções que seguem (vga, mem e ramdisk) são parâmetros que devem ser passados diretamente ao kernel do sistema a ser carregado.

Um exemplo de arquivo de configuração

# Exemplo de arquivo de configuração do GRUB.
# Note que você pode usar o  caracter '#' para fazer comentários.

# Se após 30 segundos nenhuma tecla for pressionada, carrega a imagem padrão.
timeout 30

# Define a primeira imagem como padrão.
default 0

# Caso a imagem padrão não funcione carrega a imagem definida aqui.
fallback 1

# Define as cores que serão usadas no menu.
color light-cyan/black white/blue

# Permite utilizar uma senha.
password minha-senha-secreta
password minha-senha (hd0,0)/boot/grub/secret.conf

# Para boot com o GNU/Hurd
title GNU/Hurd
root (hd0,0)
kernel /boot/gnumach.gz root=hd0s1
module /boot/serverboot.gz

# Para boot com o GNU/Linux
title Linux 2.4.16
# Pede a senha configurada em "password" antes de carregar esta imagem.
lock
root (hd0,0)
# Atente as opções passadas diretamente para o kernel (vga, mem, etc.).
kernel (hd0,0)/boot/vmlinuz-2.4.16 vga=6 mem=512M ramdisk=0

# Para boot com o Mach (obtendo o kernel de um disquete)
title Utah Mach4 multiboot
root (hd0,2)
pause Insira o disquete agora!!!
kernel (fd0)/boot/kernel root=hd0s3
module (fd0)/boot/bootstrap

# Para boot com FreeBSD
title FreeBSD 3.4
root (hd0,2,a)
kernel /boot/loader

# Para boot com OS/2
title OS/2
root (hd0,1)
makeactive
chainloader +1
chainloader /boot/chain.os2

# Para boot com Windows 9x, ME, NT, 2000, XP.
title Windows 9x, ME, NT, 2000, XP
unhide (hd0,0)
rootnoverify (hd0,0)
chainloader  +1
makeactive

# Para instalar o GRUB no disco rígido.
title = Instala o GRUB no disco rígido
root = (hd0,0)
setup = (hd0)

# Muda as cores.
title Mudar as cores
color light-green/brown blink-red/blue

Usando a linha de comandos do GRUB

O GRUB possui inúmeros recursos, mas com certeza um dos mais importantes e que merece destaque é sua linha de comandos. A maioria dos comandos usados no arquivo de configuração menu.lst são válidos aqui e muitos outros estão disponíveis. Uma breve apresentação da linha de comandos será dada, ficando por conta do leitor se aprofundar o quanto achar necessário em sua flexibilidade.

Quando o GRUB é inicializado você pode se deparar com sua linha de comandos ou se possuir o arquivo menu.lst configurado, um menu de escolha. Mesmo usando os menus de escolha você pode utilizar a linha de comandos, bastando para isso seguir as instruções no rodapé da tela onde o GRUB nos informa que podemos digitar e para editar as entradas de boot ou c para ter acesso a linha de comandos (lembre-se que pressionar <ESC> faz com que você volte aos menus de escolha).

Caso a opção password tenha sido especificada no arquivo menu.lst, será necessário antes de acessar as outras opções (que estarão desabilitadas) pressionar p e entrar com a senha correta.

Agora, com acesso a linha de comandos, você pode verificar os comandos disponíveis pressionando duas vezes a tecla <TAB>. Note que você também pode utilizar esta tecla para completar nomes de comandos bem como parâmetros de alguns comandos.

Alguns comandos disponíveis:

  • cat = Este comando permite verificar o conteúdo de um arquivo qualquer, o qual deve estar gravado em um dispositivo ligado a sua máquina. Embora seja um recurso útil, nenhuma permissão de acesso é verificada e qualquer pessoa que tenha acesso a linha de comandos do GRUB pode listar o conteúdo de arquivos importantes. Para contornar este problema o parâmetro password é utilizado no arquivo menu.lst e faz com que uma senha seja solicitada antes de liberar o acesso a linha de comandos. Não esqueça que ainda é possível utilizar um disquete com o GRUB para dar boot na máquina o que permite usar a linha de comandos pelo disquete.

    Ex.: grub> cat (hd0,0)/etc/passwd
    
  • cmp = Este comando é utilizado para comparar dois arquivos.

    Ex.: grub> cmp (hd0,0)/arquivo1 (hd0,0)/arquivo2
    
  • configfile = Carrega um arquivo de configuração do GRUB.

    Ex.: grub> configfile (hd0,0)/boot/grub/menu.lst
    
  • displayapm = Mostra informações sobre APM.

  • displaymem = Mostra informações sobre a memória RAM.

  • find = Permite encontrar um arquivo. A saída deste comando disponibiliza o nome completo do caminho para o arquivo e a partição onde o mesmo está localizado.

    Ex.: grub> find stage1
    
  • geometry = Mostra informações sobre a geometria reconhecida de seu drive e permite que você escolha a geometria desejada caso esta esteja sendo reconhecida erroneamente.

  • help = help "comando" para ver a ajuda.

    Ex.: help color
    
  • install = Instala o GRUB, embora não seja recomendado o uso deste comando diretamente, pois é possível esquecer ou trocar facilmente um parâmetro e sobrescrever a tabela de partições de seu disco.

    Ex.: install (fd0)/grub/stage1 d (fd0) (fd0)/grub/stage2 p (fd0)/grub/menu.lst
    
  • setup = Você pode usar este comando para instalar o GRUB. Note que sua sintaxe é menos complexa do que a usada em install.

    Ex.: 
    grub> root = (hd0,0)
    grub> setup = (hd0)
    
  • quit = Abandona a linha de comandos do GRUB.

  • reboot = Reinicia o computador.

  • boot = Efetua o boot. Suponha o Linux instalado em (hd0,0), podemos passar os seguintes comandos na linha de comandos para efetuar o boot de uma imagem do GNU/Linux:

    grub> root (hd0,0)
    grub> kernel (hd0,0)/boot/vmlinuz-2.4.16 vga=6
    grub> boot
    

Muitos outros comandos estão disponíveis tanto na linha de comandos do GRUB quanto no arquivo de configuração menu.lst. Estes comandos adicionais podem ser necessários apenas para algumas pessoas e por isso não serão explicados.

Removendo o GRUB do MBR

Não existe a necessidade de se remover o GRUB do MBR pois não há utilização para o mesmo vazio. Para substituir o GRUB do MBR é necessário apenas que outro gerenciador de boot escreva algo nele. Você pode seguir o procedimento de instalação do LILO para escrever algo no MBR ou usar o comando fdisk /mbr do DOS.

Como obter informações mais detalhadas

Para obter informações mais detalhadas sobre o GRUB é recomendado o site oficial do mesmo, o qual está disponível apenas na língua inglesa. Os seguintes sites foram utilizados na pesquisa: