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
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):
| Target | Runlevel | Descrição |
|---|---|---|
| rescue.target | 1 | Modo de recuperação (single user) |
| multi-user.target | 3 | Multiusuário sem GUI |
| graphical.target | 5 | Multiusuá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
NetworkManager-wait-online.service está lento, considere desabilitá-lo em servidores: sudo systemctl disable NetworkManager-wait-online.service.