Aprenda Linux, 101: Inicialize o sistema

Vá do BIOS para a execução do sistema Linux

Aprenda a guiar seu sistema Linux pelo processo de boot. É possível usar o material neste artigo para estudar para o exame LPI 101 de certificação de administrador do sistema Linux, ou apenas para aprender sobre o processo de boot.

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields trabalha em vários projetos de Linux para a zona Linux do developerWorks. É programador senior da IBM no Research Triangle Park, NC. Passou a fazer parte da IBM em Canberra, na Austrália em 1973 como engenheiro de sistemas e, desde então, vem trabalhando em sistemas de comunicações e computação disseminada em Montreal, Canadá, e em RTP, NC. Possui várias patentes e publicou vários trabalhos. Possui diploma universitário em matemática pura e filosofia pela Universidade Nacional Australiana. É mestre e Ph. D. em ciência da computação pela Universidade Estadual da Carolina do Norte. Saiba mais no perfil do Ian no My developerWorks.



06/Out/2011

Sobre esta série

Esta série de artigos ajuda você a aprender as tarefas de administração de sistema Linux. Também é possível usar o material desses artigos para se preparar para os exames da Linux Professional Institute Certification nível 1 (LPIC-1).

Consulte o roteiro do developerWorks para LPIC-1 para ver uma descrição de cada artigo da série e um link para cada um desses artigos. O roteiro está em andamento e reflete os mais recentes (abril de 2009) objetivos para os exames LPIC-1: à medida que concluímos os artigos, os adicionamos ao roteiro. Enquanto isso, é possível encontrar versões anteriores de material similar, que suporta os objetivos anteriores do LPIC-1 antes de abril de 2009, em nossos tutoriais anteriores de preparação para o exame de certificação LPI.

Visão geral

Este artigo o ajudará a entender a sequência de boot a partir do BIOS para a conclusão da inicialização e mostrará como:

  • Fornecer comandos comuns para o carregador de boot
  • Fornecer opções ao kernel no tempo de boot
  • Verificar eventos de boot nos arquivos de log

Alguns aspectos do processo de boot são comuns à maioria dos sistemas, mas alguns aspectos relacionados a hardware são específicos a uma arquitetura em particular. O material neste artigo é direcionado especificamente para sistemas de arquitetura x86 e x86_64 usando BIOS para inicializar o sistema. Um sistema mais novo usando a Extensible Firmware Interface (ou EFI) e a GUID Partition Table (GPT) está ganhando popularidade para unidades maiores que 2TB de tamanho. Isso atualmente não é parte dos objetivos de LPI e não é coberto neste artigo. Consulte os Recursos para obter mais informações.

A menos que de outra forma observado, os exemplos neste artigo geralmente usam Fedora 14, com um kernel 2.6.35. Os resultados em outros sistemas podem variar.

Este artigo o ajuda a se preparar para o Objective 101.2 do Tópico 101 do exame 101 do Linux Professional Institute's Junior Level Administration (LPIC-1). O objetivo tem um peso 3.

Pré-requisitos

Comunique-se com o Ian

Ian é um dos nossos autores mais populares e prolíficos. Navegue na todos os artigos do Ian no developerWorks. Confira perfil do Ian e entre em contato com ele e com outros autores e leitores no My developerWorks.

Para aproveitar ao máximo os artigos nesta série, é necessário ter um conhecimento básico de Linux e um sistema Linux funcional no qual você possa praticar os comandos descritos neste artigo. Às vezes, versões diferentes de um programa formatam a saída de forma diferente; portanto, os seus resultados podem não ser exatamente iguais às listagens e figuras mostradas aqui. Em particular, as configurações do BIOS variam muito entre os sistemas, e as telas iniciais do carregador de boot variam muito entre as distribuições.

Você também deve estar familiarizado com o material no nosso artigo, Aprenda Linux 101: Layout do disco rígido."


Sequência de boot

Antes de começarmos a falar de carregadores de boot, como LILO e GRUB, vamos revisar como um PC inicia ou inicializa. Código chamado BIOS (para Basic Input Output Service) é armazenado em uma memória não volátil, como ROM, EEPROM ou flash. Quando o PC é ligado ou reinicializado, esse código é executado e realiza um power-on self test (POST) para verificar a máquina. Ele também determinar a unidade de boot a partir dos dispositivos de armazenamento removíveis ou fixos disponíveis e carrega o primeiro setor do Master Boot Record (MBR) nessa unidade. A unidade pode ser um disco rígido tradicional, uma unidade de estado sólido, um dispositivo USB ou pen-drive ou uma unidade com mídia removível, como disquete, CD ou DVD. Para o restante deste artigo, focaremos em discos rígidos, mas o processo é similar para os outros tipos de dispositivos de armazenamento.

Conforme discutido no artigo "Aprenda Linux 101: Layout do disco rígido," o MBR também contém a tabela de partição, então a quantidade de código executável no MBR é inferior a 512 bytes, o que não é muito código. Observe que todos os discos, mesmo um disquete, CD ou DVD, ou dispositivo de estado sólido, como um pen-drive, contém código executável no seu MBR, mesmo se o código for apenas suficiente para enviar uma mensagem como "Disco não inicializável na unidade A:". Esse código carregado pelo BIOS a partir do primeiro setor é chamado de carregador de boot de primeiro estágio ou carregador de boot de estágio 1.

