Ubuntu Boot, GRUB e Kernel

Entre apertar o botão de ligar e ver a tela de login, o computador passa por cinco etapas. Quando uma delas falha, a mensagem na tela diz qual, mas só se você souber ler. Nesta aula você aprende o caminho do boot, a abrir e configurar o menu do GRUB e a voltar para um kernel anterior quando uma atualização dá errado.

Você vai aprender
  • As etapas do boot: UEFI → shim/GRUB → kernel → initramfs → systemd.
  • A mostrar o menu do GRUB, que no Ubuntu vem escondido.
  • A mudar as opções do GRUB em /etc/default/grub com segurança.
  • A ver os kernels instalados e iniciar com o anterior.
  • A passar parâmetros para o kernel, só uma vez ou de forma permanente.

Antes do comando: o caminho do boot

  1. Firmware (UEFI): o "programa da placa-mãe". Testa o hardware e procura um carregador na partição EFI, que no Ubuntu está montada em /boot/efi.
  2. shim e GRUB: o shimx64.efi é um pequeno programa assinado que permite ligar com o Secure Boot ativo. Ele chama o grubx64.efi, o GRUB (GRand Unified Bootloader), que mostra o menu e carrega o kernel.
  3. Kernel: o arquivo /boot/vmlinuz-…. É o núcleo do Linux: assume o controle do hardware.
  4. initramfs: o arquivo /boot/initrd.img-…, um mini-sistema temporário com os drivers necessários para encontrar e montar o disco de verdade.
  5. systemd: o primeiro programa do sistema real (PID 1). Sobe os serviços e, por fim, a tela de login.

Você vê as peças no disco:

$ ls /boot
config-7.0.0-34-generic      initrd.img-7.0.0-38-generic  vmlinuz-7.0.0-34-generic
config-7.0.0-38-generic      initrd.img.old               vmlinuz-7.0.0-38-generic
efi                          mt86+x64                     vmlinuz.old
grub                         System.map-7.0.0-34-generic
initrd.img                   System.map-7.0.0-38-generic
initrd.img-7.0.0-34-generic  vmlinuz
$ ls -l /boot/vmlinuz /boot/vmlinuz.old
lrwxrwxrwx 1 root root 24 Oct 11 12:48 /boot/vmlinuz -> vmlinuz-7.0.0-38-generic          « o atual
lrwxrwxrwx 1 root root 24 Oct 11 12:48 /boot/vmlinuz.old -> vmlinuz-7.0.0-34-generic      « o anterior
$ sudo ls /boot/efi/EFI/ubuntu
BOOTX64.CSV  grub.cfg  grubx64.efi  mmx64.efi  shimx64.efi

Há sempre dois kernels: o atual e o anterior. É essa "reserva" que salva você quando uma atualização de kernel não se dá bem com o seu hardware.


Kernels instalados

dpkg -l
Lista pacotes instalados (veja dpkg e .deb).
'linux-image*'
Só os que começam com linux-image. As aspas impedem o shell de expandir o *.
| grep ^ii
Só as linhas que começam com ii = instalado.
$ dpkg -l 'linux-image*' | grep ^ii
ii  linux-image-7.0.0-34-generic    7.0.0-34.34  amd64  Signed kernel image generic          « o anterior
ii  linux-image-7.0.0-38-generic    7.0.0-38.38  amd64  Signed kernel image generic          « o atual
ii  linux-image-generic             7.0.0-38.38  amd64  Generic Linux kernel image
ii  linux-image-generic-hwe-26.04   7.0.0-38.38  amd64  Generic Linux kernel image
$ uname -r
7.0.0-38-generic                                                                         « o que está rodando agora

Os pacotes linux-image-generic e …-hwe-26.04 são "metapacotes": não contêm kernel, só puxam sempre o mais novo. O apt autoremove apaga os kernels mais velhos que o anterior (veja Manutenção).


Mostrar o menu do GRUB

Num computador só com Ubuntu, o menu fica escondido e o boot segue direto. Para vê-lo uma vez:

  • UEFI (a maioria dos computadores atuais): pressione Esc algumas vezes logo depois que a marca do fabricante sumir.
  • BIOS antiga: segure Shift durante o início do boot.

O menu tem a entrada Ubuntu e a Advanced options for Ubuntu ("opções avançadas"). Os nomes das entradas ficam em inglês mesmo com o sistema em português. Dentro das opções avançadas fica cada kernel instalado, em versão normal e em recovery mode (modo de recuperação).

