15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
08.10.2024

Como Corrigir Erros de Atualização e Upgrade do Ubuntu: Um Guia Completo de Solução de Problemas

O sistema de gestão de pacotes APT do Ubuntu é um dos mais fiáveis no ecossistema Linux, mas não é imune a falhas. Quando `apt-get upgrade`, `apt-get dist-upgrade`, ou `do-release-upgrade` apresenta um erro, a causa raiz quase sempre se enquadra numa de cinco categorias: um índice de pacotes desatualizado ou corrompido, cadeias de dependências não resolvidas, um ficheiro de bloqueio desatualizado deixado por um processo que falhou, espaço em disco insuficiente na partição raiz, ou um pacote parcialmente configurado deixado num estado quebrado por uma transação anterior interrompida.

Este guia fornece um fluxo de trabalho de diagnóstico sistemático ao nível de engenheiro para identificar e resolver permanentemente todas as principais classes de erros de atualização do Ubuntu — incluindo casos extremos que os tutoriais genéricos habitualmente ignoram.

Compreender o Que Realmente Corre Mal Durante uma Atualização do Ubuntu

Antes de executar comandos às cegas, vale a pena compreender a mecânica interna. Quando invoca `sudo apt-get upgrade`, o APT realiza uma passagem de resolução de dependências contra a cache de pacotes local em `/var/lib/apt/lists/`. Se essa cache estiver desatualizada, malformada ou fora de sincronização com os repositórios configurados em `/etc/apt/sources.list` e `/etc/apt/sources.list.d/`, o resolvedor falha completamente ou propõe um conjunto de pacotes inconsistente.

A camada dpkg por baixo do APT mantém a sua própria base de dados de estado em `/var/lib/dpkg/`. Se uma instalação ou atualização anterior foi interrompida — por uma falha de energia, uma queda de sessão SSH, ou um `Ctrl+C` manual — o dpkg pode deixar um ou mais pacotes num estado `half-installed` ou `triggers-awaiting`. O APT não pode prosseguir até que o estado do dpkg esteja limpo.

As Cinco Causas Raiz em Resumo

Causa RaizSintomaCorreção Principal
Índice de pacotes desatualizado“404 Not Found” para URLs de pacotes`apt-get update`
Dependências quebradas/não satisfeitas“Unmet dependencies” ou “held broken packages”`apt-get install -f`
Ficheiro de bloqueio desatualizado“Could not get lock /var/lib/dpkg/lock”Remover ficheiros de bloqueio manualmente
Espaço em disco insuficiente“No space left on device”Libertar espaço na partição `/`
Pacote parcialmente configurado“dpkg was interrupted”`dpkg –configure -a`

Solução 1: Atualizar o Índice de Pacotes e Executar uma Atualização Completa

Este é o primeiro passo correto em qualquer fluxo de trabalho de diagnóstico. Execute sempre `update` antes de `upgrade` — não são intercambiáveis.

“`bash

sudo apt-get update

sudo apt-get upgrade

“`

O que cada comando realmente faz:

  • `apt-get update` — Descarrega metadados de pacotes atualizados de cada repositório definido no seu `sources.list`. Não instala nada. Reescreve os ficheiros de índice em `/var/lib/apt/lists/`.
  • `apt-get upgrade` — Resolve e instala versões mais recentes de todos os pacotes atualmente instalados. Nunca removerá um pacote instalado nem instalará um novo para satisfazer uma dependência — esta é uma restrição de segurança deliberada.

Se `apt-get upgrade` ficar retido por pacotes que requerem novas dependências ou a remoção de pacotes conflituosos, escale para:

“`bash

sudo apt-get dist-upgrade

“`

`dist-upgrade` utiliza um resolvedor mais agressivo que tem permissão para instalar novos pacotes e remover os obsoletos para satisfazer o grafo de dependências. É a ferramenta correta para atualizações de versão pontual dentro da mesma versão do Ubuntu (por exemplo, 22.04.1 para 22.04.4).

Nuance crítica: Em servidores de produção, reveja sempre o plano `dist-upgrade` antes de confirmar. Execute `apt-get dist-upgrade –dry-run` primeiro para ver exatamente o que será instalado, atualizado ou removido sem tocar no sistema.

