102.2 Lição 1
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
102 Instalação do Linux e gerenciamento de pacotes |
Objetivo: |
102.2 Instalar um gerenciador de inicialização |
Lição: |
1 de 1 |
Introdução
Quando um computador é ligado, o primeiro software a ser executado é o gerenciador de inicialização. O único objetivo desse código é carregar o kernel de um sistema operacional e entregar o controle a ele. O kernel então carrega os drivers necessários, inicializa o hardware e, em seguida, carrega o restante do sistema operacional.
O GRUB é o gerenciador de inicialização usado na maioria das distribuições Linux. Ele pode carregar o kernel do Linux ou outros sistemas operacionais, como o Windows, além de lidar com diversas imagens e parâmetros do kernel como entradas de menu separadas. A seleção do kernel na inicialização é feita por meio de uma interface acionada por teclado. Existe também uma interface de linha de comando para editar as opções e parâmetros de inicialização.
A maioria das distribuições Linux instala e configura o GRUB (na verdade, o GRUB 2) automaticamente, para que um usuário comum não precise pensar nisso. No entanto, como administrador do sistema, é essencial saber controlar o processo de inicialização para ser possível recuperar o sistema no caso de uma falha na inicialização — por exemplo, se houver um erro na atualização do kernel.
Nesta lição, você aprenderá como instalar, configurar e interagir com o GRUB.
GRUB Legacy e GRUB 2
A versão original do GRUB (Grand Unified Bootloader), agora conhecida como GRUB Legacy, foi desenvolvida em 1995 como parte do projeto GNU Hurd e, mais tarde, adotada como o gerenciador de inicialização padrão de muitas distribuições Linux, substituindo alternativas anteriores, como o LILO.
O GRUB 2 é uma remodelagem completa do GRUB com o objetivo de deixá-lo mais limpo, seguro, robusto e poderoso. Dentre as muitas vantagens em relação ao GRUB Legacy estão um arquivo de configuração muito mais flexível (com mais comandos e instruções condicionais, semelhantes a uma linguagem de script), um design mais modular e melhor localização/internacionalização.
Também há suporte para temas e menus gráficos de inicialização com telas de abertura, a possibilidade de inicializar ISOs LiveCD diretamente a partir do disco rígido, melhor suporte para arquiteturas não-x86, suporte universal para UUIDs (facilitando a identificação de discos e partições) e muito mais.
O GRUB Legacy não está mais em desenvolvimento ativo (a última versão foi a 0.97, em 2005), e hoje a maioria das principais distribuições Linux vem com o GRUB 2 como gerenciador de inicialização padrão. No entanto, ainda podemos encontrar sistemas usando o GRUB Legacy; portanto, é importante saber como usá-lo e em que ele difere do GRUB 2.
Onde fica o gerenciador de inicialização?
Historicamente, os discos rígidos nos sistemas compatíveis com IBM PC eram particionados usando o esquema de particionamento MBR, criado em 1982 para o IBM PC-DOS (MS-DOS) 2.0.
Nesse esquema, o primeiro setor de 512 bytes do disco é chamado de Master Boot Record (Registro Mestre de Inicialização, em português) e contém uma tabela que descreve as partições no disco (a tabela de partições) e também um código de inicialização (bootstrap), chamado gerenciador de inicialização.
Quando o computador é ligado, esse código mínimo (devido às restrições de tamanho) do gerenciador de inicialização é carregado, executado e transfere o controle para um carregador de inicialização secundário no disco, geralmente localizado em um espaço de 32 KB entre o MBR e a primeira partição, que por sua vez carregará o(s) sistema(s) operacional(is).
Em um disco particionado em MBR, o código de inicialização do GRUB é instalado no MBR. Ele carrega e transfere o controle para uma imagem “núcleo” instalada entre o MBR e a primeira partição. A partir desse ponto, o GRUB é capaz de carregar o restante dos recursos necessários (definições de menu, arquivos de configuração e módulos extras) do disco.
No entanto, o MBR tem limitações no número de partições (originalmente, no máximo 4 partições primárias; mais tarde, no máximo 3 partições primárias com 1 partição estendida, subdividida em uma série de partições lógicas) e no tamanho máximo de disco (2 TB). Para suplantar essas limitações, foi criado um novo esquema de particionamento chamado GPT (GUID Partition Table), parte do padrão UEFI (Unified Extensible Firmware Interface).
Os discos particionados em GPT podem ser usados em computadores com a BIOS tradicional do PC ou com o firmware UEFI. Em máquinas com BIOS, a segunda parte do GRUB é armazenada em uma partição especial de inicialização da BIOS.
Em sistemas com firmware UEFI, o GRUB é carregado pelo firmware a partir dos arquivos grubia32.efi
(para sistemas de 32 bits) ou grubx64.efi
(para sistemas de 64 bits) em uma partição chamada ESP (EFI System Partition)
A partição /boot
No Linux, os arquivos necessários para o processo de inicialização geralmente são armazenados em uma partição de inicialização montada no sistema de arquivos raiz e coloquialmente chamada de /boot
.
Uma partição de inicialização não é imprescindível nos sistemas atuais, já que os carregadores de inicialização como o GRUB geralmente são capazes de montar o sistema de arquivos raiz e procurar os arquivos necessários dentro de um diretório /boot
. Porém, seu uso é aconselhável, pois ela separa os arquivos necessários ao processo de inicialização do restante do sistema de arquivos.
Essa partição geralmente é a primeira do disco. A razão para isso é que a IBM PC BIOS original endereçava os discos usando cilindros, cabeças e setores (CHS), com um máximo de 1024 cilindros, 256 cabeças e 63 setores, resultando em um tamanho máximo de disco de 528 MB (504 MB no MS-DOS). Isso significa que qualquer coisa além dessa marca não estaria acessível em sistemas legados, a menos que um esquema de endereçamento de disco diferente (como o Endereçamento de bloco lógico, LBA) fosse usado.
Portanto, para garantir uma compatibilidade máxima, a partição /boot
geralmente está localizada no início do disco e termina antes do cilindro 1024 (528 MB), garantindo que a máquina sempre possa carregar o kernel. O tamanho recomendado para essa partição em uma máquina atual é de 300 MB.
Outras razões para uma partição /boot
separada são a criptografia e a compactação, já que alguns métodos ainda não são suportados pelo GRUB 2, ou ainda se a partição raiz do sistema (/
) precisar ser formatada usando um sistema de arquivos não suportado.
Conteúdo da partição de inicialização
O conteúdo da partição /boot
pode variar de acordo com a arquitetura do sistema ou o gerenciador de inicialização usado, mas em um sistema baseado em x86 geralmente encontramos os arquivos abaixo. A maioria deles recebe o sufixo -VERSION
, onde -VERSION
é a versão correspondente do kernel do Linux. Assim, por exemplo, o arquivo de configuração para a versão do kernel do Linux 4.15.0-65-generic
seria chamado de config-4.15.0-65-generic
.
- Arquivo de configuração
-
Este arquivo, geralmente chamado
config-VERSION
(veja o exemplo acima), armazena parâmetros de configuração para o kernel do Linux. Este arquivo é gerado automaticamente quando um novo kernel é compilado ou instalado e não deve ser diretamente modificado pelo usuário. - Mapa do sistema
-
Este arquivo é uma tabela de consulta que articula nomes de símbolos (como variáveis ou funções) com sua posição correspondente na memória. Isso é útil ao se corrigir um tipo de falha do sistema conhecida como kernel panic (pânico do kernel), pois permite ao usuário saber qual variável ou função estava sendo chamada quando ocorreu a falha. Como no caso do arquivo de configuração, o nome geralmente é
System.map-VERSION
(por exemplo,System.map-4.15.0-65-generic
). - Kernel do Linux
-
Este é o kernel do sistema operacional propriamente dito. Seu nome é geralmente
vmlinux-VERSION
(por exemplo,vmlinux-4.15.0-65-generic
). Também se pode encontrar o nomevmlinuz
em vez devmlinux
— oz
no final indica que o arquivo foi compactado. - Disco RAM inicial
-
Geralmente se chama
initrd.img-VERSION
e contém um sistema de arquivos raiz mínimo carregado em um disco RAM, contendo os utilitários e módulos de kernel necessários para que o kernel possa montar o sistema de arquivos raiz real. - Arquivos relacionados ao gerenciador de inicialização
-
Em sistemas com o GRUB instalado, eles costumam estar localizados em
/boot/grub
e incluem o arquivo de configuração (/boot/grub/grub.cfg
para o GRUB 2 ou/boot/grub/menu.lst
no caso do GRUB Legacy), módulos (em/boot/grub/i386-pc
), arquivos de tradução (em/boot/grub/locale
) e fontes (em/boot/grub/fonts
) do GRUB.
GRUB 2
Instalando o GRUB 2
O GRUB 2 pode ser instalado usando o utilitário grub-install
. Se seu sistema se recusa a inicializar, você precisará inicializá-lo usando um Live CD ou um disco de recuperação, descobrir qual é a partição de inicialização do seu sistema, montá-la e executar o utilitário.
Note
|
Para usar os comandos abaixo, é preciso estar logado como root. Se não for o caso, execute primeiro |
O primeiro disco de um sistema é geralmente o dispositivo de inicialização . Pode ser necessário saber se existe uma partição de inicialização no disco. Para isso existe o utilitário fdisk
. Para listar todas as partições no primeiro disco da sua máquina, use:
# fdisk -l /dev/sda Disk /dev/sda: 111,8 GiB, 120034123776 bytes, 234441648 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x97f8fef5 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 2000895 1998848 976M 83 Linux /dev/sda2 2002942 234440703 232437762 110,9G 5 Extended /dev/sda5 2002944 18008063 16005120 7,6G 82 Linux swap / Solaris /dev/sda6 18010112 234440703 216430592 103,2G 83 Linux
A partição de inicialização é identificada com o *
na coluna boot. No exemplo acima, ela é /dev/sda1
.
A seguir, crie um diretório temporário em /mnt
e monte a partição nele:
# mkdir /mnt/tmp # mount /dev/sda1 /mnt/tmp
Depois execute grub-install
, apontando-o para o dispositivo de inicialização (não a partição) e o diretório em que a partição de inicialização está montada. Se o sistema possuir uma partição de inicialização dedicada, o comando será:
# grub-install --boot-directory=/mnt/tmp /dev/sda
Caso esteja instalando em um sistema que não possui uma partição de inicialização, mas apenas um diretório /boot
no sistema de arquivos raiz, aponte-o em grub-install
. Nesse caso, o comando é:
# grub-install --boot-directory=/boot /dev/sda
Configurando o GRUB 2
O arquivo de configuração padrão do GRUB 2 é /boot/grub/grub.cfg
. Esse arquivo é gerado automaticamente e não se recomenda editá-lo à mão. Para fazer alterações na configuração do GRUB, é preciso editar o arquivo /etc/default/grub
e depois executar o utilitário update-grub
para gerar um arquivo compatível.
Note
|
|
Existem algumas opções no arquivo /etc/default/grub
para controlar o comportamento do GRUB 2, como o kernel padrão de inicialização, tempo limite, parâmetros extras da linha de comando, etc. Os mais importantes são:
GRUB_DEFAULT=
-
A entrada de menu padrão para a inicialização. Pode ser um valor numérico (como
0
,1
, etc.), o nome de um item de menu (comodebian
) ousaved
, que é usado em conjunto comGRUB_SAVEDEFAULT=
, explicado abaixo. Lembre-se de que as entradas de menu começam com zero, de forma que a primeira é0
, a segunda é1
e assim por diante. GRUB_SAVEDEFAULT=
-
Se esta opção estiver definida como
true
eGRUB_DEFAULT=
comosaved
, a opção padrão de inicialização sempre será a última selecionada no menu de inicialização. GRUB_TIMEOUT=
-
O tempo limite, em segundos, para que a entrada do menu padrão seja selecionada. Se definido como
0
, o sistema inicializará a entrada padrão sem exibir um menu. Se definido como-1
, o sistema aguardará até que o usuário selecione uma opção, não importa quanto tempo leve. GRUB_CMDLINE_LINUX=
-
Lista as opções de linha de comando que serão adicionadas às entradas do kernel do Linux.
GRUB_CMDLINE_LINUX_DEFAULT=
-
Por padrão, duas entradas de menu são geradas para cada kernel do Linux, uma com as opções padrão e uma entrada para recuperação. Com esta opção, você pode incluir parâmetros extras que serão adicionados apenas à entrada padrão.
GRUB_ENABLE_CRYPTODISK=
-
Se definido como
y
, comandos comogrub-mkconfig
,update-grub
egrub-install
procuram por discos criptografados e adicionam os comandos necessários para acessá-los durante a inicialização. Assim, a inicialização automática é desabilitada (GRUB_TIMEOUT=
com valor diferente de-1
) porque uma senha será exigida para descriptografar os discos antes que possam ser acessados.
Administrando as entradas de menu
Quando rodamos o update-grub
, o GRUB 2 busca por kernels e sistemas operacionais na máquina e gera as entradas de menu correspondentes no arquivo /boot/grub/grub.cfg
. É possível adicionar novas entradas manualmente aos arquivos de script dentro do diretório /etc/grub.d
.
Esses arquivos devem ser executáveis e são processados em ordem numérica pelo update-grub
. Portanto, 05_debian_theme
é processado antes de 10_linux
e assim por diante. As entradas de menu personalizadas são geralmente adicionadas ao arquivo 40_custom
.
A sintaxe básica de uma entrada de menu é mostrada abaixo:
menuentry "Default OS" { set root=(hd0,1) linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
A primeira linha sempre começa com menuentry
e termina com {
. O texto entre aspas será mostrado como o rótulo da entrada no menu de inicialização do GRUB 2.
O parâmetro set root
define o disco e a partição em que o sistema de arquivos raiz do sistema operacional está localizado. Note que no GRUB 2 os discos são numerados a partir de zero, então hd0
é o primeiro disco (sda
no Linux), hd1
o segundo e assim por diante. As partições, por sua vez, são numeradas a partir de um. No exemplo acima, o sistema de arquivos raiz está localizado no primeiro disco (hd0
), primeira partição (,1
) ou sda1
.
Em vez de especificar diretamente o dispositivo e a partição, também podemos pedir que o GRUB 2 busque por um sistema de arquivos com um rótulo ou UUID (Universally Unique Identifier) específico. Para isso, use o parâmetro search --set=root
seguido por --label
e o rótulo do sistema de arquivos a buscar, ou --fs-uuid
seguido pelo UUID do sistema de arquivos.
Use o comando abaixo para encontrar o UUID de um sistema de arquivos:
$ ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 nov 4 08:40 3e0b34e2-949c-43f2-90b0-25454ac1595d -> ../../sda5 lrwxrwxrwx 1 root root 10 nov 4 08:40 428e35ee-5ad5-4dcb-adca-539aba6c2d84 -> ../../sda6 lrwxrwxrwx 1 root root 10 nov 5 19:10 56C11DCC5D2E1334 -> ../../sdb1 lrwxrwxrwx 1 root root 10 nov 4 08:40 ae71b214-0aec-48e8-80b2-090b6986b625 -> ../../sda1
No exemplo acima, o UUID de /dev/sda1
é ae71b214-0aec-48e8-80b2-090b6986b625
. Se quisermos defini-lo como dispositivo raiz do GRUB 2, o comando seria search --set=root --fs-uuid ae71b214-0aec-48e8-80b2-090b6986b625
.
Ao usar o comando search
, é comum adicionar o parâmetro --no-floppy
para que o GRUB não perca tempo buscando em disquetes.
A linha linux
indica onde está localizado o kernel do sistema operacional (neste caso, o arquivo vmlinuz
na raiz do sistema de arquivos). Depois disso, podemos passar parâmetros na linha de comando para o kernel.
No exemplo acima, especificamos a partição root (root=/dev/sda1
) e passamos três parâmetros do kernel: a partição root deve ser montada com acesso apenas de leitura (ro
), a maioria das mensagens de log deve ser desabilitada (quiet
) e uma tela de boas-vindas deve ser exibida (splash
).
A linha initrd
indica onde está localizado o disco de RAM inicial. No exemplo acima, o arquivo é initrd.img
, localizado na raiz do sistema de arquivos.
Note
|
A maioria das distribuições Linux não coloca de fato o kernel e o initrd no diretório raiz do sistema de arquivos raiz. Em vez disso, esses são links para os arquivos reais dentro do diretório ou partição |
A última linha de uma entrada do menu deve conter apenas o caractere }
.
Interagindo com o GRUB 2
Ao inicializar um sistema com o GRUB 2 aparece um menu de opções. Use as setas do teclado para selecionar uma opção e Enter para confirmar e inicializar a entrada selecionada.
Tip
|
Se você vir apenas uma contagem regressiva, mas não um menu, pressione Shift para exibir o menu. |
Para editar uma opção, selecione-a com as setas e pressione E. Será exibida uma janela de editor com o conteúdo da menuentry
associada àquela opção, confirme definido em /boot/grub/grub.cfg
.
Depois de editar uma opção, digite Ctrl+X ou F10 para inicializar, ou ainda Esc para retornar ao menu.
Para entrar no shell do GRUB 2, pressione C na tela do menu (ou Ctrl+C) na janela de edição. Aparecerá um prompt de comando como este: grub >
Digite help
para ver uma lista de todos os comandos disponíveis ou pressione Esc para sair do shell e retornar à tela do menu.
Note
|
Lembre-se de que esse menu não aparecerá se |
Inicialização a partir do shell do GRUB 2
Podemos usar o shell do GRUB 2 para inicializar o sistema caso uma configuração incorreta em uma entrada de menu cause uma falha de inicialização.
A primeira coisa que você deve fazer é descobrir onde está a partição de inicialização. Use para isso o comando ls
, que mostra uma lista das partições e discos encontrados pelo GRUB 2.
grub> ls (proc) (hd0) (hd0,msdos1)
No exemplo acima, tudo é simples. Existe apenas um disco (hd0)
, com apenas uma partição: (hd0,msdos1)
.
Os discos e partições listados serão diferentes no seu sistema. Em nosso exemplo, a primeira partição do hd0
é chamada msdos1
porque o disco foi particionado usando o esquema de particionamento MBR. Se ele fosse particionado usando GPT, o nome seria gpt1
.
Para inicializar o Linux, precisamos de um kernel e de um disco RAM inicial (initrd). Vamos verificar o conteúdo de (hd0,msdos1)
:
grub> ls (hd0,msdos1)/ lost+found/ swapfile etc/ media/ bin/ boot/ dev/ home/ lib/ lib64/ mnt/ opt/ proc/ root/ run/ sbin/ srv/ sys/ tmp/ usr/ var/ initrd.img initrd.img.old vmlinuz cdrom/
Podemos adicionar o parâmetro -l
a ls
para obter uma lista longa, como faríamos em um terminal Linux. Use Tab para completar automaticamente os nomes de discos, partições e arquivos.
Note que temos as imagens do kernel (vmlinuz
) e initrd (initrd.img
) bem no diretório raiz. Se não, poderíamos conferir o conteúdo de /boot
com list (hd0,msdos1)/boot/
.
Agora, defina a partição de inicialização:
grub> set root=(hd0,msdos1)
Carregue o kernel do Linux com o comando linux
, seguido pelo caminho para o kernel e pela opção root=
para informar ao kernel onde está localizado o sistema de arquivos raiz do sistema operacional.
grub> linux /vmlinuz root=/dev/sda1
Carregue o disco RAM inicial com initrd
, seguido pelo caminho completo para o arquivo initrd.img
:
grub> initrd /initrd.img
Agora, inicialize o sistema com boot
.
Inicializando com o shell de resgate
No caso de uma falha na inicialização, o GRUB 2 pode carregar um shell de resgate, uma versão simplificada do shell que mencionamos anteriormente. Você o reconhecerá pelo prompt de comando, que é exibido como grub rescue>
.
O processo para inicializar um sistema a partir deste shell é quase idêntico ao mostrado anteriormente. No entanto, será preciso carregar alguns módulos do GRUB 2 para fazer as coisas funcionarem.
Depois de descobrir qual é a partição de inicialização (com ls
, como mostrado anteriormente), use o comando set prefix=
, seguido pelo caminho completo para o diretório que contém os arquivos do GRUB 2 — geralmente /boot/grub
. No nosso exemplo:
grub rescue> set prefix=(hd0,msdos1)/boot/grub
Em seguida, carregue os módulos normal
e linux
com o comando insmod
:
grub rescue> insmod normal grub rescue> insmod linux
A seguir, defina a partição de inicialização com set root=
como ensinado anteriormente, carregue o kernel do linux (com linux
), o disco RAM inicial (initrd
) e tente inicializar com boot
.
GRUB Legacy
Instalando o GRUB Legacy a partir de um sistema em execução
Para instalar o GRUB Legacy em um disco a partir de um sistema em execução, empregaremos o utilitário grub-install
. O comando básico é grub-install DEVICE
, onde DEVICE
é o disco no qual você deseja instalar o GRUB Legacy. Um exemplo seria /dev/sda
.
# grub-install /dev/sda
Note que é preciso especificar o dispositivo no qual o GRUB Legacy será instalado, como /dev/sda/
, não a partição como em /dev/sda1
.
Por padrão, o GRUB copia os arquivos necessários para o diretório /boot
no dispositivo especificado. Se você deseja copiá-los para outro diretório, use o parâmetro --boot-directory=
seguido pelo caminho completo para o local onde os arquivos devem ser copiados.
Instalando o GRUB Legacy a partir de um shell do GRUB
Se você não conseguir inicializar o sistema por algum motivo e precisar reinstalar o GRUB Legacy, poderá fazê-lo no shell do GRUB em um disco de inicialização do GRUB Legacy.
No shell do GRUB (digite c
no menu de inicialização para acessar o prompt grub>
), o primeiro passo é configurar o dispositivo de inicialização, que contém o diretório /boot
. Por exemplo, se esse diretório estiver na primeira partição do primeiro disco, o comando seria:
grub> root (hd0,0)
Se você não souber qual dispositivo contém o diretório /boot
, peça ao GRUB para procurá-lo com o comando find
, como abaixo:
grub> find /boot/grub/stage1 (hd0,0)
Em seguida, defina a partição de inicialização conforme as instruções acima e use o comando setup
para instalar o GRUB Legacy no MBR e copiar os arquivos necessários no disco:
grub> setup (hd0)
Ao final, reinicie o sistema e ele deverá inicializar normalmente.
Definindo entradas e configurações do menu do GRUB Legacy
As entradas de menu e configurações do GRUB Legacy são armazenadas no arquivo /boot/grub/menu.lst
. Trata-se de uma lista de comandos e parâmetros em um arquivo de texto simples, que pode ser editado diretamente em seu editor de texto predileto.
As linhas que começam com #
são consideradas comentários e as linhas em branco são ignoradas.
Uma entrada de menu possui ao menos três comandos. O primeiro, title
, define o título do sistema operacional na tela do menu. O segundo, root
, informa ao GRUB Legacy qual o dispositivo ou partição de inicialização.
A terceira entrada, kernel
, especifica o caminho completo para a imagem do kernel que deve ser carregada quando a entrada correspondente for selecionada. Observe que esse caminho é relativo ao dispositivo especificado no parâmetro root
.
Veja um exemplo simples a seguir:
# This line is a comment title My Linux Distribution root (hd0,0) kernel /vmlinuz root=/dev/hda1
Ao contrário do GRUB 2, no GRUB Legacy tanto as partições quanto os discos são numerados a partir de zero. Portanto, o comando root (hd0,0)
define a partição de inicialização como a primeira partição (0
) do primeiro disco (hd0
).
Podemos omitir a instrução root
se especificarmos o dispositivo de inicialização antes do caminho no comando kernel
. A sintaxe é a mesma, portanto:
kernel (hd0,0)/vmlinuz root=dev/hda1
equivale a:
root (hd0,0) kernel /vmlinuz root=/dev/hda1
Ambos carregam o arquivo vmlinuz
a partir do diretório root (/
) da primeira partição do primeiro disco (hd0,0
).
O parâmetro root=/dev/hda1
após o comando kernel
informa ao kernel do Linux qual partição deve ser usada como sistema de arquivos raiz. Este é um parâmetro do kernel do Linux, não um comando do GRUB Legacy.
Note
|
Para saber mais sobre os parâmetros do kernel, visite https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html. |
Pode ser necessário especificar o local da imagem inicial do disco RAM para o sistema operacional com o parâmetro initrd
. O caminho completo para o arquivo pode ser especificado como no parâmetro kernel
, mas também é possível especificar um dispositivo ou partição antes do caminho, como por exemplo:
# This line is a comment title My Linux Distribution root (hd0,0) kernel /vmlinuz root=/dev/hda1 initrd /initrd.img
O GRUB Legacy tem um design modular, no qual módulos (geralmente armazenados como arquivos .mod
em /boot/grub/i386-pc
) podem ser carregados para adicionar recursos extras, como suporte a hardware incomum, sistemas de arquivos ou novos algoritmos de compactação.
Os módulos são carregados usando o comando module
, seguido pelo caminho completo para o arquivo .mod
correspondente. Lembre-se de que, como no caso dos kernels e imagens initrd, esse caminho é relativo ao dispositivo especificado no comando root
.
O exemplo abaixo carrega o módulo 915resolution
, necessário para definir corretamente a resolução da memória de imagens (frame buffer) em sistemas com chipsets de vídeo das séries Intel 800 ou 900.
module /boot/grub/i386-pc/915resolution.mod
Carregamento em cadeia de outros sistemas operacionais
O GRUB Legacy pode ser usado para carregar sistemas operacionais não suportados, como o Windows, usando um processo chamado de carregamento em cadeia (chainloading). O GRUB Legacy é carregado primeiro e, quando a opção correspondente é selecionada, o gerenciador de inicialização do sistema desejado é carregado.
Uma entrada típica para o carregamento em cadeia do Windows seria semelhante a esta:
# Load Windows title Windows XP root (hd0,1) makeactive chainload +1 boot
Vamos esclarecer cada parâmetro. Como anteriormente, root (hd0,1)
especifica o dispositivo e a partição em que o gerenciador de inicialização do sistema operacional que queremos carregar está localizado. Neste exemplo, a segunda partição do primeiro disco.
makeactive
-
define um sinalizador indicando que esta é uma partição ativa. Funciona apenas em partições primárias do DOS.
chainload +1
-
diz ao GRUB para carregar o primeiro setor da partição de inicialização. É nela que costumam ficar os gerenciadores de inicialização.
boot
-
executa o gerenciador de inicialização e carrega o sistema operacional correspondente.
Exercícios Guiados
-
Qual é o local padrão do arquivo de configuração do GRUB 2?
-
Quais são as etapas necessárias para alterar as configurações do GRUB 2?
-
Em qual arquivo devem ser adicionadas as entradas de menu personalizadas do GRUB 2?
-
Onde são armazenadas as entradas de menu do GRUB Legacy?
-
Como podemos entrar no shell do GRUB a partir de um menu do GRUB 2 ou GRUB Legacy?
Exercícios Exploratórios
-
Imagine um usuário configurando o GRUB Legacy para inicializar a partir da segunda partição do primeiro disco. Ele escreve a seguinte entrada de menu personalizada:
title My Linux Distro root (hd0,2) kernel /vmlinuz root=/dev/hda1 initrd /initrd.img
No entanto, o sistema não inicializa. O que está errado?
-
Imagine que você tenha um disco identificado como
/dev/sda
com diversas partições. Que comando pode ser usado para descobrir qual a partição de inicialização em um sistema? -
Qual o comando para descobrir o UUID de uma partição?
-
Considere a seguinte entrada para o GRUB 2
menuentry "Default OS" { set root=(hd0,1) linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
Altere-a para que o sistema inicialize a partir de um disco com o UUID
5dda0af3-c995-481a-a6f3-46dcd3b6998d
-
Como configurar o GRUB 2 para aguardar 10 segundos antes de inicializar a entrada de menu padrão?
-
Em um shell do GRUB Legacy, quais são os comandos para instalar o GRUB na primeira partição do segundo disco?
Resumo
Nesta lição aprendemos
-
O que é um carregador de inicialização.
-
As diferenças entre o GRUB Legacy e o GRUB 2.
-
O que é uma partição de inicialização e qual seu conteúdo.
-
Como instalar o GRUB Legacy e o GRUB 2.
-
Como configurar o GRUB Legacy e o GRUB 2.
-
Como adicionar entradas de menu personalizadas ao GRUB Legacy e ao GRUB 2.
-
Como interagir com a tela de menu e o console do GRUB Legacy e do GRUB 2.
-
Como inicializar um sistema a partir de um shell do GRUB Legacy, do GRUB 2 ou do shell de resgate.
Os seguintes comandos foram abordados nesta lição:
-
grub-install
-
update-grub
-
grub-mkconfig
Respostas aos Exercícios Guiados
-
Qual é o local padrão do arquivo de configuração do GRUB 2?
/boot/grub/grub.cfg
-
Quais são as etapas necessárias para alterar as configurações do GRUB 2?
Efetuar as alterações no arquivo
/etc/default/grub
, depois atualizar a configuração comupdate-grub
. -
Em qual arquivo devem ser adicionadas as entradas de menu personalizadas do GRUB 2?
/etc/grub.d/40_custom
-
Onde são armazenadas as entradas de menu do GRUB Legacy?
/boot/grub/menu.lst
-
Como podemos entrar no shell do GRUB a partir de um menu do GRUB 2 ou GRUB Legacy?
Pressionando
c
na tela de menu.
Respostas aos Exercícios Exploratórios
-
Imagine um usuário configurando o GRUB Legacy para inicializar a partir da segunda partição do primeiro disco. Ele escreve a seguinte entrada de menu personalizada:
title My Linux Distro root (hd0,2) kernel /vmlinuz root=/dev/hda1 initrd /initrd.img
No entanto, o sistema não inicializa. O que está errado?
A partição de inicialização está incorreta. Lembre-se de que, ao contrário do GRUB 2, o GRUB Legacy conta as partições a partir de zero. Portanto, o comando correto para a segunda partição do primeiro disco seria
root (hd0,1)
. -
Imagine que você tenha um disco identificado como
/dev/sda
com diversas partições. Que comando pode ser usado para descobrir qual a partição de inicialização em um sistema?Use
fdisk -l /dev/sda
. A partição de inicialização estará marcada na lista com um asterisco (*
). -
Qual o comando para descobrir o UUID de uma partição?
Use
ls -la /dev/disk/by-uuid/
e procure pelo UUID que aponta para a partição. -
Considere a seguinte entrada para o GRUB 2
menuentry "Default OS" { set root=(hd0,1) linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
Altere-a para que o sistema inicialize a partir de um disco com o UUID
5dda0af3-c995-481a-a6f3-46dcd3b6998d
Será preciso alterar a declaração
set root
. Em vez de especificar um disco e uma partição, diga ao GRUB para buscar pela partição com o UUID desejado.menuentry "Default OS" { search --set=root --fs-uuid 5dda0af3-c995-481a-a6f3-46dcd3b6998d linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
-
Como configurar o GRUB 2 para aguardar 10 segundos antes de inicializar a entrada de menu padrão?
Adicionando o parâmetro
GRUB_TIMEOUT=10
a/etc/default/grub
. -
Em um shell do GRUB Legacy, quais são os comandos para instalar o GRUB na primeira partição do segundo disco?
grub> root (hd1,0) grub> setup (hd1)