Visão geral do boot

O boot do Linux segue uma sequência bem definida. Entender cada etapa ajuda a diagnosticar problemas de inicialização.

BIOS/UEFI → Bootloader (GRUB) → Kernel + initramfs → init (systemd) → Target

1. BIOS/UEFI

O firmware da placa-mãe executa o POST (Power-On Self-Test) e procura um dispositivo de boot. Em sistemas UEFI, o bootloader fica na partição EFI (ESP), geralmente montada em /boot/efi.

# Verificar se o sistema usa UEFI ou BIOS
ls /sys/firmware/efi

Se o diretório existir, o sistema iniciou via UEFI. Se não existir, é BIOS legado.

2. GRUB (Grand Unified Bootloader)

O GRUB carrega o kernel e o initramfs para a memória. Sua configuração fica em:

# Configuração gerada (não editar diretamente)
cat /boot/grub/grub.cfg

# Configuração editável
cat /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

Após editar /etc/default/grub, regenere a configuração:

sudo update-grub
Dica: Para ver mensagens de boot em vez da tela de splash, remova quiet splash de GRUB_CMDLINE_LINUX_DEFAULT.

3. Kernel + initramfs

O kernel é descomprimido na memória e monta o initramfs -- um sistema de arquivos temporário que contém drivers essenciais para acessar o disco real.

# Ver kernels instalados
ls /boot/vmlinuz-*

# Ver initramfs disponíveis
ls /boot/initrd.img-*
/boot/vmlinuz-6.8.0-45-generic
/boot/vmlinuz-6.8.0-41-generic
/boot/initrd.img-6.8.0-45-generic
/boot/initrd.img-6.8.0-41-generic

Para reconstruir o initramfs (necessário após mudar módulos):

sudo update-initramfs -u -k $(uname -r)

4. init/systemd

Após montar o sistema de arquivos real, o kernel executa o primeiro processo (PID 1). Na maioria das distribuições modernas, é o systemd:

# Confirmar que systemd é o init
ps -p 1 -o comm=
systemd

5. Targets (runlevels)

O systemd organiza o boot em targets (equivalentes aos antigos runlevels):

TargetRunlevelDescrição
rescue.target1Modo de recuperação (single user)
multi-user.target3Multiusuário sem GUI
graphical.target5Multiusuário com GUI
# Ver target padrão
systemctl get-default

# Mudar target padrão para modo texto
sudo systemctl set-default multi-user.target

# Mudar target em tempo real (sem reiniciar)
sudo systemctl isolate multi-user.target

Diagnosticando o boot

journalctl -b: logs do boot atual

# Boot atual
journalctl -b

# Boot anterior (útil após crash)
journalctl -b -1

# Listar boots anteriores
journalctl --list-boots
-2 abc123... Qui 2026-03-25 08:10:01 BRT—Qui 2026-03-25 18:30:45 BRT
-1 def456... Sex 2026-03-26 07:55:12 BRT—Sex 2026-03-26 22:15:33 BRT
 0 ghi789... Sáb 2026-03-27 08:00:05 BRT—Sáb 2026-03-27 10:22:18 BRT

systemd-analyze: tempo de boot

systemd-analyze
Startup finished in 3.201s (firmware) + 2.108s (loader) + 4.512s (kernel) + 8.891s (userspace) = 18.712s
graphical.target reached after 8.891s in userspace.
# Serviços mais lentos
systemd-analyze blame | head -10
3.421s snapd.service
2.108s NetworkManager-wait-online.service
1.876s apt-daily-upgrade.service
1.203s dev-sda1.device
 892ms systemd-journal-flush.service
# Cadeia crítica (caminho mais lento)
systemd-analyze critical-chain
Dica: Se NetworkManager-wait-online.service está lento, considere desabilitá-lo em servidores: sudo systemctl disable NetworkManager-wait-online.service.