Solução 2: Corrigir Dependências Quebradas e Não Satisfeitas

Um estado de dependência quebrada é uma das razões mais comuns para as atualizações falharem a meio do processo. A correção canónica é:

“`bash

sudo apt-get install -f

“`

O sinalizador `-f` (`–fix-broken`) instrui o APT a tentar corrigir um grafo de dependências quebrado, descarregando e instalando dependências em falta, ou removendo pacotes que não podem ser satisfeitos. Após a conclusão, execute novamente a atualização.

Quando `-f` não é suficiente: Se instalou manualmente pacotes `.deb` fora dos repositórios oficiais (uma prática comum ao instalar software de terceiros), esses pacotes podem fixar dependências em versões específicas que conflituam com as versões do repositório. Identifique-os com:

“`bash

apt-cache policy <package_name>

dpkg -l | grep "^ii" | grep -v "^ii lib"

“`

Verifique as versões “Installed” vs. “Candidate”. Um pacote fixado mostrará um candidato inferior ao que o repositório oferece, ou nenhum candidato. Pode ser necessário remover o pacote conflituoso, concluir a atualização e depois reinstalar uma versão compatível.

Solução 3: Reconfigurar Pacotes Parcialmente Instalados com dpkg

Se uma atualização anterior foi interrompida, a base de dados de estado do dpkg conterá pacotes marcados como `half-configured` ou `half-installed`. O APT recusa-se a prosseguir até que estes sejam resolvidos.

“`bash

sudo dpkg –configure -a

“`

O sinalizador `-a` significa “todos” — o dpkg tentará executar os scripts de configuração pós-instalação (`postinst`) para cada pacote que ficou num estado incompleto. Isto resolve frequentemente erros como:

“`

dpkg was interrupted, you must manually run 'sudo dpkg –configure -a' to correct the problem.

“`

Siga imediatamente com uma atualização de índice e tentativa de atualização:

“`bash

sudo apt-get update && sudo apt-get upgrade

“`

Caso extremo — base de dados dpkg corrompida: Em cenários raros, a própria base de dados dpkg fica corrompida (mais comummente após uma falha de disco ou erro de sistema de ficheiros). Os sintomas incluem `dpkg: error: parsing file '/var/lib/dpkg/status'`. O procedimento de recuperação envolve restaurar a partir da cópia de segurança que o dpkg mantém automaticamente em `/var/backups/dpkg.status*`. Copie a cópia de segurança mais recente sobre o ficheiro de estado corrompido:

“`bash

sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status

sudo dpkg –configure -a

“`

Solução 4: Remover Ficheiros de Bloqueio Desatualizados

O APT e o dpkg utilizam ficheiros de bloqueio para evitar que operações de pacotes concorrentes corrompam a base de dados. Quando um processo que detém um bloqueio falha ou é terminado, o ficheiro de bloqueio permanece no disco. Qualquer invocação subsequente do APT falhará com:

“`

E: Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarily unavailable)

“`

Antes de remover ficheiros de bloqueio, verifique sempre se nenhum processo legítimo os detém:

“`bash

sudo lsof /var/lib/dpkg/lock-frontend

sudo lsof /var/lib/dpkg/lock

sudo lsof /var/cache/apt/archives/lock

“`

Se `lsof` não retornar nenhum resultado, o bloqueio está desatualizado e é seguro removê-lo:

“`bash

sudo rm /var/lib/dpkg/lock-frontend

sudo rm /var/lib/dpkg/lock

sudo rm /var/cache/apt/archives/lock

sudo dpkg –configure -a

sudo apt-get update

“`

Aviso: Nunca remova ficheiros de bloqueio enquanto outro processo `apt`, `apt-get`, `dpkg` ou `unattended-upgrades` estiver a correr ativamente. Fazê-lo num processo ativo irá corromper a base de dados de pacotes. Se `lsof` mostrar um PID ativo, aguarde que esse processo conclua ou investigue por que está bloqueado antes de agir.

Solução 5: Libertar Espaço em Disco na Partição Raiz

As atualizações do Ubuntu — particularmente as atualizações de versão principal — requerem espaço livre substancial na partição raiz. Um ponto de falha comum é `/boot` a encher com imagens de kernel antigas, o que bloqueia completamente a instalação de novos kernels.

