Como o Linux Inicializa: Do BIOS/UEFI ao Login
O Que Você Vai Aprender
- A ordem exata dos eventos do ligar o computador até o prompt de login, traçada como uma única linha
- Como identificar qual estágio falhou quando uma máquina não inicializa
- Como observar o boot da sua própria máquina com
systemd-analyzeejournalctl -b
Os 5 estágios de boot
- Firmware (BIOS / UEFI) … inicializa o hardware, localiza o dispositivo de boot
- Bootloader (GRUB) … carrega o kernel e o initramfs na memória
- Kernel … assume o controle do hardware, descompacta o initramfs como root temporário
- init (systemd, PID 1) … muda para o root real, inicia serviços em paralelo
- Login … getty ou um gerenciador de display exibe o prompt
Premissas (ambiente alvo)
- Um Linux x86_64 típico (UEFI + GRUB 2 + systemd)
- Máquinas apenas com BIOS, outros bootloaders (ex.: systemd-boot) ou outros sistemas de init (ex.: OpenRC) mudam alguns nomes
Quantos Estágios Tem um Boot do Linux?
Conclusão: Cinco estágios: firmware → bootloader → kernel → init → login. O trabalho de cada estágio é apenas iniciar o próximo, então identificar onde travou aponta imediatamente a causa.
Inicializar não é mágica; é uma corrida de revezamento. Ao ligar o computador, a única coisa em que se pode confiar é a CPU, e a partir daí o "círculo de confiança" se amplia um passo de cada vez. Cada estágio carrega o próximo na memória, passa o controle e se retira.
Power ON │ ▼ (1) Firmware (BIOS / UEFI) inicializa hardware, escolhe dispositivo de boot ▼ (2) Bootloader (GRUB) carrega kernel + initramfs ▼ (3) Kernel controla hardware, descompacta initramfs ▼ (4) init (systemd / PID 1) inicia serviços, alcança target ▼ (5) Login (getty / DM) exibe prompt Sistema utilizável
"Até onde chegou?" é a informação mais útil para diagnóstico. Se você vê o menu do GRUB, os estágios (1) e (2) funcionaram; se mensagens do kernel aparecem na tela, você chegou ao (3). O sintoma visível permite trabalhar de trás para frente até o estágio.
O Que BIOS e UEFI Realmente Fazem?
Conclusão: O firmware (BIOS / UEFI) inicializa o hardware e localiza um dispositivo inicializável, depois carrega o primeiro programa na memória. O UEFI pode iniciar um arquivo
.efidiretamente da Partição do Sistema EFI, que é a diferença principal em relação ao BIOS.
Após ligar o computador, a primeira coisa a executar é o firmware na placa-mãe. Ele tem dois trabalhos.
- POST (Power-On Self-Test): verifica que o hardware principal (CPU, RAM, armazenamento) está presente e funcionando
- Seleção do dispositivo de boot: varre discos, USB e rede na ordem configurada para encontrar algo inicializável
É aqui que BIOS e UEFI divergem.
| Aspecto | BIOS (legado) | UEFI (moderno) |
|---|---|---|
| Método de boot | Executa os primeiros 446 bytes do MBR | Inicia um arquivo .efi no ESP |
| Limite de tamanho de disco | 2 TB (MBR) | 9,4 ZB (GPT) |
| Secure boot | Nenhum | Suporta Secure Boot |
| Armazenamento de configurações | CMOS | NVRAM (gerenciado via efibootmgr) |
Em uma máquina UEFI, o executável do bootloader (ex.: /EFI/ubuntu/grubx64.efi) fica na ESP (EFI System Partition), uma pequena área FAT32. O UEFI a inicia diretamente, então o antigo truque do BIOS de embutir código no MBR não é mais necessário.
# Verificar se você inicializou via UEFI (este diretório existe apenas em boots UEFI) $ ls /sys/firmware/efi
Se /sys/firmware/efi existir, você inicializou via UEFI; caso contrário, é um boot BIOS legado. Para problemas de dual-boot ou instalação, confirmar este fato primeiro elimina muito diagnóstico sem saída.
Para Que Serve o Bootloader (GRUB)?
Conclusão: O bootloader lê o kernel e o initramfs do disco para a memória e passa o controle ao kernel com parâmetros de boot. O GRUB também pode exibir um menu, permitir escolher um kernel e editar parâmetros em tempo real.
O firmware inicia o bootloader, e no Linux isso é mais comumente o GRUB 2. As tarefas do GRUB são:
- Escolher qual kernel / SO inicializar (aquele menu de seleção em preto)
- Carregar o kernel escolhido (
vmlinuz) e o initramfs (initrd.img) na memória - Passar o controle ao kernel com parâmetros do kernel (a cmdline)
Sua configuração é gerada em /boot/grub/grub.cfg, mas esse é um arquivo gerado automaticamente que você nunca deve editar diretamente. As fontes são /etc/default/grub e um conjunto de templates.
# Exibir o kernel e os parâmetros usados neste boot $ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.8.0-31-generic root=UUID=... ro quiet splash
root=UUID=... diz "este é o sistema de arquivos root real", e ro significa "montá-lo somente leitura no início". Quando algo quebra, pressionar e no menu do GRUB permite editar esta linha diretamente (por exemplo, remover quiet splash e adicionar single) para inicializar em modo de recuperação.
Um menu GRUB visível significa que os estágios (1) e (2) funcionaram. Se não avança mais (sem mensagens do kernel), suspeite de um kernel ou initramfs corrompido, ou um root= errado. Se você nem chega ao menu do GRUB, a causa está nas configurações do firmware ou no próprio ESP / bootloader.
O Que o Kernel e o initramfs Estão Fazendo?
Conclusão: O kernel assume o controle da memória, CPUs e dispositivos, depois descompacta o initramfs como root temporário. O initramfs tem apenas os drivers suficientes para montar o root real; quando estiver pronto, ele muda para o root real.
Depois que o GRUB passa o controle, o kernel se descompacta e começa a gerenciar o hardware. Ele ativa o gerenciamento de memória e o escalonador de processos, habilita todos os núcleos da CPU e inicializa os drivers.
O elemento-chave aqui é o initramfs (initial RAM filesystem). Por que ele é necessário? Se o sistema de arquivos root real está sobre criptografia (LUKS), LVM, RAID ou um driver de disco especial, o kernel precisa de "o driver para montá-lo" antes de poder montá-lo. É um problema de galinha e ovo.
O initramfs resolve isso como um pequeno root temporário. O GRUB carregou esse arquivo na memória junto com o kernel; o kernel o descompacta na RAM e executa seu script init, que aproximadamente:
- Carrega os módulos de kernel necessários (armazenamento, criptografia, etc.)
- Ativa LVM, descriptografa LUKS e torna o root real visível
- Monta o root real e usa
switch_rootpara trocar o root por ele
# A detecção e os passos de init do kernel ficam em um buffer circular $ dmesg | head
O trabalho do initramfs termina aqui; de agora em diante, o /sbin/init (ou seja, systemd) no root real entra em cena. Esta troca "root temporário -> root real" é o ponto central do boot, e é onde aparece o prompt de senha do disco criptografado.
O Que o init (systemd / PID 1) Inicia?
Conclusão: O primeiro processo iniciado no root real é o init, hoje geralmente systemd (PID 1). O systemd resolve dependências e inicia serviços (units) em paralelo, com o objetivo de alcançar um estado alvo (um target).
Após o switch_root, o primeiro processo de espaço de usuário que o kernel inicia no root real é o PID 1, init. Na maioria das distribuições modernas, esse papel pertence ao systemd. Sua característica é tratar serviços como um grafo de dependências e iniciar os independentes em paralelo (em contraste com o antigo SysVinit, que executava scripts de boot em série).
As unidades de inicialização que o systemd gerencia são chamadas de units.
*.service… daemons / programas (ex.:sshd.service)*.mount… montagens de sistema de arquivos*.socket… listeners de socket*.target… um objetivo agrupando muitas units (o sucessor dos runlevels)
O objetivo do boot é alcançar o target padrão. Servidores tipicamente usam multi-user.target (CLI); desktops usam graphical.target (GUI).
# Mostrar o target padrão (sucessor dos runlevels) $ systemctl get-default
graphical.target
| Runlevel antigo | Target do systemd | Significado |
|---|---|---|
| 0 | poweroff.target |
Desligar |
| 1 | rescue.target |
Usuário único (recuperação) |
| 3 | multi-user.target |
Multi-usuário CLI |
| 5 | graphical.target |
GUI |
| 6 | reboot.target |
Reiniciar |
O systemd segue as dependências a partir de default.target e inicia as units necessárias. Como outras units continuam mesmo que uma falhe, você pode isolar casos como "inicializou, mas apenas este serviço está fora."
O systemd controla cada serviço com sinais. O fluxo de "enviar SIGTERM, e se não responder, SIGKILL" é exatamente como o desligamento gracioso funciona. Veja Entendendo Sinais no Linux para detalhes.
De Onde Vem o Prompt de Login?
Conclusão: No passo final de alcançar o target, uma CLI usa getty para exibir um prompt
login:em um terminal virtual, enquanto uma GUI usa um gerenciador de display (ex.: gdm) para exibir um login gráfico. Quando você chega aqui, o boot está completo.
Alcançar o target traz o ponto de entrada com o qual você interage.
- CLI (
multi-user.target):getty(agetty) exibe um promptlogin:em cada terminal virtual (tty1, etc.). Os terminais de texto simples que você alcança comCtrl+Alt+F2são esses. - GUI (
graphical.target): um gerenciador de display (gdm/sddm/lightdm, etc.) exibe uma tela de login gráfica e, após a autenticação, inicia uma sessão de desktop.
A autenticação é tratada pelo PAM (Pluggable Authentication Modules). Com sucesso, um shell (CLI) ou ambiente de desktop (GUI) inicia e o sistema está finalmente "utilizável". Esta é a linha de chegada do revezamento de boot.
Como Observar o Boot da Minha Própria Máquina?
Conclusão: Use
systemd-analyzepara o tempo total e unidades lentas, ejournalctl -bpara o log completo do boot atual. "Está lento" e "este serviço não inicia" são quase sempre resolúveis com esses dois.
Vamos verificar a teoria na sua própria máquina. O systemd mede e registra cada estágio de boot, então visualizá-lo é fácil.
# Tempo total de boot (firmware -> kernel -> espaço de usuário) $ systemd-analyze
Startup finished in 4.123s (firmware) + 2.001s (loader) + 1.892s (kernel) + 6.540s (userspace) = 14.557s
O detalhamento firmware / loader / kernel / userspace mapeia exatamente para os estágios (1)-(4) deste artigo, então você pode ver de relance onde o tempo vai.
# Units que atrasaram o boot, mais lentas primeiro $ systemd-analyze blame
# Ler apenas o log do boot atual (-b = boot atual) $ journalctl -b
Por causa da inicialização paralela, os números de systemd-analyze blame não somam um total simples (trabalho concorrente é contado duas vezes). Para atrasos dependentes de ordem, systemd-analyze critical-chain é mais próximo da realidade.
Resumo: Estágios de Boot e Tabela de Diagnóstico
Conclusão: "O que apareceu na tela" indica o estágio alcançado. Menu GRUB = (1)(2) ok, log do kernel = alcançou (3), prompt de emergência = (4) falhou ao montar root, login = sucesso total. Traduza o sintoma em um estágio e o escopo da causa fica fixo.
| Estágio | Responsável | O que sucesso parece | Causa provável quando trava |
|---|---|---|---|
| (1) Firmware | BIOS / UEFI | Logo do fabricante | Ordem de boot, ESP, falha de hardware |
| (2) Bootloader | GRUB | Menu do GRUB | grub.cfg, kernel/initrd corrompido |
| (3) Kernel | kernel + initramfs | Log do kernel rola | Driver ausente, root= errado |
| (4) init | systemd (PID 1) | Mensagens de início de serviço | Falha ao montar root, unit quebrada |
| (5) Login | getty / DM | Prompt de login | Config do DM, PAM, driver de GPU |
Mantenha o fluxo de boot em mente como cinco estágios de responsabilidade, e um vago "não inicializa" se torna a questão de qual estágio falhou. A partir daí, ler o log daquele estágio (dmesg / journalctl -b) leva diretamente à causa.