A unidade de disco rígido padrão MBR usada pelos sistemas operacionais MS DOS, PC DOS e Windows® verifica a tabela de partição para encontrar uma partição primária no disco de boot que esteja marcado como ativo, carrega o primeiro setor dessa partição e passa o controle para início do código carregado. Essa nova parte do código também é conhecida como registro de boot de partição. O registro de boot de partição é na verdade outro carregador de boot de estágio 1, mas este tem inteligência apenas suficiente para carregar um conjunto de blocos da partição. O código nesse novo conjunto de blocos é chamado de carregador de boot de estágio 2. Conforme usado pelo MS-DOS e pelo PC-DOS, o carregador de estágio 2 segue diretamente para carregar o restante do sistema operacional. É assim que seu sistema operacional inicia-se por sua autoinicialização até que esteja ativo e operando.

Isso funciona bem para um sistema com um único sistema operacional. O que acontece quando deseja ter vários sistemas operacionais, digamos OS/2, Windows XP e três distribuições diferentes do Linux? Você poderia usa algum programa (como o programa DOS FDISK) para alterar a partição ativa e reinicializar. Isso é complicado. Além disso, um disco pode ter apenas quatro partições primárias, e o MBR padrão pode ter apenas uma partição primária ativa; não pode inicializar a partir de uma partição lógica. Mas nosso exemplo hipotético citou cinco sistemas operacionais, cada um deles precisando de uma partição. Oops!

A solução está em usar algum código especial que permita ao usuário escolher qual sistema operacional inicializar. Exemplos incluem:

Loadlin
Um programa executável do DOS que é chamado a partir de um sistema DOS em execução para inicializar uma partição do Linux. Isso era popular ao configurar um sistema de diversas inicializações era um processo complexo e arriscado.
Gerenciador de boot OS/2
Um programa instalado em uma pequena partição dedicada. A partição está marcada como ativa, e o processo padrão de boot MBR inicia o Gerenciador de Boot OS/2, que apresenta um menu que permite escolher qual sistema operacional inicializar.
Um carregador de boot inteligente
Um programa que pode residir em uma partição do sistema operacional e é chamado pelo registro de boot da partição de uma partição ativa ou pelo registro de boot mestre. Exemplos incluem:
  • BootMagic, parte do Norton PartitionMagic
  • LILO, o LInux LOader
  • GRUB, o carregador GRand Unified Boot (agora referido como GRUB Legacy)
  • GRUB2, um novo carregador de boot que está começando a aparecer em distribuições comuns

Evidentemente, se você puder passar o controle do sistema para algum programa que tenha mais de 512 bytes de código para realizar sua tarefa, então não é difícil demais permitir a inicialização de partições lógicas, ou inicialização de partições que não estão na unidade de boot. Todas essas soluções permitem essas possibilidades, seja porque podem carregar um registro de boot a partir de uma partição arbitrária ou porque têm algum entendimento de que arquivo ou arquivos carregar para iniciar o processo de boot.

Carregamento da cadeia

Quando um gerenciador de boot obtém controle, uma coisa que pode carregar é outro gerenciador de boot. Isso é chamado de carregamento em cadeia, e ocorre com mais frequência quando o gerenciador de boot que está localizado no master boot record (MBR) carrega o carregador de boot que está em um registro de boot da partição. Isso é quase sempre feito quando o carregador de boot do Linux é solicitado a inicializar uma partição do Windows ou DOS, mas também pode ser feito quando o carregador de boot do Linux para um sistema for solicitado a carregar o carregador de boot para outro sistema. Por exemplo, é possível usar LILO em uma partição para fazer o carregamento em cadeia de GRUB em outra partição para acessar o menu GRUB para essa partição.

Carregadores de boot do Linux

A partir daqui, focaremos no LILO e no GRUB, uma vez que são os carregadores de boot incluídos na maioria das distribuições do Linux. O LILO é usado há algum tempo. O GRUB é mais novo. O GRUB original agora se tornou o GRUB Legacy, e o GRUB2 está sendo desenvolvido sob a orientação da Free Software Foundation (consulte os Recursos para ver os detalhes). Discutiremos o GRUB2 brevemente para mostrar as principais diferentes e como o GRUB e o GRUB2 podem coexistir. Para o restante deste artigo, presumimos que GRUB significa GRUB Legacy, a menos que o contexto especificamente implique GRUB2. Uma nova versão do LILO, chamada ELILO (que é designada para sistemas de inicialização que usam a Extensible Firmware Interfaceou EFI da Intel, em vez de BIOS) também está disponível. Consulte os Recursos para saber mais sobre GRUB2 e ELILO.

O processo de instalação para a sua distribuição provavelmente fornecerá uma opção de definir qual carregador de boot configurar. GRUB ou LILO funcionarão com a maioria dos discos modernos sob 2TB de tamanho, embora algumas distribuições, principalmente Fedora, não enviem mais LILO. Lembre-se de que a tecnologia de disco avançou rapidamente, então você deve sempre garantir que seu carregador de boot escolhido, bem como sua distribuição do Linux escolhida (ou outro sistema operacional), assim como o BIOS do sistema, funcionem com seu disco novo. Falha em fazer isso pode resultar em perda de dados. Da mesma forma, se estiver adicionando uma nova distribuição a um sistema existente, pode precisar garantir que tenha o último LILO ou GRUB no seu MBR. Também precisará de uma versão razoavelmente mais nova do GRUB ou LILO se planejar inicializar a partir de um disco LVM ou RAID.

Os carregadores de estágio 2 usados em LILO e GRUB permitem escolher entre vários sistemas operacionais ou versões para carregar. Entretanto, o LILO e o GRUB diferem significativamente no sentido de que uma mudança no sistema exige que você use um comando para recriar a configuração de boot do LILO sempre que atualizar um kernel ou tiver certas outras mudanças no seu sistema, enquanto o GRUB pode fazer isso através de um arquivo de texto de configuração que pode ser editado. O GRUB2 também requer uma recriação a partir de um arquivo de configuração que normalmente é armazenado em /etc.