Verifique o uso atual do disco:

“`bash

df -h

“`

Verifique especificamente o que está a consumir espaço em `/boot`:

“`bash

du -sh /boot/*

ls /boot/vmlinuz-*

“`

Procedimento sistemático de recuperação de espaço:

“`bash

Remove packages installed as dependencies that are no longer needed

sudo apt-get autoremove –purge

Remove cached .deb files from the local package archive

sudo apt-get clean

Remove old kernel images (keeps the two most recent)

sudo apt-get autoremove –purge

“`

Se `/boot` ainda estiver cheio após `autoremove`, identifique e remova manualmente kernels antigos. Primeiro, encontre o kernel atualmente em execução para não o remover:

“`bash

uname -r

“`

Em seguida, liste os kernels instalados e remova os antigos explicitamente:

“`bash

dpkg -l 'linux-image-*' | grep '^ii'

sudo apt-get purge linux-image-X.X.X-XX-generic

“`

Substitua a string de versão por uma versão de kernel mais antiga — nunca a retornada por `uname -r`.

Se estiver a executar um ambiente de VPS Hosting com um tamanho de partição raiz fixo, este cenário é particularmente comum. Provisionar o seu VPS com alocação de disco adequada desde o início — ou utilizar uma partição `/boot` separada — evita completamente esta classe de falhas.

Solução 6: Limpar Pacotes Redundantes e a Cache APT

A cache de pacotes acumulada e os pacotes órfãos degradam tanto o desempenho do sistema como a fiabilidade das atualizações.

“`bash

sudo apt-get autoremove

sudo apt-get autoclean

sudo apt-get clean

“`

A distinção entre `autoclean` e `clean`:

  • `autoclean` remove ficheiros `.deb` em cache apenas para pacotes que já não podem ser descarregados dos repositórios configurados (ou seja, estão obsoletos). Preserva os ficheiros em cache para pacotes atualmente disponíveis.
  • `clean` remove todos os ficheiros `.deb` em cache incondicionalmente, independentemente de ainda estarem disponíveis. Utilize isto quando precisar de recuperar a quantidade máxima de espaço em disco.

Em servidores onde o espaço em disco é um recurso gerido — como Servidores Dedicados a executar múltiplos serviços — automatizar a limpeza periódica da cache através de um cron job ou temporizador systemd é uma prática operacional sólida.

Solução 7: Resolver Conflitos de Pacotes Específicos Manualmente

Quando `apt-get upgrade` reporta conflitos de pacotes específicos em vez de uma falha geral de dependências, é necessária uma intervenção direcionada.

“`bash

sudo apt-get upgrade –fix-missing

“`

Este sinalizador diz ao APT para ignorar pacotes que não podem ser obtidos (por exemplo, devido a um mirror temporariamente indisponível) e atualizar tudo o resto. É útil quando um único pacote indisponível está a bloquear toda a atualização.

Para remover e reinstalar um pacote conflituoso específico:

“`bash

sudo apt-get remove –purge <package_name>

sudo apt-get install <package_name>

“`

Utilizar `–purge` com `remove` elimina tanto os binários do pacote como os seus ficheiros de configuração, o que é importante quando um ficheiro de configuração corrompido é a fonte real do conflito.

Identificar a fonte exata do conflito: Quando o APT reporta um conflito, a mensagem de erro normalmente nomeia os pacotes envolvidos. Para uma análise mais aprofundada:

“`bash

apt-cache show <package_name>

apt-cache depends <package_name>

apt-cache rdepends <package_name>

“`

`rdepends` (dependências inversas) mostra-lhe quais outros pacotes instalados dependem do pacote em questão — informação crítica antes de remover qualquer coisa.

Solução 8: Realizar uma Atualização de Versão Principal com do-release-upgrade

A atualização entre versões LTS do Ubuntu (por exemplo, 20.04 Focal para 22.04 Jammy, ou 22.04 para 24.04 Noble) requer uma ferramenta dedicada. Utilizar `apt-get dist-upgrade` isoladamente para uma atualização de versão principal não é suportado e produzirá um sistema inconsistente.

O procedimento correto:

