SSD Nodes Learn Hosting plans →
Guias Matt ConnorPor Matt Connor

Como corrigir fontes APT duplicadas e ficheiros .sources

Veja como localizar o .list antigo e o .sources deb822 duplicado no Ubuntu 24.04+, manter apenas uma entrada e fazer o apt update terminar sem avisos.

O que significa o erro de fontes APT duplicadas

Fontes APT duplicadas significam que um repositório foi declarado duas vezes, em dois ficheiros diferentes, e o APT (advanced package tool) encontrou ambas as cópias. No Ubuntu 24.04 e versões posteriores, isto quase sempre acontece porque um script de instalação de terceiros escreveu um ficheiro antigo de uma linha .list, embora já existisse no disco um ficheiro deb822 .sources para o mesmo repositório. Nada está corrompido e nenhum pacote está em risco. Elimine uma das duas declarações para que a mensagem desapareça.

Esta é a linha que as pessoas colam numa caixa de pesquisa:

W: Target Packages (stable/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list.d/docker.list:1 and /etc/apt/sources.list.d/docker.sources:1

Leia-a a partir do fim. Dois ficheiros, cada um com um número de linha, declaram a mesma coisa. Target Packages é o índice que o apt descarrega para saber que pacotes um repositório disponibiliza, e stable/binary-amd64/Packages identifica o componente (stable) e a arquitetura (amd64) abrangidos por esse índice. Portanto, o apt está a informar que o índice amd64 do componente stable está configurado em docker.list, na linha 1, e novamente em docker.sources, na linha 1.

No apt 3.0 e versões posteriores, ou seja, a partir do Ubuntu 25.04 e no Debian 13, a mesma mensagem começa com Warning: em vez de W:. O texto depois do prefixo é igual.

Esse aviso é o caso menos grave. O apt combina as duas declarações e a atualização continua, porque ambas descrevem o mesmo arquivo com a mesma chave. O caso grave interrompe tudo:

E: Conflicting values set for option Signed-By regarding source https://download.docker.com/linux/ubuntu/ noble: /usr/share/keyrings/docker-archive-keyring.gpg != /etc/apt/keyrings/docker.asc
E: The list of sources could not be read.

Neste caso, o apt recusa continuar porque as duas declarações indicam chaves de assinatura diferentes para um único arquivo. O apt combina duas declarações idênticas, mas não escolhe entre dois valores Signed-By, porque escolher o valor errado faria a validação das assinaturas dos pacotes contra uma chave que o proprietário do arquivo nunca usou para assinar. Por isso, o apt não lê nenhuma fonte. apt update e apt install falham com as mesmas duas linhas até editar os ficheiros manualmente.

Como o duplicado aparece

Os dois formatos ficam em ficheiros separados, com extensões diferentes, por isso nada no disco impede que ambos existam. O apt deteta a sobreposição tarde, quando expande cada ficheiro de fontes para a lista de destinos de índices que pretende transferir. Até esse momento, docker.list e docker.sources são dois ficheiros sem relação entre si.

Quatro eventos comuns produzem este par:

  • Um script de instalação de um fornecedor, ou um comando copiado de uma publicação antiga, escreve /etc/apt/sources.list.d/vendor.list com uma linha tee.
  • Mais tarde, o próprio pacote do fornecedor disponibiliza /etc/apt/sources.list.d/vendor.sources e instala-o por si.
  • add-apt-repository no Ubuntu 24.04 e posteriores escreve ficheiros .sources em formato deb822, por isso uma PPA (arquivo pessoal de pacotes) que adicionou manualmente no passado como .list reaparece como .sources.
  • Uma atualização da versão reescreveu as próprias fontes da distribuição em formato deb822 e deixou o seu ficheiro .list criado manualmente intacto ao lado delas.

Cada caminho é razoável por si só. O duplicado surge quando dois deles acontecem no mesmo sistema, muitas vezes com meses de intervalo.

Os dois formatos, lado a lado

O formato antigo usa uma linha por repositório, e cada parte tem uma posição definida.

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable

A ordem é fixa: o tipo (deb para pacotes binários, deb-src para pacotes-fonte), depois as opções entre parênteses retos, o URI (uniform resource identifier) do arquivo, a suite e, por fim, um ou mais componentes. Como o significado depende da posição, um espaço no local errado altera a forma como o apt interpreta a entrada.

O deb822 representa a mesma informação como um bloco de campos nomeados. O nome vem da RFC 822, o formato de cabeçalhos de correio que o Debian já usa nos ficheiros de controlo dos pacotes.

Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

O mesmo repositório, a mesma chave, sem nada acrescentado. O mapeamento é direto: deb torna-se Types, o endereço do arquivo torna-se URIs, a suite torna-se Suites, os componentes tornam-se Components e cada opção entre parênteses retos torna-se o seu próprio campo; assim, signed-by= torna-se Signed-By: e arch= torna-se Architectures:.

Todos os nomes de campos estão no plural porque cada campo aceita uma lista separada por espaços. Suites: noble noble-updates noble-backports num bloco substitui três linhas deb separadas. Uma linha em branco termina um bloco, por isso um único ficheiro .sources pode conter vários repositórios. O deb822 também permite definir opções que o formato de uma linha trata mal: Enabled: no para desativar um repositório, Trusted, Check-Valid-Until e uma chave incorporada colada diretamente em Signed-By, com cada linha indentada por um espaço e as linhas em branco escritas como um único ponto.

Onde cada ficheiro fica

  • /etc/apt/sources.list: o ficheiro único original. No Ubuntu 24.04 e versões posteriores, normalmente está vazio ou contém apenas um comentário que aponta para a nova localização.
  • /etc/apt/sources.list.d/*.list: entradas de uma linha, normalmente um ficheiro por repositório.
  • /etc/apt/sources.list.d/*.sources: blocos deb822. O Ubuntu 24.04 e versões posteriores mantêm aqui os repositórios da própria distribuição, em ubuntu.sources.
  • /etc/apt/keyrings/: local onde devem ficar as chaves adicionadas por si. /usr/share/keyrings/ contém as chaves provenientes de um pacote.

apt lê apenas ficheiros que terminam em .list ou .sources, e o nome do ficheiro pode conter letras, dígitos, sublinhado, hífen e ponto. Um ficheiro com qualquer outra extensão é ignorado com um aviso, o que é relevante para a correção apresentada abaixo.

Identificar o par duplicado

Comece pela listagem do diretório:

ls -l /etc/apt/sources.list.d/
-rw-r--r-- 1 root root  195 Aug  3 09:12 docker.list
-rw-r--r-- 1 root root  254 Aug  9 14:40 docker.sources
-rw-r--r-- 1 root root 2683 Jun 11 08:02 ubuntu.sources

Dois ficheiros com o mesmo nome base e extensões diferentes são o par habitual, mas não confie nos nomes. Leia o conteúdo, porque uma duplicação pode estar escondida num ficheiro com qualquer nome:

grep -rn -E '^(deb |deb-src |Types:|URIs:|Suites:|Signed-By:)' /etc/apt/sources.list /etc/apt/sources.list.d/
/etc/apt/sources.list.d/docker.list:1:deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu noble stable
/etc/apt/sources.list.d/docker.sources:1:Types: deb
/etc/apt/sources.list.d/docker.sources:2:URIs: https://download.docker.com/linux/ubuntu
/etc/apt/sources.list.d/docker.sources:3:Suites: noble
/etc/apt/sources.list.d/docker.sources:6:Signed-By: /etc/apt/keyrings/docker.asc

O par é formado pelas duas entradas com o mesmo host e a mesma suite. Ambas apontam para https://download.docker.com/linux/ubuntu e para a suite noble, portanto são o mesmo repositório escrito duas vezes. Os caminhos Signed-By também são diferentes, o que produz o erro Conflicting values mostrado anteriormente.

Use grep em vez de um comando apt nesta etapa. Quando o apt já está a parar devido ao conflito, também não consegue listar as fontes; por isso, apt-cache policy apresenta o mesmo erro em vez da resposta pretendida.

Corrija: mantenha o ficheiro deb822 e remova o ficheiro legado

Mantenha o ficheiro .sources. Este é o formato que as ferramentas do apt escrevem atualmente e é aquele para o qual Debian e Ubuntu estão a migrar. Antes de eliminar qualquer coisa, confirme qual dos dois caminhos principais existe no disco:

ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker
-rw-r--r-- 1 root root 4813 Aug  9 14:40 docker.asc

Apenas /etc/apt/keyrings/docker.asc está presente. Portanto, o ficheiro deb822 é o que contém a configuração correta, e o ficheiro .list aponta para uma chave que foi removida. Se o ficheiro que pretende manter indicar a chave em falta, copie primeiro para ele o caminho válido e elimine depois o outro ficheiro.

Mova o ficheiro legado para fora do diretório em vez de o eliminar diretamente:

sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt update

Também pode mudar-lhe o nome para docker.list.bak e deixá-lo no diretório, porque o apt ignora extensões desconhecidas. Nesse caso, porém, cada execução do apt apresenta:

N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extension

Mover o ficheiro para outro local evita essa mensagem e mantém a cópia de segurança. Depois disso, um apt update correto tem este aspeto, sem nenhuma linha que nomeie dois ficheiros:

Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 https://download.docker.com/linux/ubuntu noble InRelease [48.8 kB]
Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Fetched 175 kB in 1s (146 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

Agora confirme que o repositório continua a funcionar depois da alteração:

apt-cache policy | grep download.docker.com
 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
     origin download.docker.com

Se a documentação do fornecedor ainda pressupuser o ficheiro de uma linha, pode manter esse ficheiro e eliminar o ficheiro .sources. A regra é a mesma em qualquer caso: apenas um ficheiro pode declarar um determinado arquivo, suite e componente. São permitidas entradas separadas para componentes ou arquiteturas diferentes do mesmo arquivo, mas opções como Signed-By aplicam-se a todas as entradas com o mesmo URI e suite. Por isso, têm de ser iguais em todas elas.

Por que uma fonte de terceiros com problemas bloqueia o apt update

A falha ao lado parece diferente, mas tem a mesma causa: uma fonte de terceiros que o apt não consegue utilizar. A primeira versão envolve uma chave em falta:

Err:5 https://download.docker.com/linux/ubuntu noble InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
E: The repository 'https://download.docker.com/linux/ubuntu noble InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.

O apt não tem uma chave utilizável para a assinatura do ficheiro InRelease do arquivo. Ou Signed-By aponta para um ficheiro que não contém uma chave utilizável, ou o campo está em falta e nenhum dos keyrings em que o apt confia globalmente contém a chave usada pelo arquivo para assinar. O apt descarta então todo esse repositório, em vez de confiar em listas de pacotes que não consegue verificar. Consulte o próprio ficheiro da chave:

ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.asc

Uma chave válida apresenta uma linha pub com um ID de chave e uma linha uid com o nome do fornecedor. gpg: no valid OpenPGP data found. significa que o ficheiro não é uma chave, o que normalmente acontece porque o download guardou uma página de erro depois de o URL da chave ter mudado. Obtenha a chave novamente, verifique o ficheiro e execute apt update.

A segunda versão surge depois de uma atualização da versão do sistema:

Err:6 https://ppa.launchpadcontent.net/ondrej/php/ubuntu plucky InRelease
  404  Not Found [IP: 10.0.0.80 443]
E: The repository 'https://ppa.launchpadcontent.net/ondrej/php/ubuntu plucky Release' does not have a Release file.

A PPA não publicou nada para essa suite, por isso o caminho não existe no servidor e o pedido devolve 404. Os outros repositórios continuam a ser atualizados e os pacotes que já tem não são alterados. No entanto, a execução termina com um código diferente de zero. Assim, qualquer script que verifique o estado de saída de apt update passa a indicar uma falha sempre que é executado. Por isso, vale a pena remover uma fonte inativa num servidor com atualizações de segurança não assistidas configuradas: é no ruído diário que uma falha real fica escondida. Os scripts de instalação dos fornecedores encontram as duas versões deste problema. É por isso que a maioria dos erros de instalação do Tailscale no Ubuntu resulta de um keyring que o script nunca criou ou de um codinome de versão que o arquivo não disponibiliza.

Desativar uma fonte sem afetar as restantes

Num ficheiro deb822, adicione um campo ao bloco e guarde-o:

Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: no

O manual do apt recomenda este método em vez de comentar cada linha do bloco, e é mais fácil revertê-lo. Num ficheiro de uma linha, coloque um # no início da linha. Em qualquer dos formatos, também pode mover o ficheiro para fora de /etc/apt/sources.list.d/. Escolha esta opção quando o repositório tiver sido removido definitivamente.

Execute sudo apt update novamente. O bloco Err: desse repositório desaparece e o estado de saída volta a ser 0. Pode confirmar isso com echo $? na linha seguinte.

Nunca corrija uma fonte com problemas usando sudo rm /etc/apt/sources.list.d/*. No Ubuntu 24.04 e posteriores, esse comando elimina ubuntu.sources, que contém os repositórios da própria distribuição. O apt fica então sem quaisquer listas de pacotes e comunica E: Unable to locate package curl para software que existe claramente. Se já executou esse comando, reponha o ficheiro:

Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Guarde-o como /etc/apt/sources.list.d/ubuntu.sources, substituindo noble pelo nome da sua própria versão, obtido em lsb_release -cs. Depois execute sudo apt update.

Converter ficheiros .list antigos para deb822

A partir de outubro de 2026, o apt 3.0 e versões posteriores incluem um conversor para esta finalidade. O Debian 13 inclui-o, tal como o Ubuntu 25.04 e todas as versões posteriores, incluindo a 26.04. Verifique a versão e execute o comando:

apt --version
sudo apt modernize-sources

O comando reescreve os ficheiros de uma linha em /etc/apt/sources.list.d/ como ficheiros deb822 .sources. Leia o resultado apresentado, liste depois o diretório manualmente e execute apt update antes de confiar no resultado. O Ubuntu 24.04 inclui uma versão mais antiga do apt, sem este subcomando; nessa versão, o comando devolve E: Invalid operation modernize-sources. Nessa versão, faça a conversão manualmente usando o mapeamento de campos acima.

A conversão é opcional por enquanto, porque o apt continua a ler os dois formatos. É útil fazê-la num servidor que pretende manter, já que add-apt-repository e os próprios ficheiros da distribuição já usam deb822, e um único formato é mais fácil de ler e pesquisar. A conversão não impede que este tipo de duplicado volte a aparecer. Algumas ferramentas continuam a escrever fontes numa linha: por exemplo, o cloud-init escreve /etc/apt/sources.list em vez de um ficheiro deb822 quando a configuração recebida não está no formato deb822, e os comandos de instalação copiados continuam a tee .list ficheiros. Volte a executar a verificação grep acima sempre que uma dessas ferramentas tiver alterado o servidor.

Mantenha as fontes de terceiros organizadas no servidor

Os repositórios de terceiros são a parte de um servidor que mais envelhece mal. Cada um é uma promessa de outra entidade de continuar a publicar pacotes para a sua versão do Ubuntu, e uma atualização de versão testa todas essas promessas na mesma tarde.

  • Adicione um repositório de terceiros apenas quando o pacote da distribuição não for suficiente. Uma stack LAMP no Ubuntu 24.04 simples não precisa de nenhum: o arquivo do Ubuntu contém todos os pacotes utilizados, com atualizações de segurança durante todo o ciclo de vida da versão.
  • Mantenha as chaves em /etc/apt/keyrings/, um ficheiro por fornecedor, com o modo 644. O utilizador sem privilégios _apt faz o download e precisa de ler a chave. Por isso, um ficheiro de chave legível apenas por root gera um erro de permissões em cada obtenção desse repositório.
  • Aponte Signed-By para esse ficheiro exato em cada stanza. Uma chave guardada em /etc/apt/trusted.gpg ou /etc/apt/trusted.gpg.d/ é considerada confiável para todos os repositórios do servidor. Isso significa que uma chave de fornecedor adicionada há anos pode validar pacotes de qualquer origem.
  • Antes de uma atualização de versão, leia as fontes configuradas e confirme que cada fornecedor já publica pacotes para a suite de destino.

Uma chave no keyring global antigo é apresentada em todas as atualizações:

W: https://download.docker.com/linux/ubuntu/dists/noble/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

Exporte essa chave isolada para o seu próprio ficheiro e aponte a stanza para esse ficheiro:

gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --export 7EA0A9C3F273FCD8 | sudo tee /etc/apt/keyrings/docker.gpg > /dev/null
sudo chmod 644 /etc/apt/keyrings/docker.gpg

Adicione Signed-By: /etc/apt/keyrings/docker.gpg à stanza do repositório e execute sudo apt update. O aviso desaparece quando nenhum repositório depender do keyring antigo. Depois, pode remover a entrada com sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.

Outro hábito evita a maioria dos problemas. do-release-upgrade desativa as fontes de terceiros durante a atualização e deixa-as desativadas depois. Reativá-las manualmente, uma de cada vez, é precisamente o ponto em que são criadas declarações duplicadas. Leia o guia de atualização do Ubuntu 24.04 para 26.04 antes de começar e anote os repositórios de que ainda precisa. Numa máquina que acabou de configurar, o momento mais simples para corrigir as fontes é durante os primeiros dez minutos num VPS novo, enquanto as únicas entradas no servidor são as fornecidas pelo Ubuntu.

FAQ

Por que o apt informa que um destino está configurado várias vezes?

Isso acontece porque dois ficheiros em /etc/apt/sources.list.d/ declaram o mesmo repositório, suite e componente. A mensagem identifica os dois ficheiros com os números das linhas, como docker.list:1 e docker.sources:1. O apt combina as entradas e continua, por isso a atualização ainda funciona. Mesmo assim, vale a pena remover a duplicação: assim que os dois ficheiros especificarem chaves de assinatura diferentes, o apt para com E: Conflicting values set for option Signed-By e recusa ler qualquer fonte, o que também bloqueia apt install.

Devo manter o ficheiro .list ou o ficheiro .sources?

Mantenha o ficheiro .sources. O deb822 é o formato que add-apt-repository grava no Ubuntu 24.04 e mais recente. Ele usa um campo identificado para cada configuração, em vez de texto posicional entre parênteses retos, e é o formato adotado pelas distribuições. Antes de eliminar o ficheiro .list, confirme, com ls -l /etc/apt/keyrings/, que o caminho Signed-By dentro do ficheiro .sources aponta para uma chave existente. Mova o ficheiro antigo para fora de /etc/apt/sources.list.d/ em vez de o renomear dentro do diretório, porque um nome .bak deixado no diretório faz o apt mostrar um aviso sobre ficheiro ignorado em cada execução.

Como desativo um repositório apt sem o remover?

Num ficheiro .sources deb822, adicione Enabled: no ao bloco. Num ficheiro .list de uma linha, coloque um # no início da linha. Em ambos os casos, execute sudo apt update depois, e o bloco Err: desse repositório deixa de aparecer. Esta é a opção correta quando um repositório de terceiros ainda não tem pacotes para a sua versão do Ubuntu e o erro 404 faz apt update terminar com um código diferente de zero.

O formato de uma linha do sources.list vai desaparecer?

Está obsoleto, mas não foi removido. O apt ainda lê ficheiros .list, e o manual atual do apt do Debian informa que o formato poderá ser removido no futuro, mas não antes de 2029. Por isso, nada no servidor deixa de funcionar amanhã. As ferramentas novas gravam deb822: o Ubuntu 24.04 e mais recente mantém os repositórios da distribuição em /etc/apt/sources.list.d/ubuntu.sources, e add-apt-repository grava ficheiros .sources. No apt 3.0 e mais recente, sudo apt modernize-sources converte os ficheiros que ainda existirem.

#apt#ubuntu#deb822#package-management#troubleshooting