Dubbele apt-bronnen oplossen in Ubuntu en Debian
Krijgt u de foutmelding dat een target meerdere keren is geconfigureerd? Leer hoe u dubbele .list en .sources bestanden verwijdert voor een foutloze apt update uitvoering.
Wat de foutmelding over dubbele apt-bronnen betekent
Een dubbele apt-bron betekent dat een repository twee keer is gedeclareerd in twee verschillende bestanden, en dat APT (advanced package tool) beide kopieën heeft gevonden. Op Ubuntu 24.04 en nieuwer gebeurt dit bijna altijd omdat een installatiescript van derden een oud .list-bestand met één regel heeft aangemaakt, terwijl er al een deb822 .sources-bestand voor dezelfde repository op de schijf stond. Er is niets beschadigd en er loopt geen enkel pakket gevaar. Verwijder een van de twee declaraties en de melding verdwijnt.
Dit is de regel die mensen in een zoekveld plakken:
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:1Lees deze vanaf het einde. Twee bestanden, elk met een regelnummer, declareren hetzelfde. Target Packages is de index die apt downloadt om te achterhalen welke pakketten een repository aanbiedt, en stable/binary-amd64/Packages benoemt de component (stable) en de architectuur (amd64) die die index beslaat. Apt vertelt u dus dat de amd64-index voor de stable-component is geconfigureerd in docker.list op regel 1, en opnieuw in docker.sources op regel 1.
Op apt 3.0 en nieuwer, wat staat voor Ubuntu 25.04 en later en Debian 13, begint dezelfde melding met Warning: in plaats van W:. De tekst na het voorvoegsel is hetzelfde.
Die waarschuwing is het milde geval. apt voegt de twee declaraties samen en de update wordt nog steeds uitgevoerd, omdat beide hetzelfde archief met dezelfde sleutel beschrijven. Het ernstige geval blokkeert alles:
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.apt weigert hier actie te ondernemen omdat de twee declaraties verschillende ondertekeningssleutels voor één archief benoemen. Het voegt twee identieke declaraties samen, maar het zal niet kiezen tussen twee Signed-By-waarden, omdat het kiezen van de verkeerde waarde betekent dat pakketondertekeningen worden gecontroleerd tegen een sleutel waarmee de eigenaar van het archief nooit heeft ondertekend. Dus apt leest helemaal geen bronnen. apt update en apt install falen beide met diezelfde twee regels totdat u de bestanden handmatig bewerkt.
Hoe de dubbele vermelding ontstaat
De twee formaten bevinden zich in afzonderlijke bestanden met verschillende extensies, dus niets op de schijf verhindert dat ze beide bestaan. apt merkt de overlap pas laat op, wanneer het elk bronbestand uitbreidt naar de lijst met indexdoelen die het wil ophalen. Tot dat moment zijn docker.list en docker.sources twee ongerelateerde bestanden.
Vier alledaagse gebeurtenissen veroorzaken dit paar:
- Een installatiescript van een leverancier, of een commando gekopieerd uit een ouder bericht, schrijft
/etc/apt/sources.list.d/vendor.listmet eentee-regel. - Het pakket van de leverancier zelf levert later
/etc/apt/sources.list.d/vendor.sourcesen installeert dit voor u. add-apt-repositoryop Ubuntu 24.04 en nieuwer schrijft deb822.sources-bestanden, waardoor een PPA (personal package archive) die u ooit handmatig toevoegde als een.list, terugkomt als een.sources.- Een release-upgrade heeft de bronnen van de distributie zelf herschreven naar deb822 en liet uw handgeschreven
.list-bestand ongemoeid daarnaast staan.
Elk pad is op zichzelf logisch. De dubbele vermelding ontstaat wanneer twee van deze gebeurtenissen op hetzelfde systeem plaatsvinden, vaak maanden na elkaar.
De twee formaten, naast elkaar
Het oude formaat bestaat uit één regel per repository, waarbij elk onderdeel positioneel is.
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stableDe volgorde staat vast: het type (deb voor binaire pakketten, deb-src voor broncodepakketten), gevolgd door opties tussen vierkante haken, daarna de URI (uniform resource identifier) van het archief, de suite, en tot slot een of meer componenten. Omdat de betekenis wordt bepaald door de positie, verandert een spatie op de verkeerde plek de interpretatie door apt.
deb822 vermeldt hetzelfde als een blok met benoemde velden. De naam is afgeleid van RFC 822, de stijl voor e-mailheaders die Debian al gebruikt voor pakketcontrolebestanden.
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascDezelfde repository, dezelfde sleutel, niets toegevoegd. De toewijzing is direct: deb wordt Types, het archiefadres wordt URIs, de suite wordt Suites, de componenten worden Components, en elke optie tussen haken wordt een eigen veld; zo wordt signed-by= tot Signed-By: en arch= tot Architectures:.
Elke veldnaam is meervoudig omdat elk veld een door spaties gescheiden lijst accepteert. Suites: noble noble-updates noble-backports in één blok vervangt drie afzonderlijke deb-regels. Een lege regel beëindigt een blok, waardoor één .sources-bestand meerdere repositories kan bevatten. deb822 ondersteunt ook instellingen die in het eenregelige formaat slecht werken: Enabled: no om een repository uit te schakelen, Trusted, Check-Valid-Until, en een inline-sleutel die direct in Signed-By wordt geplakt, waarbij elke regel één spatie is ingesprongen en lege regels als een enkele punt worden geschreven.
Waar elk bestand zich bevindt
/etc/apt/sources.list: het oorspronkelijke enkele bestand. Op Ubuntu 24.04 en nieuwer is dit meestal leeg of bevat het alleen een opmerking die naar de nieuwe locatie verwijst./etc/apt/sources.list.d/*.list: vermeldingen van één regel, normaal gesproken één bestand per repository./etc/apt/sources.list.d/*.sources: deb822-stanzas. Ubuntu 24.04 en nieuwer bewaren de eigen repositories van de distributie hier, inubuntu.sources./etc/apt/keyrings/: waar sleutels die u toevoegt thuishoren./usr/share/keyrings/bevat sleutels die afkomstig zijn van een pakket.
apt leest alleen bestanden die eindigen op .list of .sources, en een bestandsnaam mag letters, cijfers, underscores, koppeltekens en punten bevatten. Een bestand met een andere extensie wordt overgeslagen met een melding; dit is van belang voor de onderstaande correctie.
Het dubbele paar vinden
Begin met de directory-listing:
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.sourcesTwee bestanden met dezelfde stamnaam maar verschillende extensies vormen het gebruikelijke paar, maar vertrouw niet op de namen. Lees de inhoud, aangezien een duplicaat zich in een bestand met een willekeurige naam kan bevinden:
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.ascHet paar bestaat uit de twee items met dezelfde host en dezelfde suite. Beide verwijzen naar https://download.docker.com/linux/ubuntu en de suite noble, dus het is dezelfde repository die tweemaal is geschreven. Hun Signed-By-paden verschillen ook, wat de eerder getoonde Conflicting values-fout veroorzaakt.
Gebruik grep in plaats van een apt-commando voor deze stap. Wanneer apt al stopt vanwege het conflict, kan het uw bronnen ook niet weergeven, dus apt-cache policy geeft dezelfde foutmelding in plaats van het gewenste antwoord.
Herstel: behoud het deb822-bestand, verwijder het legacy-bestand
Behoud het .sources-bestand. Dit is het formaat dat apt-tools tegenwoordig schrijven en het is de standaard waar zowel Debian als Ubuntu naartoe bewegen. Controleer voordat u iets verwijdert welke van de twee sleutelpaden op de schijf aanwezig is:
ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker-rw-r--r-- 1 root root 4813 Aug 9 14:40 docker.ascAlleen /etc/apt/keyrings/docker.asc is aanwezig, dus het deb822-bestand bevat de juiste informatie en het .list-bestand verwijst naar een sleutel die is verwijderd. Als blijkt dat het bestand dat u wilt behouden naar de ontbrekende sleutel verwijst, kopieer dan eerst het werkende pad naar dat bestand en verwijder vervolgens het andere bestand.
Verplaats het legacy-bestand uit de directory in plaats van het direct te verwijderen:
sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt updateHet hernoemen naar docker.list.bak en het laten staan werkt ook, omdat apt onbekende extensies negeert, maar elke apt-run geeft dan deze melding:
N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extensionDoor het bestand ergens anders heen te verplaatsen, blijft die melding achterwege en behoudt u toch de back-up. Een gezonde apt update ziet er daarna als volgt uit, zonder regel die naar twee bestanden verwijst:
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.Bevestig nu dat de repository de wijziging heeft overleefd:
apt-cache policy | grep download.docker.com 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
origin download.docker.comAls de documentatie van een leverancier nog steeds uitgaat van het bestand met één regel, kunt u dat bestand behouden en in plaats daarvan het .sources-bestand verwijderen. Eén regel is hierbij doorslaggevend: exact één bestand mag een specifiek archief en suite declareren.
Waarom één defecte externe bron apt update blokkeert
De naburige fout ziet er anders uit, maar heeft dezelfde oorzaak: een externe bron die apt niet kan gebruiken. De eerste versie is een ontbrekende sleutel:
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.Het Signed-By-veld ontbreekt, of het verwijst naar een bestand dat geen bruikbare sleutel is, waardoor apt de handtekening op het InRelease-bestand van het archief niet kan verifiëren. Het verwerpt vervolgens de volledige repository in plaats van pakketlijsten te vertrouwen die het niet kan controleren. Bekijk het sleutelbestand zelf:
ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.ascEen werkende sleutel toont een pub-regel met een sleutel-id en een uid-regel met de naam van de leverancier. gpg: no valid OpenPGP data found. betekent dat het bestand helemaal geen sleutel is; dit betekent meestal dat de download een foutpagina heeft opgeslagen omdat de URL van de sleutel is gewijzigd. Haal de sleutel opnieuw op, controleer het bestand en voer daarna apt update uit.
De tweede versie treedt op na een release-upgrade:
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.De PPA heeft niets gepubliceerd voor die suite, waardoor het pad niet bestaat op de server en het verzoek een 404-foutmelding geeft. Uw andere repositories worden nog steeds bijgewerkt en de pakketten die u al heeft, blijven onaangeroerd. De uitvoering eindigt echter met een status die niet nul is, waardoor elk script dat de exit-status van apt update controleert, nu bij elke uitvoering een fout rapporteert. Daarom is het de moeite waard om een dode bron te verwijderen op een systeem waar onbeheerde beveiligingsupdates zijn geconfigureerd: de dagelijkse ruis is de plek waar een echte fout verborgen blijft. Installatiescripts van leveranciers lopen tegen beide versies aan, wat de reden is dat de meeste Tailscale-installatiefouten op Ubuntu blijken te gaan over een keyring die het script nooit heeft geschreven of een release-codename die het archief niet bevat.
Eén bron uitschakelen zonder de rest te verbreken
Voeg voor een deb822-bestand één veld toe aan de stanza en sla het op:
Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: noDe apt-handleiding raadt dit aan boven het uitcommentariëren van elke regel in de stanza; het is bovendien eenvoudiger ongedaan te maken. Plaats voor een bestand met één regel een # aan het begin van de regel. Voor beide formaten werkt het verplaatsen van het bestand uit /etc/apt/sources.list.d/ ook; dit is de juiste optie wanneer de repository definitief is verwijderd.
Voer sudo apt update opnieuw uit. Het Err:-blok voor die repository verdwijnt en de exit-status keert terug naar 0, wat u op de volgende regel kunt controleren met echo $?.
Herstel een defecte bron nooit met sudo rm /etc/apt/sources.list.d/*. Op Ubuntu 24.04 en nieuwer verwijdert dit ubuntu.sources, waarin de eigen repositories van de distributie staan. Hierdoor blijft apt achter zonder pakketlijsten en rapporteert het E: Unable to locate package curl voor software die aantoonbaar bestaat. Als u dit al heeft uitgevoerd, schrijf het bestand dan terug:
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.gpgSla dit op als /etc/apt/sources.list.d/ubuntu.sources, waarbij u noble vervangt door uw eigen release-naam uit lsb_release -cs, en voer vervolgens sudo apt update uit.
Converteren van legacy .list-bestanden naar deb822
Vanaf augustus 2026 bevat apt 3.0 en nieuwer een converter hiervoor. Debian 13 beschikt hierover, evenals Ubuntu 25.04 en elke release daarna, inclusief 26.04. Controleer de versie en voer vervolgens het volgende commando uit:
apt --version
sudo apt modernize-sourcesDit herschrijft de bestanden met één regel onder /etc/apt/sources.list.d/ naar deb822 .sources-bestanden. Lees de uitvoer, bekijk zelf de inhoud van de directory en voer apt update uit voordat u het resultaat vertrouwt. Ubuntu 24.04 levert een oudere versie van apt zonder dit subcommando; daar geeft het commando de melding E: Invalid operation modernize-sources. Converteer op die release handmatig met behulp van de bovenstaande veldtoewijzingen.
Converteren is momenteel optioneel, omdat apt beide formaten nog steeds leest. Het is de moeite waard op een server die u wilt behouden, aangezien elke tool die tegenwoordig bronbestanden schrijft, deb822 gebruikt. Een systeem met uitsluitend .sources-bestanden voorkomt dat dit type duplicaten ontstaat.
Houd externe bronnen op een server overzichtelijk
Externe repositories zijn het onderdeel van een server dat het snelst veroudert. Elke repository is een belofte van een derde partij om pakketten te blijven publiceren voor uw Ubuntu-release, en een release-upgrade stelt al die beloften op één middag op de proef.
- Voeg alleen een externe repository toe als het distributiepakket niet voldoet. Een standaard LAMP stack op Ubuntu 24.04 heeft er geen nodig: het Ubuntu-archief bevat elk pakket dat wordt gebruikt, inclusief beveiligingsupdates voor de gehele levensduur van de release.
- Bewaar sleutels in
/etc/apt/keyrings/, één bestand per leverancier, met modus 644. De ongeprivilegieerde gebruiker_aptvoert de downloads uit en moet de sleutel kunnen lezen; een sleutelbestand dat alleen leesbaar is voor root veroorzaakt daarom een toegangs-fout bij elke fetch vanuit die repository. - Verwijs in elke stanza met
Signed-Bynaar dat specifieke bestand. Een sleutel in/etc/apt/trusted.gpgof/etc/apt/trusted.gpg.d/wordt vertrouwd voor elke repository op de server, wat betekent dat een leverancierssleutel die jaren geleden is toegevoegd, pakketten van overal kan valideren. - Controleer vóór een release-upgrade uw bronnen en verifieer of elke leverancier al publiceert voor de suite waarnaar u overstapt.
Een sleutel in de oude globale keyring kondigt zichzelf aan bij elke update:
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.Exporteer die specifieke sleutel naar een eigen bestand en verwijs vervolgens in de stanza daarnaar:
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.gpgVoeg Signed-By: /etc/apt/keyrings/docker.gpg toe aan de stanza van de repository en voer sudo apt update uit. De waarschuwing verdwijnt zodra geen enkele repository meer afhankelijk is van de oude keyring, waarna u de vermelding kunt verwijderen met sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.
Eén extra gewoonte bespaart de meeste problemen. do-release-upgrade schakelt externe bronnen uit voor de upgrade en laat ze daarna uitgeschakeld; het handmatig één voor één inschakelen is precies het moment waarop dubbele declaraties ontstaan. Lees de Ubuntu 24.04 naar 26.04 upgradehandleiding voordat u begint en noteer welke repositories u nog nodig heeft. Op een machine die u net heeft opgezet, is het goedkoopste moment om bronnen correct in te stellen tijdens de eerste tien minuten op een nieuwe VPS, terwijl de enige vermeldingen op de server de standaard Ubuntu-bronnen zijn.
FAQ
Waarom meldt apt dat een doel meerdere keren is geconfigureerd?
Omdat twee bestanden onder /etc/apt/sources.list.d/ dezelfde repository, suite en component declareren. De melding noemt beide bestanden met regelnummers, zoals docker.list:1 en docker.sources:1. apt voegt ze samen en gaat door, dus de update zelf werkt nog steeds. Het is echter verstandig de dubbele vermelding te verwijderen: zodra de twee bestanden verschillende ondertekeningssleutels noemen, stopt apt met E: Conflicting values set for option Signed-By en weigert het om enige bron te lezen, wat ook apt install blokkeert.
Moet ik het .list-bestand of het .sources-bestand behouden?
Behoud het .sources-bestand. deb822 is wat add-apt-repository schrijft op Ubuntu 24.04 en nieuwer; het bevat één benoemd veld per instelling in plaats van positionele tekst tussen vierkante haken, en dit is de richting waarin distributies zich ontwikkelen. Voordat u het .list-bestand verwijdert, dient u te bevestigen dat het Signed-By-pad in het .sources-bestand verwijst naar een bestaande sleutel, met ls -l /etc/apt/keyrings/. Verplaats het oude bestand uit /etc/apt/sources.list.d/ in plaats van het binnen de map te hernoemen, omdat een achtergebleven .bak-naam ervoor zorgt dat apt bij elke uitvoering een melding geeft over een genegeerd bestand.
Hoe schakel ik een apt-repository uit zonder deze te verwijderen?
Voeg in een deb822 .sources-bestand Enabled: no toe aan de stanza. Plaats in een .list-bestand met één regel een # aan het begin van de regel. Voer in beide gevallen daarna sudo apt update uit, waarna het Err:-blok voor die repository verdwijnt. Dit is de juiste actie wanneer een externe repository nog geen pakketten heeft voor uw Ubuntu-release en de 404-fout ervoor zorgt dat apt update met een foutcode afsluit.
Gaat het sources.list-formaat met één regel verdwijnen?
Het is verouderd, niet verwijderd. apt leest nog steeds .list-bestanden en zal dat nog lang blijven doen, dus er gaat morgen niets kapot op uw server. Nieuwe tools schrijven deb822: Ubuntu 24.04 en nieuwer bewaren de distributie-repositories in /etc/apt/sources.list.d/ubuntu.sources, en add-apt-repository schrijft .sources-bestanden. Op apt 3.0 en nieuwer converteert sudo apt modernize-sources de bestanden die u nog heeft.