Para resumir o processo de boot para PCs:

  1. Quando um PC é ligado, o BIOS (Basic Input Output Service) realiza um autoteste.
  2. Quando a máquina é aprovada no autoteste, o BIOS carrega o Master Boot Record (ou MBR, normalmente a partir do primeiro setor de 512 bytes da unidade de boot). A unidade de boot normalmente é o primeiro disco rígido no sistema, mas também pode ser um disquete, CD ou chave USB.
  3. Para uma unidade de disco rígido, o MBR carrega um carregador de boot de estágio 1, que normalmente também é um carregador de boot de estágio 1 LILO ou GRUB em um sistema Linux. Esse é outro registro de setor único de 512 bytes.
  4. O carregador de boot de estágio 1 normalmente carrega uma sequência de registros chamada de carregador de boot de estágio 2 (ou às vezes o carregador de estágio 1.5).
  5. O carregador de estágio 2 carrega o sistema operacional. Para Linux, esse é o kernel e possivelmente um disco RAM inicial (initrd).

Seu sistema deve poder instalar qualquer um dos carregadores de boot mais populares LILO (o LInux LOader) ou GRUB (o carregador GRand Unified Boot). Deve ser possível usar o carregador de boot escolhido para inicializar normalmente conforme descrito acima. Consulte o artigo relacionado "Aprenda Linux, 101: Gerenciadores de boot" se precisar revisar a instalação do carregador de boot ou a inicialização básica.

Para influenciar o processo de boot do sistema, é possível:

  1. Altere o dispositivo a partir do qual você inicializa. Normalmente é possível inicializar a partir de uma unidade de disco rígido, mas às vezes pode ser necessário inicializar a partir de um disquete, um memory key USB ou uma rede. Configurar esses dispositivos de boot alternativos exige que seu BIOS esteja configurado adequadamente e pode exigir um pressionamento de tecla em particular durante o boot para exibir as opções. As opções em um dos meus sistemas estão ilustradas na Figura 1. O método para configurar os dispositivos de boot e selecionar um dispositivo de boot na inicialização é específico para o sistema e o BIOS do sistema. Também está além do escopo dos requisitos dos objetivos desta LPI, então consulte a documentação do sistema.
    Figura 1. Escolhendo um dispositivo de boot
    Escolhendo um dispositivo de boot
  2. É possível interagir com o carregador de boot para selecionar qual de várias configurações possíveis inicializar. Você aprenderá como fazer isso tanto para LILO quanto para GRUB neste artigo.
  3. É possível usar GRUB ou LILO para enviar parâmetros para o kernel para controlar a maneira como seu kernel inicia o sistema quando ele foi carregado pelo carregador de boot.

LILO

O arquivo de configuração do LILO assume como padrão /etc/lilo.conf. Lista 1 mostra um exemplo de um sistema que está executando no momento Slackware em /dev/sda10, Windows em /dev/sda1 e Fedora 14 em /dev/sdb12. Os exemplos foram desenvolvidos usando /sbin/liloconfig .

Lista 1. Configuração LILO de amostra
# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
lba32 # Allow booting past 1024th cylinder with a recent BIOS
boot = /dev/root
#compact # faster, but won't work on all systems.
# Boot BMP Image.
# Bitmap in BMP format: 640x480x8
bitmap = /boot/slack.bmp
# Menu colors (foreground, background, shadow, highlighted
# foreground, highlighted background, highlighted shadow):
bmp-colors = 255,0,255,0,255,0
# Location of the option table: location x, location y, number of
# columns, lines per column (max 15), "spill" (this is how many
# entries must be in the first column before the next begins to
# be used. We don't specify it here, as there's just one column.
bmp-table = 60,6,1,16
# Timer location x, timer location y, foreground color,
# background color, shadow color.
bmp-timer = 65,27,0,255
# Standard menu.
# Or, you can comment out the bitmap menu above and
# use a boot message with the standard menu:
#message = /boot/boot_message.txt

# Append any additional kernel parameters:
append=" vt.default_utf8=0"
prompt
timeout = 300
# Normal VGA console
vga = normal
# VESA framebuffer console @ 1024x768x64k
# vga=791
# VESA framebuffer console @ 1024x768x32k
# vga=790
# VESA framebuffer console @ 1024x768x256
# vga=773
# VESA framebuffer console @ 800x600x64k
# vga=788
# VESA framebuffer console @ 800x600x32k
# vga=787
# VESA framebuffer console @ 800x600x256
# vga=771
# VESA framebuffer console @ 640x480x64k
# vga=785
# VESA framebuffer console @ 640x480x32k
# vga=784
# VESA framebuffer console @ 640x480x256
# vga=769
# ramdisk = 0 # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /boot/vmlinuz
root = /dev/sda10
label = Slackware13
read-only # Partitions should be mounted read-only for checking
# Linux bootable partition config ends
# Windows bootable partition config begins
other = /dev/sda1
label = Windows
table = /dev/sda
# Windows bootable partition config ends
# Linux bootable partition config begins
image = /boot/vmlinuz
root = /dev/sdb13
label = Fedora14
read-only # Partitions should be mounted read-only for checking
# Linux bootable partition config ends

O arquivo de configuração em Lista 1 contém o conjunto de parâmetros bitmap para /boot/slack.bmp. Essa é uma imagem bitmap que será exibida em vez do prompt de texto LILO mais tradicional, como mostrado em Figura 2. A imagem de boot padrão, Slackware13, é realçada e as outras duas, Windows e Fedora14, são mostradas abaixo. Use as teclas de cursor para selecionar uma imagem de boot e então pressione Enter para inicializar essa escolha. E o tempo limite no arquivo de configuração não for 0, o sistema aguardará tal número em décimos de segundo, 300 décimos ou 30 segundos, no nosso exemplo, e então inicializará a opção selecionada.

