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.
- 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/grubcom 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
- 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. - shim e GRUB: o
shimx64.efié um pequeno programa assinado que permite ligar com o Secure Boot ativo. Ele chama ogrubx64.efi, o GRUB (GRand Unified Bootloader), que mostra o menu e carrega o kernel. - Kernel: o arquivo
/boot/vmlinuz-…. É o núcleo do Linux: assume o controle do hardware. - initramfs: o arquivo
/boot/initrd.img-…, um mini-sistema temporário com os drivers necessários para encontrar e montar o disco de verdade. - 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).
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
- Faça uma cópia de segurança do arquivo:
$ sudo cp /etc/default/grub /etc/default/grub.bak
- Edite e troque as duas linhas:
$ sudo nano /etc/default/grub
GRUB_TIMEOUT_STYLE=menu GRUB_TIMEOUT=5
- 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/grube os scripts de/etc/grub.d/e escreve/boot/grub/grub.cfg.
/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:
- Reinicie e abra o menu do GRUB (Esc ou Shift).
- Escolha Advanced options for Ubuntu.
- 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). - 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âmetro | Significado |
|---|---|
root=UUID=… | Em que partição está o sistema |
ro | Monta o disco como somente leitura no início (o systemd remonta como escrita depois) |
quiet | Esconde as mensagens do kernel |
splash | Mostra a animação de boot do Ubuntu |
nomodeset | Não carrega o driver de vídeo completo. Salva-vidas para tela preta |
systemd.unit=rescue.target | Sobe só o mínimo e pede a senha de root (modo de resgate) |
Só para este boot: a tecla e
- No menu do GRUB, selecione a entrada e pressione e (de edit).
- Ache a linha que começa com
linux. Ela termina comro quiet splash. - Edite: por exemplo, apague
quiet splashpara ver as mensagens, ou acrescentenomodesetno fim. - 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
| Comando | Para quê |
|---|---|
mokutil --sb-state | Diz se o Secure Boot está ativo (SecureBoot enabled/disabled) |
sudo update-initramfs -u | Recria 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 err | Erros do boot anterior (aquele que falhou) |
journalctl --list-boots | Lista os boots guardados no log |
Formas diferentes de fazer
| Objetivo | Forma temporária | Forma permanente |
|---|---|---|
| Ver o menu | Esc ou Shift no boot | GRUB_TIMEOUT_STYLE=menu + update-grub |
| Usar outro kernel | Escolher em "Advanced options for Ubuntu" | GRUB_DEFAULT=saved + GRUB_SAVEDEFAULT=true |
| Parâmetro de kernel | Tecla e no menu | GRUB_CMDLINE_LINUX_DEFAULT + update-grub |
| Evitar kernel novo | Escolher o anterior a cada boot | apt-mark hold nos metapacotes |
Quando não funciona
O que aconteceu: faltou gerar o grub.cfg.
Como resolver: sudo update-grub e reinicie. Confira a mensagem done no fim.
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.
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 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:
2. Qual kernel está rodando?
3. Menu visível
Complete a linha para o menu do GRUB sempre aparecer:
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 -rdiz qual está rodando. - Menu escondido: Esc (UEFI) ou Shift (BIOS).
grub>→ digitenormal. - Mudanças em
/etc/default/grubsó valem depois desudo update-grub. - Tecla e no menu = parâmetro temporário;
GRUB_CMDLINE_LINUX_DEFAULT= permanente.