101.2 Processo de Boot - BIOS
MBR - Master Boot Record
O Master Boot Record (MBR) é um tipo de setor de inicialização localizado nos primeiros 512 bytes de um disco. Ele contém informações essenciais para a inicialização do sistema operacional, incluindo o bootloader e a tabela de partições. Além disso, o MBR permite que o sistema acesse e manipule as partições e os sistemas de arquivos presentes no dispositivo.
Um disco particionado com MBR pode ter até quatro partições primárias, ou então três primárias e uma partição estendida. Dentro da partição estendida é possível criar múltiplas partições lógicas. O tamanho máximo suportado por disco no esquema MBR é de 2 TB, e todas as informações da tabela de partições ficam centralizadas em um único ponto, tornando esse esquema mais vulnerável a corrupção de dados.
Inicialização do Sistema
A seguir, podemos entender os passos que ocorrem durante o processo de boot em sistemas que utilizam BIOS com MBR:
Ao ligar o computador, inicia-se o POST (AutoTeste de Inicialização). É um autoteste que a BIOS faz para verificar se o hardware básico está funcional.
Após o término do POST, a BIOS começa o processo de iniciar o hardware necessário para fazer o boot do sistema (inicia discos, controladores USB, PCI e outros dispositivos).
A BIOS acessa o primeiro setor do disco definido como dispositivo de boot (setor LBA 0). Esse setor contém os 512 bytes do Master Boot Record (MBR). Os primeiros 446 bytes armazenam o código executável do primeiro estágio do bootloader. Em algumas fontes, você verá menções a "440 bytes" porque os últimos 6 bytes antes da tabela de partições incluem 4 bytes reservados para a "assinatura de disco" (disk signature).
Em seguida, temos a tabela de partições, com 64 bytes (4 entradas de 16 bytes cada), e os últimos 2 bytes contêm a assinatura mágica
0x55AA
, que indica à BIOS que o setor é um setor de boot válido.Depois de identificar esse layout e validar a assinatura, a BIOS carrega o código do MBR na RAM e transfere o controle para ele, iniciando o primeiro estágio do processo de boot.
O código do MBR (conhecido como
boot.img
), ao ser executado, vai procurar o restante do bootloader (conhecido comocore.img
) em setores seguintes ou na partição indicada e carrega ele na memória. Dependendo do bootloader, isso ocorre em camadas:Estágio 1.5 (opcional, comum no GRUB/GRUB2): É a execução do
core.img
com drivers básicos de sistema de arquivos. No esquema MBR, costuma ficar no "post-MBR gap" (espaço logo após o MBR e antes da primeira partição). Em discos GPT com BIOS, o GRUB usa uma BIOS Boot Partition pequena para esse mesmo fim.Estágio 2 (bootloader "completo"): o código aqui chamado de
normal.mod
(que foi executado pelocore.img
) já consegue entender Sistemas de Arquivos, ele então lê o arquivo de configuração (por exemplo,/boot/grub/grub.cfg
no GRUB2), mostra o menu de boot, permite escolher o kernel, editar parâmetros da linha de comando, escolher initramfs, acessar modos de recuperação e outras opções.
O bootloader então carrega o kernel Linux na memória RAM. Neste momento, o kernel assume o controle do sistema, inicializa a CPU, gerencia a memória e detecta o hardware essencial.
Em seguida, o kernel monta um sistema de arquivos temporário na RAM, chamado initramfs (initial RAM filesystem). Ele contém os drivers e scripts necessários para acessar o sistema de arquivos raiz real do Linux (por exemplo, se o root estiver em LVM, RAID ou criptografado).
Uma vez que o root real está acessível, o kernel monta os sistemas de arquivos conforme especificado em
/etc/fstab
e transfere o controle para o primeiro processo de espaço de usuário, nesse caso, é oinit
.O
init
(ou um de seus substitutos modernos, como o systemd ou Upstart) é o responsável por executar os scripts e serviços que finalizam a inicialização do sistema, iniciando daemons, montando sistemas adicionais e colocando o sistema no estado definido (multiusuário, gráfico etc).Após o sistema de arquivos raiz real estar ativo e o processo
init
em execução, o initramfs é desmontado e liberado da memória.
Informações da MBR:
UEFI - Unified Extensible Firmware Interface
O UEFI substitui a BIOS tradicional como firmware de inicialização e traz diversas melhorias em relação ao modelo anterior. Ele utiliza uma partição especial chamada ESP (EFI System Partition) para armazenar os aplicativos responsáveis pela inicialização do sistema. Entre os principais avanços, temos:
- Suporte a discos maiores que 2 TB;
- Até 128 partições primárias por padrão (em esquemas GPT);
- Detecção e recuperação de corrupção de dados/partições;
- Inicialização segura (Secure Boot), com verificação de assinaturas digitais;
- Capacidade nativa de trabalhar com boot múltiplo, sem depender de encadeamento entre bootloaders.
Etapas da Inicialização com UEFI
Vamos entender o que acontece desde o momento em que a máquina é ligada:
Ao ligar o computador, inicia-se o POST (AutoTeste de Inicialização). É um autoteste que a BIOS faz para verificar se o hardware básico está funcional.
Após o término do POST, a UEFI começa o processo de iniciar o hardware necessário para fazer o boot do sistema (inicia discos, controladores USB, PCI e outros dispositivos) e começa a procurar uma entrada de boot válida.
O firmware lê as entradas de boot armazenadas na NVRAM para identificar qual aplicativo EFI deve ser executado. Cada entrada especifica o caminho para um executável
.efi
, como um bootloader ou mesmo o kernel com suporte a EFISTUB.A NVRAM (Non-Volatile RAM) é uma memória persistente usada pelo firmware UEFI para armazenar informações de boot, como as entradas de inicialização e configurações do sistema, que permanecem salvas mesmo após desligar o computador.
Caso não haja uma entrada explícita, ou se estivermos usando uma mídia removível (como um pendrive ou DVD), o firmware seguirá o caminho padrão de fallback e tentará executar:
\EFI\BOOT\BOOTX64.EFI
para sistemas 64-bit;\EFI\BOOT\BOOTIA32.EFI
para sistemas 32-bit.Esse executável deve estar dentro da partição ESP, que obrigatoriamente deve estar formatada como FAT12, FAT16 ou FAT32 (para discos) ou ISO-9660 (para mídias ópticas).
O firmware inicia o aplicativo EFI e a partir daqui podemos ver a tela de menu do boot.
O binário EFI carregado pode ser um bootloader (como GRUB, systemd-boot, rEFInd, LILO, etc.), um shell UEFI, ou até mesmo o kernel Linux com EFISTUB. A partir desse ponto, o controle é transferido para o sistema operacional.
Se a inicialização segura estiver ativada, o processo de inicialização verificará a autenticidade do binário EFI por assinatura.
Como cada sistema operacional ou fornecedor pode manter seus próprios arquivos na partição do sistema EFI sem afetar o outro, a inicialização múltipla usando UEFI é apenas uma questão de iniciar um aplicativo EFI diferente correspondente ao carregador de inicialização do sistema operacional específico. Isso elimina a necessidade de confiar nos mecanismos de carregamento em cadeia de um carregador de boot para carregar outro sistema operacional.
O UEFI normalmente não utiliza MBR, e sim GPT (GUID Partition Table). Apesar disso, é possível usar UEFI com MBR em modo de compatibilidade, o que não é recomendado. A partição ESP costuma ser montada em /boot/efi
nos sistemas Linux modernos. O gerenciamento de entradas de boot UEFI pode ser feito diretamente via firmware (setup do sistema) ou através da ferramenta de linha de comando:
efibootmgr
Bootloader
O bootloader
é um software iniciado pelo firmware (BIOS ou UEFI) que serve para carregar o Sistema Operacional na memória, enquanto que o initrd
ou initramfs
servem para dar suporte ao Kernel. Filesystem temporário carregador na memória ram.
No caso de UEFI, o próprio kernel pode ser iniciado diretamente pelo UEFI usando o stub de inicialização EFI. Um carregador de boot ou gerenciador de boot separado ainda pode ser usado com o propósito de editar os parâmetros do kernel antes da inicialização.
No GRUB, as vezes a lista de menus não aparece automaticamente, para que ela possa ser exibida pressione Shift
na inicialização, para BIOS e Esc
para UEFI. No menu do GRUB podemos não somente escolher qual Kernel vai iniciar, mas também podemos passar alguns parâmetros para ele:
acpi
Ativa/desativa o suporte a ACPI.
acpi=off
desabilita o suporte a ACPI.init
Define um iniciador de sistema alternativo. Por exemplo,
init=/bin/bash
define o shell Bash como iniciador (O bash vira o novo INIT). Assim, uma sessão do shell será iniciada logo após o processo de inicialização do kernel.systemd.unit
Define o destino do systemd a ser ativado. Por exemplo,
systemd.unit=graphical.target
. O systemd também aceita os níveis de execução numéricos definidos para SysV. Para ativar o nível de execução 1, por exemplo, é necessário apenas incluir o número1
ou a letraS
(abreviação de “single”) como parâmetro do kernel.mem
Define a quantidade de RAM disponivel para o sistema. Este parâmetro é útil para limitar a RAM disponível para cada convidado em uma máquina virtual. Assim,
mem=512M
limita a 512 megabytes a quantidade de RAM disponível para um sistema convidado em particular.maxcpus
Limita o número de processadores (ou núcleos de processador) visíveis ao sistema em máquinas multiprocessador simétricas. Também é útil para máquinas virtuais. Um valor de
0
desativa o suporte a máquinas multiprocessador e tem o mesmo efeito do parâmetro do kernelnosmp
. O parâmetromaxcpus=2
limita a dois o número de processadores disponíveis para o sistema operacional.quiet
Oculta a maioria das mensagens de inicialização.
splash
Coloca uma tela, pode ser uma imagem, onde teríamos as mensagens de Boot.
vga
Seleciona um modo de vídeo. O parâmetro
vga=ask
mostra uma lista dos modos disponíveis a escolher.root
Define a partição raiz, diferente da que está configurada no bootloader. Por exemplo,
root=/dev/sda3
.rootflags
Opções de montagem para o arquivo de sistemas raiz.
ro
Torna somente para leitura a montagem inicial do arquivo de sistemas raiz.
rw
Permite escrever no arquivo de sistemas raiz durante a montagem inicial.
Geralmente não é necessário alterar os parâmetros do kernel, mas isso pode ser útil para detectar e resolver problemas relacionados ao sistema operacional. Os parâmetros do kernel devem ser adicionados ao arquivo /etc/default/grub
na linha GRUB_CMDLINE_LINUX
para que persistam após a inicialização. É necessário gerar um novo arquivo de configuração para o carregador de inicialização a cada vez que /etc/default/grub
é alterado, o que é feito com o comando grub-mkconfig -o /boot/grub/grub.cfg
. Quando o sistema operacional estiver rodando, os parâmetros do kernel usados para carregar a sessão ficam disponíveis para leitura no arquivo /proc/cmdline
.
INIT - Initialization Processes
O INIT tem função de iniciar os primeiros processos e serviços do Linux, possui o ID 1, pai de todos os outros processos.
O init funciona atráves de RunLevels (SysV) ou Targets (SystemD) que vão definir diferentes modos de operação. Os inits atuais são:
- SystemV (SysV) - Init original;
- SystemD (mais atual);
- Upstart (Muito usado também)
DMESG
Usado para ver logs do sistema, é muito usado para ver as mensagens do Boot , use o comando dmesg
.
Opções | Descrição |
---|---|
-H | Faz paginação (--human) |
--clear | Apaga as mensagens de boot do sistema. |
Journalctl
É o sistema de log do systemd
, ele coleta logs tanto do sistema como de aplicações (em ambientes systemd), podemos usar para verificar os logs do boot também.
Opções | Descrição |
---|---|
-b | Mostra logs do boot atual ou um especifico |
-k | Mensagens do Kernel referente ao boot atual (dmesg) |
-f | Fica monitorando |
-x | Adiciona mensagem explicativas quando possível |
-e | Joga para o final da página de logs |
--list-boots | Mostra uma lista de números de inicialização relativos à inicialização atual, seu hash de identificação e os registros de data e hora da primeira e última mensagens correspondentes |
-D | Usado para inspecionar o conteúdo dos arquivos de journal de uma partição X. Ex: journalctl -D /mnt/hd/var/log/journal . (--directory) |
Exemplos:
# Para ver o status do serviço:
sudo systemctl status systemd-journald
# Exibir tudo:
sudo journalctl
# Mensagem de Boot:
sudo journalctl -b