Figura 2. Tela de boot do LILO Slackware 13
Tela de boot do LILO Slackware 13

Usando um prompt de texto

No exemplo acima, usamos um bipmap para exibir as opções de boot. O prompt de boot LILO tradicional foi um prompt de texto muito resumido similar ao que se vê ao pressionar Tab . É possível digitar o nome de uma distribuição para inicializar ou pressionar Enter para inicializar a primeira. Isso está ilustrado na Lista 2 e Figura 3.

Lista 2. Prompt de texto básico do LILO
Boot de Slackware13      Windows         Fedora14:
Figura 3. Prompt de texto básico do LILO
Prompt de texto básico do LILO

Em vez do prompt gráfico, é possível obter um prompt de texto comentando as entradas bitmap e bmpxxx e removendo o comentário do parâmetro message para que aponte para um arquivo contendo a mensagem de texto que você gostaria de exibir. O prompt de texto não é mais resumido e agora usa a biblioteca de curses para exibir suas escolhas. É possível digitar parâmetros como antes. Na Figura 4, nosso arquivo de mensagem contém o texto "Booting pinguino >>>", e novamente inicializamos para o modo de um único usuário usando S .

Figura 4. Tela de boot de texto (curses) do LILO Slackware 13
Tela de boot de texto (curses) do LILO Slackware 13

Observação: Pode ser necessário segurar a tecla Shift durante o boot para ver o prompt, uma vez que o sistema pode ser configurado de modo que efetue o bypass do prompt.

O comando lilo

Lembre-se de que sempre que fizer alterações a /etc/lilo.conf, ou sempre que instalar um novo kernel, você deve executar lilo. O programa lilo regrava o MBR ou o registro de boot da partição para refletir suas alterações, incluindo o registro do local do disco absoluto do kernel. Se seu arquivo de configuração incluir imagens Linux de várias partições, é preciso montar as partições, porque o comando lilo precisa acessar a partição para localizar a imagem.

Além de exibir o arquivo de configuração LILO, é preciso usar a opção -q do comando lilo para exibir informações sobre as opções de boot do LILO. Adicione as opções -v para uma saída mais detalhada. Dois exemplos usando o arquivo de configuração gráfica de Lista 1 e o arquivo de configuração de texto usado em Figura 4 são mostrados em Lista 3.

Lista 3. Exibindo a configuração LILO
root@echidna:~# lilo -q -C /etc/lilo-graphic.conf
Slackware13     *
Windows
Fedora14

root@echidna:~# lilo -q -v -C /etc/lilo-text.conf
LILO version 22.8, Copyright (C) 1992-1998 Werner Almesberger
Development beyond version 21 Copyright (C) 1999-2006 John Coffman
Released 19-Feb-2007 and compiled at 20:09:28 on Feb 14 2010

Reading boot sector from /dev/root
Installed:  Tue Sep  6 15:51:49 2011

Global settings:
  Delay before booting: 0.0 seconds
  Command-line timeout: 30.0 seconds
  No unattended booting
  No PC/AT keyboard hardware presence check
  Always enter boot prompt
  Boot-time BIOS data saved
  Boot-time BIOS data auto-suppress write bypassed
  Large memory (>15M) is NOT used to load initial ramdisk
  Non-RAID installation
  Boot device will not be used for the Map file
  Serial line access is disabled
  Boot prompt message is 1083 bytes
  No default boot command line
Images:
  Slackware13     *
    No password
    Boot command-line won't be locked
    No single-key activation
    VGA mode: NORMAL
    Kernel is loaded "high"
    No initial RAM disk
    No fallback
    Options: "ro root=80a  vt.default_utf8=0"
  Windows
    No password
    Boot command-line won't be locked
    No single-key activation
    No fallback
    No options
  Fedora14
    No password
    Boot command-line won't be locked
    No single-key activation
    VGA mode: NORMAL
    Kernel is loaded "high"
    No initial RAM disk
    No fallback
    Options: "ro root=81d  vt.default_utf8=0"

Carregamento em cadeia com LILO

Você pode ter observado que a definição de partição para Windows mostra o dispositivo (/dev/sda1), enquanto as definições de partição Slackware e Fedora mostram uma imagem de inicialização na partição raiz, /dev/sda10 and /dev/sdb13, respectivamente. Para sistemas em que posso ter várias partições inicializáveis, frequentemente configuro uma pequena partição contendo GRUB, que pode inicializar a partir de qualquer uma das outras partições, normalmente por carregamento em cadeia, mas por outros meios quando, por exemplo, o sistema na partição usa um carregador de boot como GRUB2. Uma vez que a partição executa GRUB Legacy, ela pode ser carregada em cadeia. Para adicionar uma entrada LILO para carregamento em cadeia de outra partição, como esta partição GRUB, é possível adicionar uma entrada como aquela em Lista 4.

Lista 4. Adicionando uma partição para GRUB de carregamento em cadeia
# Linux bootable partition config begins
other = /dev/sda2
  label = GRUB
# Linux bootable partition config ends

GRUB

O arquivo de configuração GRUB assume como padrão /boot/grub/grub.conf ou /boot/grub/menu.lst. Se ambos estiverem presentes, um normalmente será um link simbólico para o outro. Lista 5 mostra um exemplo do mesmo sistema que você viu acima para LILO. Observe que dividimos as três instruções de definição de kernel em várias linhas para facilitar a leitura.

Lista 5. Configuração GRUB de amostra
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd1,12)
#          kernel /boot/vmlinuz-version ro root=/dev/sdb13
#          initrd /boot/initrd-[generic-]version.img
#boot=/dev/sdb13
default=0
timeout=5
splashimage=(hd1,12)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.35.14-95.fc14.x86_64)
        root (hd1,12)
        kernel /boot/vmlinuz-2.6.35.14-95.fc14.x86_64 ro 
            root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a 
            rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM 
            LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 
            KEYTABLE=us rhgb quiet
        initrd /boot/initramfs-2.6.35.14-95.fc14.x86_64.img
title Fedora (2.6.35.13-92.fc14.x86_64)
        root (hd1,12)
        kernel /boot/vmlinuz-2.6.35.13-92.fc14.x86_64 ro 
            root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a 
            rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM 
            LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 
            KEYTABLE=us rhgb quiet
        initrd /boot/initramfs-2.6.35.13-92.fc14.x86_64.img
title Fedora (2.6.35.13-91.fc14.x86_64)
        root (hd1,12)
        kernel /boot/vmlinuz-2.6.35.13-91.fc14.x86_64 ro 
            root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a 
            rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM 
            LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 
            KEYTABLE=us rhgb quiet
        initrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.img
title GRUB
        rootnoverify (hd0,1)
        chainloader +1
title Slackware 13
        rootnoverify (hd0,9)
        chainloader +1
title Windows
        rootnoverify (hd0,0)
        chainloader +1

GRUB fornece uma interface de menu. Também pode usar uma senha criptografada com o algoritmo MD5 em oposição à senha de texto simples do LILO. E, talvez mais importante, alterações feitas ao arquivo de configuração GRUB não exigem que o GRUB seja reinstalado no MBR. Observe que muitas distribuições automaticamente atualizam o arquivo de configuração GRUB (ou LILO) ao atualizar para um novo nível de kernel, mas se você mesmo instalar um novo kernel ou criar um novo disco RAM inicial, pode ser preciso editar o arquivo de configuração.

O GRUB também não exige que uma partição seja montada para configurar uma entrada de boot para ele. Você observará entradas como raiz (hd0,9) e splashimage=(hd1,12)/boot/grub/splash.xpm.gz. O GRUB refere-se aos seus discos rígidos como hd n, em que n é um número inteiro iniciando em 0. De maneira similar, as partições em um disco são numeradas iniciando em 0. Observação: O GRUB2 mudou a maneira como os discos são nomeados, então tenha cuidado se estiver trocando entre GRUB e GRUB2.

Assim, nesse sistema, (hd0,0) representa a partição primária do Windows /dev/sda1, enquanto (hd0,9) representa a partição lógica Slackware /dev/sda10. Um disquete normalmente é (fd0). Lembre-se de colocar entre aspas se estiver chamando GRUB com parâmetros de um bash shell, por exemplo, ao instalar GRUB em um disquete, chave USB ou seu MBR.

Versões mais novas do GRUB permitem usar um rótulo ou UUID para especificar a raiz . Consulte a seção sobre "Rótulos, UUIDs e links" no artigo relacionado. Aprenda Linux, 101: Controle de montagem e desmontagem de sistemas de arquivos nessa série para mais detalhes sobre rótulos e UUIDs.

Quando inicializar um sistema com GRUB, frequentemente verá uma opção padrão apresentada, conforme ilustrado na Figura 5. Se nada for feito, será inicializado após um tempo limite configurado. O tempo limite é especificado em segundos, então timeout=5 na Lista 5 significa um tempo limite de 5 segundos.

Figura 5. Inicializando GRUB para uma opção padrão
Inicializando GRUB para uma opção padrão

Se você pressionar uma tecla para interromper o boot padrão, verá um menu de opções similares àquelas na Figura 6.

Figura 6. Opções do menu do GRUB
Opções do menu do GRUB

Quando o menu GRUB é exibido, você seleciona uma imagem de boot usando as teclas de movimento do cursor para subir e descer na lista.

Planos de fundo personalizados

Se desejar uma imagem inicial diferente para GRUB, está limitado a um arquivo X Window pixmap (.xpm) de 14 cores que deve ser gzipped. Sua imagem JPEG favorita pode ficar um pouco diferente quando reduzida para 14 cores, então será preciso experimentar. É possível reduzir para 14 cores usando um programa gráfico como o GIMP, em que você usaria a ação de menu Image->Mode->Indexed... e definiria o campo Maximum number of colors para 14. Ou é possível usar as ferramentas de linha de comando como ImageMagick. Lista 6 mostra uma maneira de reduzir um original de 800x531 pixels para o formato requerido de 640x480 pixels primeiro o redimensionando para 640 pixels de altura, então cortando parte da imagem e reduzindo a tela para adequar-se à imagem. A seguir, reduzimos o número de cores para 14 e convertemos a imagem de .jpg para .xpm. Por fim, a imagem é colocada em gzip.

Lista 6. Criando uma imagem inicial do GRUB personalizada
$ identify woodenbong.jpg
woodenbong.jpg JPEG 800x531 800x531+0+0 8-bit DirectClass 210KB 0.000u 0:00.000
$ convert -resize "800x640" woodenbong.jpg woodenbong2.jpg
$ convert -crop "640x480+40+0" +repage  woodenbong2.jpg  grub-in.jpg
$ convert -colors 14 grub-in.jpg grub-menu.xpm
$ gzip grub-menu.xpm

O shell do GRUB

Diferentemente do LILO, o GRUB comporta-se como um pequeno shell, com vários comandos que permite fazer ações como editar os comandos antes de executá-los, localizar e carregar um arquivo de configuração ou exibir arquivos usando cat . A partir do menu, é possível pressionar e em qualquer entrada para editá-la, c para trocar para uma linha de comando GRUB, b para inicializar o sistema p para inserir uma senha e Esc para retornar para o menu ou para a etapa anterior. Há também um comando grub , que cria um shell simulado no qual é possível testar sua configuração GRUB ou suas habilidades de comando GRUB. Alguns componentes básicos estão disponíveis no modo de usuário normal, mas é necessário ter autoridade de raiz para executar quaisquer comandos. Lista 7 ilustra como iniciar o shell grub como raiz. O comando grub normalmente é encontrado em /sbin ou /usr/sbin.