Apertou Esc demais?

Se aparecer só grub> numa tela preta, você caiu no terminal do GRUB. Digite normal e Enter para voltar ao menu, ou exit para seguir o boot.


Configurar o GRUB: /etc/default/grub

As opções do GRUB ficam em /etc/default/grub. Na instalação padrão:

GRUB_DEFAULT=0                                  # entrada iniciada por padrão (0 = a primeira)
GRUB_TIMEOUT_STYLE=hidden                       # menu escondido
GRUB_TIMEOUT=0                                  # segundos de espera
GRUB_DISTRIBUTOR=`( . /etc/os-release && echo ${NAME} )`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"       # parâmetros do kernel no boot normal
GRUB_CMDLINE_LINUX=""                           # parâmetros em todos os boots, inclusive recovery

Deixar o menu sempre visível por 5 segundos

  1. Faça uma cópia de segurança do arquivo:
    $ sudo cp /etc/default/grub /etc/default/grub.bak
  2. Edite e troque as duas linhas:
    $ sudo nano /etc/default/grub
    GRUB_TIMEOUT_STYLE=menu
    GRUB_TIMEOUT=5
  3. Gere de novo a configuração que o GRUB realmente lê:
    $ sudo update-grub
    Sourcing file `/etc/default/grub'
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-7.0.0-38-generic                 « achou o kernel atual
    Found initrd image: /boot/initrd.img-7.0.0-38-generic
    Found linux image: /boot/vmlinuz-7.0.0-34-generic                 « e o anterior
    Found initrd image: /boot/initrd.img-7.0.0-34-generic
    …
    done
sudo
O arquivo gerado fica em /boot, que só o root altera.
update-grub
Lê /etc/default/grub e os scripts de /etc/grub.d/ e escreve /boot/grub/grub.cfg.
Nunca edite /boot/grub/grub.cfg à mão

Ele é sobrescrito a cada update-grub, inclusive nas atualizações de kernel. Toda mudança vai em /etc/default/grub, seguida de sudo update-grub. Esquecer o update-grub é o erro mais comum: a mudança simplesmente não vale.


Iniciar com o kernel anterior

Depois de uma atualização, a tela ficou preta, o Wi-Fi sumiu (veja também Wi-Fi que Não Funciona) ou o sistema trava? Antes de tudo, teste o kernel anterior:

  1. Reinicie e abra o menu do GRUB (Esc ou Shift).
  2. Escolha Advanced options for Ubuntu.
  3. Escolha a linha com o kernel mais antigo (ex.: Ubuntu, with Linux 7.0.0-34-generic), a que não termina em (recovery mode).
  4. Se tudo funcionar, confirme no terminal qual está rodando:
    $ uname -r
    7.0.0-34-generic

Se o kernel anterior resolveu, o problema está no novo. Você pode segurar a atualização do kernel até sair uma correção:

$ sudo apt-mark hold linux-image-generic linux-image-generic-hwe-26.04
linux-image-generic configurado como retido.
linux-image-generic-hwe-26.04 configurado como retido.

Para voltar a receber kernels novos depois: sudo apt-mark unhold linux-image-generic linux-image-generic-hwe-26.04.

Lembrar sempre a última escolha do menu

Para o GRUB iniciar automaticamente o que você escolheu da última vez:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5

Depois, sudo update-grub. Na próxima vez em que você escolher o kernel anterior no menu, ele vira o padrão.


Parâmetros do kernel

O GRUB passa ao kernel uma "linha de comando", como um programa recebe argumentos. Veja a atual:

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-7.0.0-38-generic root=UUID=691a91a0-48e6-40f9-8aeb-72c0e2f0e05e ro quiet splash
ParâmetroSignificado
root=UUID=…Em que partição está o sistema
roMonta o disco como somente leitura no início (o systemd remonta como escrita depois)
quietEsconde as mensagens do kernel
splashMostra a animação de boot do Ubuntu
nomodesetNão carrega o driver de vídeo completo. Salva-vidas para tela preta
systemd.unit=rescue.targetSobe só o mínimo e pede a senha de root (modo de resgate)

Só para este boot: a tecla e

  1. No menu do GRUB, selecione a entrada e pressione e (de edit).
  2. Ache a linha que começa com linux. Ela termina com ro quiet splash.
  3. Edite: por exemplo, apague quiet splash para ver as mensagens, ou acrescente nomodeset no fim.
  4. Pressione Ctrl+X ou F10 para iniciar.

A mudança vale só para este boot e não estraga nada. É a forma segura de testar um parâmetro.

Para sempre

Coloque o parâmetro em GRUB_CMDLINE_LINUX_DEFAULT e rode sudo update-grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"

Medir o tempo de boot

$ systemd-analyze
Startup finished in 4.350s (firmware) + 2.102s (loader) + 3.871s (kernel) + 9.512s (userspace) = 19.835s
graphical.target reached after 9.380s in userspace.

O systemd-analyze separa o tempo de cada etapa: firmware (UEFI), loader (GRUB), kernel (com o initramfs) e userspace (serviços). Uma etapa muito maior que as outras é onde investigar; os serviços lentos você acha com systemd-analyze blame e critical-chain (veja Desempenho e Monitoramento). Os números são ilustrativos e variam de máquina para máquina.


Outras peças úteis

ComandoPara quê
mokutil --sb-stateDiz se o Secure Boot está ativo (SecureBoot enabled/disabled)
sudo update-initramfs -uRecria o initramfs do kernel atual (depois de mudar drivers ou criptografia)
sudo grub-reboot "ID"Escolhe uma entrada só para o próximo boot (exige GRUB_DEFAULT=saved)
journalctl -b -1 -p errErros do boot anterior (aquele que falhou)
journalctl --list-bootsLista os boots guardados no log

Formas diferentes de fazer

ObjetivoForma temporáriaForma permanente
Ver o menuEsc ou Shift no bootGRUB_TIMEOUT_STYLE=menu + update-grub
Usar outro kernelEscolher em "Advanced options for Ubuntu"GRUB_DEFAULT=saved + GRUB_SAVEDEFAULT=true
Parâmetro de kernelTecla e no menuGRUB_CMDLINE_LINUX_DEFAULT + update-grub
Evitar kernel novoEscolher o anterior a cada bootapt-mark hold nos metapacotes

Quando não funciona

Mudei o /etc/default/grub e nada mudou

O que aconteceu: faltou gerar o grub.cfg.

Como resolver: sudo update-grub e reinicie. Confira a mensagem done no fim.

Tela preta depois de atualizar

O que aconteceu: quase sempre é o driver de vídeo com o kernel novo.

Como resolver: 1) inicie com o kernel anterior; 2) se não der, edite a entrada com e e acrescente nomodeset; 3) já no sistema, rode sudo apt update && sudo apt upgrade (pode haver correção) e leia journalctl -b -1 -p err. Veja também Quando o Sistema Trava.

Aparece só "grub rescue>"
error: unknown filesystem.
Entering rescue mode...
grub rescue>

O que aconteceu: o GRUB não acha a própria pasta: a partição mudou, foi apagada ou outro sistema sobrescreveu o carregador.

Como resolver: inicie por um pendrive do Ubuntu e reinstale o GRUB com chroot, como mostra Recuperar um Sistema.

O Windows sumiu do menu (dual boot)

O que aconteceu: o GRUB procura outros sistemas com o os-prober, que pode estar desativado.

Como resolver: em /etc/default/grub, descomente ou acrescente GRUB_DISABLE_OS_PROBER=false, confira se o pacote os-prober está instalado e rode sudo update-grub. A saída deve trazer Found Windows Boot Manager….


Exercícios

1. Aplicar mudanças

Você editou /etc/default/grub. Complete o comando que faz a mudança valer:

sudo

2. Qual kernel está rodando?

uname

3. Menu visível

Complete a linha para o menu do GRUB sempre aparecer:

GRUB_TIMEOUT_STYLE=

4. Qual é a ordem correta do boot?

5. Você quer testar o parâmetro nomodeset sem arriscar nada. O que fazer?


Resumo

  • Boot: UEFI → shim/GRUB → kernel (vmlinuz) → initramfs (initrd.img) → systemd → login.
  • O Ubuntu mantém o kernel atual e o anterior; uname -r diz qual está rodando.
  • Menu escondido: Esc (UEFI) ou Shift (BIOS). grub> → digite normal.
  • Mudanças em /etc/default/grub só valem depois de sudo update-grub.
  • Tecla e no menu = parâmetro temporário; GRUB_CMDLINE_LINUX_DEFAULT = permanente.