“`bash

sudo apt-get update

sudo apt-get dist-upgrade

sudo apt-get autoremove

sudo do-release-upgrade

“`

Por que o `dist-upgrade` pré-atualização é importante: `do-release-upgrade` verifica que o seu sistema atual está completamente atualizado antes de iniciar a transição de versão. Se tiver pacotes retidos ou dependências não resolvidas, recusará prosseguir. Executar `dist-upgrade` primeiro garante uma base limpa.

Considerações específicas para servidores com `do-release-upgrade`:

  • Em servidores sem interface gráfica acedidos via SSH, execute sempre `do-release-upgrade` dentro de uma sessão `tmux` ou `screen`. Se a sua ligação SSH cair a meio da atualização, o processo continua em segundo plano em vez de ser terminado, o que deixaria o sistema num estado intermédio quebrado.
  • Utilize o sinalizador `-d` apenas ao atualizar para uma versão de desenvolvimento (ainda não estável como LTS). Para sistemas de produção, nunca utilize `-d`.
  • A ferramenta irá solicitar-lhe que reveja as alterações aos ficheiros de configuração modificados em relação aos seus valores predefinidos. Leia estes avisos com atenção — aceitar cegamente a versão do mantenedor pode sobrescrever configurações personalizadas do servidor.

“`bash

Start a persistent session before upgrading

tmux new -s upgrade

sudo do-release-upgrade

“`

Se gerir múltiplos servidores Ubuntu — por exemplo, uma frota de instâncias VPS com cPanel — teste o caminho de atualização num nó não produtivo primeiro. O cPanel e painéis de controlo semelhantes têm frequentemente janelas de suporte de versão do Ubuntu específicas que ficam atrás do ciclo de lançamento oficial.

Solução 9: Corrigir Problemas de Repositórios de Terceiros

Uma causa frequentemente ignorada de erros de atualização é um PPA (Personal Package Archive) ou repositório de terceiros quebrado ou incompatível. Quando um PPA é adicionado para uma versão do Ubuntu e atualiza para a seguinte, o PPA pode não ter pacotes para o novo codinome de versão, fazendo com que `apt-get update` apresente erros como:

“`

E: The repository 'http://ppa.launchpad.net/…' does not have a Release file.

“`

Liste todos os repositórios configurados:

“`bash

ls /etc/apt/sources.list.d/

cat /etc/apt/sources.list

“`

Desative temporariamente PPAs problemáticos comentando ou removendo os seus ficheiros `.list` em `/etc/apt/sources.list.d/`, conclua a atualização do sistema e depois reative-os ou substitua-os por versões compatíveis com a nova versão.

“`bash

sudo add-apt-repository –remove ppa:<ppa_name>/<ppa_name>

“`

Solução 10: Reiniciar para Eliminar Interferências ao Nível do Processo

Certas falhas de atualização são causadas pelo estado em memória em vez de problemas ao nível do disco — por exemplo, um serviço em execução que mantém um identificador de ficheiro numa biblioteca que o APT precisa de substituir, ou um módulo de kernel que conflitua com uma versão recentemente instalada.

“`bash

sudo reboot

“`

Após o reinício, execute a sequência de atualização completa a partir de um estado limpo:

“`bash

sudo apt-get update && sudo apt-get upgrade

“`

Em servidores remotos onde um reinício acarreta risco operacional, utilize `needrestart` para identificar quais os serviços que precisam de ser reiniciados sem um reinício completo do sistema:

“`bash

sudo apt-get install needrestart

sudo needrestart

“`

`needrestart` inspeciona os processos em execução e identifica aqueles que utilizam bibliotecas partilhadas desatualizadas, permitindo-lhe reiniciar apenas os serviços afetados em vez de todo o sistema.

Prevenir Erros de Atualização do Ubuntu: Melhores Práticas Operacionais

A resolução de problemas reativa é necessária, mas a higiene proativa do sistema elimina a maioria destas falhas antes de ocorrerem.