Lista 7. Iniciando o shell GRUB
# grub

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]

grub>

Dentro do shell GRUB, o comando help fornece uma lista de comandos. O uso de help commandname fornece ajuda para o comando chamado commandname. Lista 8 ilusta os comandos disponíveis e a ajuda para rootnoverify .

Lista 8. Using the GRUB shell
grub> help
blocklist FILE                         boot
cat FILE                               chainloader [--force] FILE
color NORMAL [HIGHLIGHT]               configfile FILE
device DRIVE DEVICE                    displayapm
displaymem                             find FILENAME
geometry DRIVE [CYLINDER HEAD SECTOR [ halt [--no-apm]
help [--all] [PATTERN ...]             hide PARTITION
initrd FILE [ARG ...]                  kernel [--no-mem-option] [--type=TYPE]
makeactive                             map TO_DRIVE FROM_DRIVE
md5crypt                               module FILE [ARG ...]
modulenounzip FILE [ARG ...]           pager [FLAG]
partnew PART TYPE START LEN            parttype PART TYPE
quit                                   reboot
root [DEVICE [HDBIAS]]                 rootnoverify [DEVICE [HDBIAS]]
serial [--unit=UNIT] [--port=PORT] [-- setkey [TO_KEY FROM_KEY]
setup [--prefix=DIR] [--stage2=STAGE2_ terminal [--dumb] [--no-echo] [--no-ed
terminfo [--name=NAME --cursor-address testvbe MODE
unhide PARTITION                       uppermem KBYTES
vbeprobe [MODE]

grub> help rootnoverify
rootnoverify: rootnoverify [DEVICE [HDBIAS]]
    Similar to `root', but don't attempt to mount the partition. This
    is useful for when an OS is outside of the area of the disk that
    GRUB can read, but setting the correct root device is still
    desired. Note that the items mentioned in `root' which derived
    from attempting the mount will NOT work correctly.

grub>

Como um exemplo prático, é possível continuar com o exemplo anterior e usar o comando find do GRUB para localizar arquivos de configuração. A seguir, é possível carregar o arquivo de configuração de (hd1,12), que é /dev/sdb13, conforme ilustrado na Lista 9.

Lista 9. Usando o GRUB para localizar e carregar um arquivo de configuração GRUB
grub> find /boot/grub/menu.lst
 (hd0,1)
 (hd0,5)
 (hd1,6)
 (hd1,8)
 (hd1,9)
 (hd1,10)
 (hd1,11)
 (hd1,12)

grub> configfile (hd1,12)/boot/grub/menu.lst
Pressione 'ESC' para entrar no menu... 24

Ao carregar o arquivo de configuração, é possível ver um menu similar àquele na Lista 10. Lembre-se de que isso foi feito sob o shell GRUB, que simula o ambiente GRUB real e não exibe a imagem inicial. Entretanto, é muito similar ao que se vê sobreposto à imagem inicial quando realmente inicializa o sistema usando o GRUB.

Observação: Se seu menu não se parecer com este, e suas teclas de seta forem ecoadas como algo como ^[[A, então, sua versão do comando grub pode não incluir suporte de curses necessário para exibição adequada do menu. Sabe-se que isso afeta certas liberações recentes do Fedora. Neste caso, você terá uma capacidade limitada de testar usando o shell grub.

Lista 10. The GRUB menu
    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 +-------------------------------------------------------------------------+
 | Fedora (2.6.35.14-95.fc14.x86_64)                                       |
 | Fedora (2.6.35.13-92.fc14.x86_64)                                       |
 | Fedora (2.6.35.13-91.fc14.x86_64)                                       |
 | GRUB                                                                    |
 | Slackware 13                                                            |
 | Windows                                                                 |
 |                                                                         |
 |                                                                         |
 +-------------------------------------------------------------------------+
      Use the ^ and v keys to select which entry is highlighted.
      Press enter to boot the selected OS, 'e' to edit the
      commands before booting, or 'c' for a command-line.

Suponha que você realçou a terceira entrada para Fedora (2.6.35.13-91.fc14.x86_64) e pressione e para editá-la. Você veria algo similar à Lista 11.

Lista 11. Editing a GRUB configuration entry
    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 +-------------------------------------------------------------------------+
 | root (hd1,13)                                                           |
 | kernel /boot/vmlinuz-2.6.35.13-91.fc14.x86_64 ro root=UUID=5e22a2e0-5>  |
 | initrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.img                     |
 |                                                                         |
 |                                                                         |
 +-------------------------------------------------------------------------+
      Use the ^ and v keys to select which entry is highlighted.
      Press 'b' to boot, 'e' to edit the selected command in the
      boot sequence, 'c' for a command-line, 'o' to open a new line
      after ('O' for before) the selected line, 'd' to remove the
      selected line, or escape to go back to the main menu.

Novamente, você usa as teclas de seta para selecionar a linha a ser editada e então pressione e para editá-la. Neste exemplo, iremos supor que você originalmente tinha instalado Fedora em /dev/sdb14 e então excluída uma partição inferior, digamos, /dev/sdb8. Isso baixaria a partição Fedora para /dev/sdb13 ou hd1,12 na notação GRUB. Use as teclas de cursor para mover além de '3' em '(hd1,13)', depois volte para cima para excluir '3' e insira '2' no lugar. Quando tiver concluído, pressione Enter para aceitar sua alteração ou pressione Esc para cancelar. Por fim, se você fosse realmente inicializar o sistema, em vez de executar o shell GRUB, pressione b para inicializar o sistema.

Quando você inicializa para um shell GRUB, ele tem capacidade suficiente para exibir arquivos no seu sistema de arquivos, e é executado como se fosse o usuário raiz, então você realmente precisa proteger o seu sistema com senhas GRUB. Lembre-se, porém, de que se um usuário pode inicializar a partir de mídia removível, o usuário pode fornecer sua própria configuração de GRUB. Consulte a seção de segurança no manual do GRUB (consulte os Recursos) para saber mais sobre segurança do GRUB e outros aspectos do GRUB. Também é possível visualizá-las no sistema usando info grub .


Parâmetros de kernel

Os parâmetros de kernel (às vezes chamados de parâmetros de inicialização) fornecem ao kernel informações sobre os parâmetros de hardware que pode não determinar por si mesmo para substituir valores que pode de outra forma detectar ou para evitar a detecção de valores inadequados. Por exemplo, é possível desejar inicializar no modo de um único usuário para reparar o sistema, inicializar um sistema SMP no modo de uniprocessador ou especificar um sistema de arquivos raiz alternativo. Alguns níveis de kernel exigem um parâmetro para permitir suporte a memória grande em sistemas com mais de uma certa quantidade de RAM.

Às vezes, será necessário adicionar parâmetros ao processo de inicialização. Por exemplo, pode-se desejar ativar o sistema no modo de usuário único para o qual adicionará o código S . Ou pode desejar especificar um kernel anteriormente em atividade de modo que possa descobrir por que seu kernel personalizado recém-criado não inicializa. Pressione a tecla Tab para ver uma lista de imagens para inicializar e o prompt de texto LILO resumido original boot:. Neste ponto, é possível digitar o nome de uma imagem ou pressionar Enter para selecionar a primeira entrada. Se precisar adicionar parâmetros, digite-os após o nome da imagem. Lista 12 e Figura 7 mostra o que é possível ver se pressionar a tecla Tab , digitar Slackware13 para selecionar a imagem Slackware 13, adicionar o parâmetro S para inicializar no modo de um único usuário e então pressionar Enter para iniciar o processo de boot.

Lista 12. Especificando os parâmetros de boot com LILO
Boot do Slackware 13     Windows        Fedora 14: Slackware13 S
Figura 7. Inicializando o Slackware no modo de um único usuário
Inicializando o Slackware no modo de um único usuário

Com o GRUB, é possível digitar outro conjunto de comandos para o kernel e instruções initrd , ou, preferencialmente, seria possível usar o recurso de editar descrito acima para editar uma entrada existente. Por exemplo, adicione o parâmetro S para inicializar no modo de um único usuário.

O processo init

Quando o kernel termina de carregar, ele normalmente inicia /sbin/init. Esse programa permanece em execução até que o sistema seja desligado. Ele sempre recebe o ID de processo 1, como se pode ver na Lista 13.

Lista 13. O processo init
[root@echidna ~]# ps --pid 1
  PID TTY          TIME CMD
    1 ?        00:00:00 init

Agora o programa init inicializa o restante do sistema executando uma série de scripts. Esses scripts normalmente residem em /etc/rc.d/init.d or /etc/init.d, e executam serviços como definir o nome de host do sistema, verificar o sistema de arquivos quanto a erros, montar sistemas de arquivos adicionais, ativar rede, iniciar serviços de impressão, e assim por diante. Quando os scripts são concluídos, init inicia um programa chamado getty, que exibe o prompt de login nos consoles. Telas de login gráficas são tratadas com um gerenciador de tela gráfica, como GDM para Gnome.

Se o sistema carregar um kernel, mas não conseguir executar init com sucesso, pode-se tentar recuperar especificando um programa de inicialização alternativo. Por exemplo, especificar init=/bin/sh inicializará o sistema em um prompt de shell com autoridade de raiz, a partir do qual pode ser possível reparar o sistema.

É possível descobrir mais sobre os parâmetros de boot disponíveis usando as man pages para bootparam, ou acessando /usr/src/linux/Documentation/ramdisk.txt, que pode ser chamado /usr/src/linux-$(uname -r)/Documentation/kernel-parameters.txt em alguns sistemas.

Nem é preciso dizer que se você tiver de aplicar o mesmo conjunto de parâmetros adicionais toda vez que inicializar, deve adicioná-los ao arquivo de configuração. Lembre-se de executar novamente lilo se estiver usando LILO.


Eventos de boot

Durante o processo de boot do Linux, um grande número de mensagens é emitido para o console, descrevendo o kernel sendo inicializado, o hardware do sistema e outros elementos relacionados ao kernel. Essas mensagens normalmente piscam rapidamente e você provavelmente não terá tempo para lê-las, a menos que haja um atraso enquanto o processo de boot aguarda algo, como incapacidade de alcançar um servidor de tempo ou um sistema de arquivos que deve ser verificado. Com o advento do projeto Linux Bootsplash (consulte os Recursos), essas mensagens podem ser sobrepostas em um plano de fundo gráfico, ou podem ser ocultadas e substituídas por uma simples barra de status. Se sua distribuição tiver suporte para o modo oculto, normalmente poderá voltar a exibir as mensagens de boot pressionando uma tecla como F2.

dmesg

É bom poder voltar e revisar as mensagens de kernel. Uma vez que a saída padrão está relacionada a um processo, e o kernel não tem um identificador de processo, ele mantém as mensagens de saída do kernel (e do módulo) no ring buffer do kernel. É possível exibir o ring buffer do kernel usando o comando dmesg , que exibe essas mensagens na saída padrão. É claro, é possível redirecionar essa saída para um arquivo para análise posterior ou encaminhá-la para um desenvolvedor de kernel para fins de depuração. Lista 14 ilustra algumas das saídas possíveis de serem vistas.

Lista 14. Saída dmesg parcial
[root@echidna ~]# dmesg | head -n 30
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.35.14-95.fc14.x86_64 (mockbuild@x86-07.phx2.fedoraprojec
t.org) (gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Tue Aug 16 21:01:58 U
TC 2011
[    0.000000] Command line: ro root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a rd_NO_LUKS
 rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb 
quiet
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
[    0.000000]  BIOS-e820: 000000000009dc00 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 00000000bf6b0000 (usable)
[    0.000000]  BIOS-e820: 00000000bf6b0000 - 00000000bf6c8000 (ACPI data)
[    0.000000]  BIOS-e820: 00000000bf6c8000 - 00000000bf6cb000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bf6cb000 - 00000000c0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed1c000 - 00000000fed20000 (reserved)
[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  BIOS-e820: 00000000ff000000 - 0000000100000000 (reserved)
[    0.000000]  BIOS-e820: 0000000100000000 - 0000000134000000 (usable)
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI present.
[    0.000000] e820 update range: 0000000000000000 - 0000000000001000 (usable) ==> (reserv
ed)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)
[    0.000000] No AGP bridge found
[    0.000000] last_pfn = 0x134000 max_arch_pfn = 0x400000000
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000]   00000-9FFFF write-back
[    0.000000]   A0000-BFFFF uncachable
[    0.000000]   C0000-C7FFF write-protect
[    0.000000]   C8000-E3FFF uncachable

O ring buffer do kernel é usado também para alguns eventos após o sistema ser inicializado. Isso inclui certas falhas de programa e eventos hot plug. Lista 15 mostra várias entradas relacionadas a conectar um memory key USB.

Lista 15. Eventos posteriores no ring buffer do kernel
[root@echidna ~]# dmesg | tail -n 19
[70259.964953] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[70259.964957] usb 1-4: Product: Storage Media
[70259.964960] usb 1-4: Manufacturer: Sony
[70259.964963] usb 1-4: SerialNumber: 0205093006441
[70260.228187] Initializing USB Mass Storage driver...
[70260.229608] scsi4 : usb-storage 1-4:1.0
[70260.229749] usbcore: registered new interface driver usb-storage
[70260.229752] USB Mass Storage support registered.
[70261.232195] scsi 4:0:0:0: Direct-Access     Sony     Storage Media    0100 PQ: 0 ANSI:
 0 CCS
[70261.233159] sd 4:0:0:0: Attached scsi generic sg3 type 0
[70261.237931] sd 4:0:0:0: [sdc] 1014784 512-byte logical blocks: (519 MB/495 MiB)
[70261.238809] sd 4:0:0:0: [sdc] Write Protect is off
[70261.238814] sd 4:0:0:0: [sdc] Mode Sense: 43 00 00 00
[70261.238818] sd 4:0:0:0: [sdc] Assuming drive cache: write through
[70261.243554] sd 4:0:0:0: [sdc] Assuming drive cache: write through
[70261.243566]  sdc:
[70261.317555] sd 4:0:0:0: [sdc] Assuming drive cache: write through
[70261.317561] sd 4:0:0:0: [sdc] Attached SCSI removable disk
[70261.616396] SELinux: initialized (dev sdc, type vfat), uses genfs_contexts

/var/log/messages

Quando o sistema iniciou ao ponto de executar /sbin/init, o kernel ainda registra eventos no ring buffer como você viu recentemente, mas os processos usando o daemon syslog para registrar mensagens, normalmente em /var/log/messages. Diferente do ring buffer, cada linha de syslog tem um registro de hora, e o arquivo persiste entre as reinicializações do sistema. Os erros ocorridos durante o estágio de scripts da inicialização devem ser procurados primeiro nesse arquivo.

A maioria dos daemons tem nomes que terminam em 'd'. Lista 16 mostra como visualizar as últimas mensagens de status de daemon após a reinicialização.

Lista 16. Mensagens de daemon de /var/log/messages
[root@echidna ~]# grep "^Sep.*d\:" /var/log/messages|tail -n 14
Sep  7 18:21:08 echidna acpid: waiting for events: event logging is off
Sep  7 18:21:12 echidna abrtd: Registered Analyzer plugin 'Kerneloops'
Sep  7 18:21:12 echidna abrtd: Registered Analyzer plugin 'Python'
Sep  7 18:21:12 echidna abrtd: Registered Reporter plugin 'Logger'
Sep  7 18:21:13 echidna abrtd: Registered Analyzer plugin 'CCpp'
Sep  7 18:21:13 echidna abrtd: Registered Action plugin 'KerneloopsScanner'
Sep  7 18:21:13 echidna abrtd: Registered Reporter plugin 'Bugzilla'
Sep  7 18:21:13 echidna abrtd: Registered Reporter plugin 'KerneloopsReporter'
Sep  7 18:21:13 echidna abrtd: Checking for unsaved crashes (dirs to check:5)
Sep  7 18:21:13 echidna abrtd: Registered Database plugin 'SQLite3'
Sep  7 18:21:13 echidna abrtd: Done checking for unsaved crashes
Sep  7 18:21:13 echidna abrtd: Init complete, entering main loop
Sep  7 18:21:26 echidna auditd[2032]: Started dispatcher: /sbin/audispd pid: 2034
Sep  7 18:21:26 echidna audispd: audispd initialized with q_depth=120 and 1 active plugins

Você também encontrará logs de muitos outros programas do sistema em /var/log. Por exemplo, é possível ver o log de inicialização para o sistema X Window.

Isso conclui a introdução para guiar seu sistema Linux pelo processo de boot.

Recursos

Aprender

Obter produtos e tecnologias

  • Avalie produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto on-line, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox aprendendo a implementar Arquitetura Orientada a Serviços de modo eficiente.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=763670
ArticleTitle=Aprenda Linux, 101: Inicialize o sistema
publish-date=10062011