Lista de verificação de manutenção para servidores Ubuntu:

  • Execute `sudo apt-get update && sudo apt-get upgrade` regularmente — semanalmente no mínimo para sistemas de produção.
  • Monitorize o espaço em disco em `/`, `/boot` e `/var` com limiares de alerta (85% de utilização é um gatilho razoável).
  • Audite PPAs de terceiros antes de cada ciclo de atualização principal.
  • Execute sempre atualizações principais dentro de `tmux` ou `screen` em sistemas remotos.
  • Mantenha um snapshot ou cópia de segurança antes de qualquer operação `do-release-upgrade`. Num Servidor Dedicado ou VPS, isto significa tirar uma imagem completa do disco ou snapshot do sistema de ficheiros antes de iniciar a atualização.
  • Teste os procedimentos de atualização num ambiente de staging antes de aplicar em produção.
  • Utilize `unattended-upgrades` apenas para patches de segurança, não para atualizações completas de pacotes, para evitar alterações inesperadas de dependências em sistemas de produção.

Para equipas que gerem infraestrutura web — incluindo ambientes de Alojamento Web Partilhado ou servidores de aplicações multi-inquilino — estabelecer um runbook de atualização documentado que inclua etapas de verificação pré-atualização, procedimentos de reversão e testes de validação pós-atualização é uma prática operacional essencial.

Matriz de Decisão: Qual Correção Aplicar Primeiro

Mensagem de ErroPrimeira AçãoSegunda Ação
“Could not get lock”Verificar `lsof`, remover ficheiros de bloqueio desatualizados`dpkg –configure -a`
“Unmet dependencies”`apt-get install -f``dpkg –configure -a`
“No space left on device”`apt-get autoremove –purge && apt-get clean`Remover manualmente kernels antigos
“dpkg was interrupted”`dpkg –configure -a``apt-get update && apt-get upgrade`
“404 Not Found” para pacotes`apt-get update` (verificar disponibilidade do mirror)Desativar PPAs quebrados
“held broken packages”`apt-get dist-upgrade –dry-run`Remover/reinstalar pacote conflituoso
Queda de SSH durante a atualizaçãoReconectar e anexar à sessão `tmux`/`screen``dpkg –configure -a` se a sessão foi perdida

FAQ

Por que `apt-get upgrade` deixa alguns pacotes como “held back”?

Os pacotes ficam retidos quando atualizá-los exigiria instalar novos pacotes ou remover os existentes — ações que `apt-get upgrade` não tem permissão para realizar por design. Utilize `apt-get dist-upgrade` para resolver pacotes retidos, mas reveja sempre as alterações propostas com `–dry-run` primeiro em sistemas de produção.

É seguro remover ficheiros de bloqueio de `/var/lib/dpkg/`?

Apenas se nenhum processo APT ou dpkg estiver a correr ativamente. Verifique com `sudo lsof /var/lib/dpkg/lock-frontend` antes de remover. Se um processo ativo detiver o bloqueio e remover o ficheiro, irá corromper a base de dados de pacotes, o que requer recuperação manual a partir da cópia de segurança do estado dpkg.

Qual é a diferença entre `apt-get upgrade` e `apt-get dist-upgrade`?

`apt-get upgrade` nunca remove pacotes instalados nem instala novos para resolver dependências — apenas atualiza pacotes que podem ser satisfeitos sem alterações estruturais. `apt-get dist-upgrade` utiliza um resolvedor mais inteligente que pode instalar novos pacotes e remover os obsoletos. Para atualizações de versão pontual e atualizações de versão principal, `dist-upgrade` é a ferramenta correta.

Por que `do-release-upgrade` falha imediatamente após executá-lo?

A razão mais comum é que o sistema atual tem dependências não resolvidas ou pacotes retidos. Execute `sudo apt-get dist-upgrade` e `sudo apt-get autoremove` para trazer o sistema a um estado totalmente consistente antes de invocar `do-release-upgrade`. Verifique também que todos os PPAs de terceiros estão desativados ou são compatíveis com a versão alvo.

Quanto espaço livre em disco é necessário para uma atualização principal de versão do Ubuntu?

Como mínimo prático, precisa de pelo menos 2–3 GB livres na partição raiz e pelo menos 200–300 MB livres em `/boot`. O requisito real varia com base no número de pacotes instalados. Execute `sudo do-release-upgrade` com o sistema nestes limiares ou acima deles; se o espaço for limitado, execute `sudo apt-get autoremove –purge && sudo apt-get clean` imediatamente antes de iniciar a atualização.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar