Jak usunąć błąd zduplikowanych źródeł w apt
Błąd konfiguracji target configured multiple times w apt wynika z dublowania plików .list oraz .sources. Sprawdź, jak zlokalizować i usunąć zbędny plik, aby przywrócić poprawność.
Co oznacza błąd zduplikowanych źródeł apt
Zduplikowane źródła apt oznaczają, że jedno repozytorium zostało zadeklarowane dwukrotnie w dwóch różnych plikach, a narzędzie APT (advanced package tool) wykryło obie kopie. W systemie Ubuntu 24.04 i nowszych dzieje się tak niemal zawsze, ponieważ skrypt instalacyjny zewnętrznego dostawcy utworzył stary plik w formacie jednowierszowym .list, podczas gdy na dysku znajdował się już plik w formacie deb822 .sources dla tego samego repozytorium. Żadne dane nie są uszkodzone i żadne pakiety nie są zagrożone. Należy usunąć jedną z dwóch deklaracji, aby komunikat przestał się pojawiać.
Oto wiersz, który użytkownicy wklejają w wyszukiwarkę:
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:1Należy czytać go od końca. Dwa pliki, każdy z numerem wiersza, deklarują to samo. Target Packages to indeks, który apt pobiera, aby dowiedzieć się, jakie pakiety oferuje repozytorium, a stable/binary-amd64/Packages określa komponent (stable) oraz architekturę (amd64), których dotyczy ten indeks. Zatem apt informuje, że indeks amd64 dla komponentu stable jest skonfigurowany w docker.list w wierszu 1 oraz ponownie w docker.sources w wierszu 1.
W wersji apt 3.0 i nowszych, co oznacza Ubuntu 25.04 i nowsze oraz Debian 13, ten sam komunikat zaczyna się od Warning: zamiast W:. Tekst po przedrostku pozostaje bez zmian.
To ostrzeżenie jest łagodnym przypadkiem. apt scala obie deklaracje i aktualizacja nadal przebiega poprawnie, ponieważ obie opisują to samo archiwum z tym samym kluczem. Przypadek krytyczny zatrzymuje cały proces:
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 odmawia działania, ponieważ dwie deklaracje wskazują różne klucze podpisywania dla tego samego archiwum. Narzędzie scala dwie identyczne deklaracje, ale nie wybierze między dwiema wartościami Signed-By, ponieważ wybór niewłaściwej oznaczałby weryfikację podpisów pakietów kluczem, którym właściciel archiwum nigdy nie podpisywał plików. W rezultacie apt nie odczytuje żadnych źródeł. Polecenia apt update oraz apt install kończą się niepowodzeniem z tymi samymi dwoma wierszami błędu, dopóki pliki nie zostaną poprawione ręcznie.
Jak powstaje duplikat
Oba formaty znajdują się w oddzielnych plikach o różnych rozszerzeniach, więc nic na dysku nie blokuje ich jednoczesnego istnienia. apt wykrywa konflikt dopiero w późniejszym etapie, gdy rozwija każdy plik źródłowy do listy celów indeksu, które zamierza pobrać. Do tego momentu docker.list oraz docker.sources są dwoma niezwiązanymi ze sobą plikami.
Cztery typowe zdarzenia prowadzą do powstania tej pary:
- Skrypt instalacyjny dostawcy lub polecenie skopiowane ze starszego poradnika zapisuje
/etc/apt/sources.list.d/vendor.listz liniątee. - Własny pakiet dostawcy w późniejszym czasie zawiera
/etc/apt/sources.list.d/vendor.sourcesi instaluje go w systemie. add-apt-repositoryw systemie Ubuntu 24.04 i nowszych zapisuje pliki deb822.sources, przez co PPA (personal package archive) dodane wcześniej ręcznie jako.listpowraca jako.sources.- Aktualizacja dystrybucji nadpisała własne źródła systemu do formatu deb822, pozostawiając ręcznie utworzony plik
.listbez zmian.
Każda z tych ścieżek jest uzasadniona. Duplikat powstaje, gdy dwa z tych zdarzeń wystąpią na tym samym serwerze, często w odstępie wielu miesięcy.
Porównanie obu formatów
Stary format to jedna linia na repozytorium, w której każda część ma ściśle określone miejsce.
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stableKolejność jest stała: typ (deb dla pakietów binarnych, deb-src dla pakietów źródłowych), następnie opcje w nawiasach kwadratowych, potem URI (uniform resource identifier) archiwum, następnie suite, a na końcu jeden lub więcej komponentów. Ponieważ znaczenie wynika z pozycji, spacja w niewłaściwym miejscu zmienia sposób odczytu przez apt.
Format deb822 przedstawia te same informacje jako blok nazwanych pól. Nazwa pochodzi od RFC 822, stylu nagłówków pocztowych, który Debian już wykorzystuje w plikach kontrolnych pakietów.
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascTo samo repozytorium, ten sam klucz, brak dodatkowych elementów. Odwzorowanie jest bezpośrednie: deb staje się Types, adres archiwum staje się URIs, suite staje się Suites, komponenty stają się Components, a każda opcja w nawiasach staje się osobnym polem, więc signed-by= staje się Signed-By:, a arch= staje się Architectures:.
Każda nazwa pola jest w liczbie mnogiej, ponieważ każde pole przyjmuje listę rozdzieloną spacjami. Suites: noble noble-updates noble-backports w jednym bloku zastępuje trzy oddzielne linie deb. Pusta linia kończy blok, więc pojedynczy plik .sources może zawierać wiele repozytoriów. Format deb822 obsługuje również ustawienia, z którymi format jednoliniowy radzi sobie słabo: Enabled: no do wyłączenia repozytorium, Trusted, Check-Valid-Until oraz klucz wklejony bezpośrednio do Signed-By, gdzie każda linia jest wcięta o jedną spację, a puste linie są zapisywane jako pojedyncza kropka.
Lokalizacja plików
/etc/apt/sources.list: oryginalny pojedynczy plik. W systemie Ubuntu 24.04 i nowszych jest zazwyczaj pusty lub zawiera jedynie komentarz wskazujący na nową lokalizację./etc/apt/sources.list.d/*.list: wpisy jednowierszowe, zazwyczaj jeden plik na repozytorium./etc/apt/sources.list.d/*.sources: sekcje w formacie deb822. Ubuntu 24.04 i nowsze przechowują tutaj własne repozytoria dystrybucji, w plikuubuntu.sources./etc/apt/keyrings/: miejsce na dodawane klucze./usr/share/keyrings/przechowuje klucze dostarczone w pakietach.
Narzędzie apt odczytuje wyłącznie pliki z rozszerzeniem .list lub .sources, a nazwa pliku może zawierać litery, cyfry, znaki podkreślenia, łączniki oraz kropki. Plik z jakimkolwiek innym rozszerzeniem jest pomijany z odpowiednim powiadomieniem, co ma znaczenie dla poniższej poprawki.
Znajdowanie duplikatu pary
Rozpocznij od wyświetlenia zawartości katalogu:
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.sourcesDwa pliki o tej samej nazwie bazowej, lecz różnych rozszerzeniach, stanowią typową parę, jednak nie należy polegać wyłącznie na nazwach. Odczytaj zawartość plików, ponieważ duplikat może kryć się pod dowolną nazwą:
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.ascParę stanowią dwa wpisy o tym samym hoście i tym samym zestawie. Oba wskazują na https://download.docker.com/linux/ubuntu oraz zestaw noble, co oznacza, że jest to to samo repozytorium zapisane dwukrotnie. Ich ścieżki Signed-By również są rozbieżne, co powoduje błąd Conflicting values wyświetlony wcześniej.
W tym kroku użyj grep zamiast polecenia apt. Gdy apt przerywa działanie z powodu konfliktu, nie jest w stanie wyświetlić źródeł, więc apt-cache policy również wypisze ten sam błąd zamiast oczekiwanej odpowiedzi.
Naprawa: zachowanie pliku deb822, usunięcie pliku w starym formacie
Zachowaj plik .sources. Jest to format, w którym obecnie zapisują narzędzia apt i w tym kierunku zmierzają zarówno Debian, jak i Ubuntu. Przed usunięciem czegokolwiek sprawdź, która z dwóch ścieżek klucza istnieje na dysku:
ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker-rw-r--r-- 1 root root 4813 Aug 9 14:40 docker.ascObecny jest tylko /etc/apt/keyrings/docker.asc, więc to plik deb822 zawiera aktualne informacje, a plik .list wskazuje na usunięty klucz. Jeśli okaże się, że plik, który chcesz zachować, wskazuje na brakujący klucz, najpierw skopiuj do niego działającą ścieżkę, a następnie usuń drugi plik.
Przenieś stary plik poza katalog, zamiast go od razu usuwać:
sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt updateZmiana nazwy na docker.list.bak i pozostawienie pliku w tym samym miejscu również zadziała, ponieważ apt ignoruje nieznane rozszerzenia, jednak przy każdym uruchomieniu apt pojawi się następujący komunikat:
N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extensionPrzeniesienie pliku w inne miejsce eliminuje ten komunikat, zachowując jednocześnie kopię zapasową. Prawidłowy wynik apt update po tej operacji wygląda następująco i nie zawiera linii wskazującej na dwa pliki:
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.Teraz potwierdź, że repozytorium przetrwało edycję:
apt-cache policy | grep download.docker.com 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
origin download.docker.comJeśli dokumentacja dostawcy nadal zakłada użycie pliku jednowierszowego, możesz zachować ten plik, a usunąć plik .sources. Obowiązuje jedna zasada: dokładnie jeden plik może deklarować dane archiwum i zestaw (suite).
Dlaczego jedno uszkodzone źródło zewnętrzne blokuje apt update
Sąsiednia awaria wygląda inaczej, ale ma to samo źródło: zewnętrzny zasób, którego apt nie może użyć. Pierwszy wariant to brakujący klucz:
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.Pole Signed-By jest puste lub wskazuje na plik, który nie jest poprawnym kluczem, więc apt nie może zweryfikować podpisu pliku InRelease archiwum. W rezultacie odrzuca całe repozytorium zamiast ufać listom pakietów, których nie może sprawdzić. Należy sprawdzić sam plik klucza:
ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.ascDziałający klucz wyświetla linię pub z identyfikatorem klucza oraz linię uid z nazwą dostawcy. gpg: no valid OpenPGP data found. oznacza, że plik w ogóle nie jest kluczem, co zazwyczaj wynika z pobrania strony błędu zamiast pliku, ponieważ adres URL klucza uległ zmianie. Należy pobrać klucz ponownie, sprawdzić plik, a następnie uruchomić apt update.
Drugi wariant pojawia się po aktualizacji wydania systemu:
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.PPA nie opublikowało żadnych danych dla tej wersji systemu, więc ścieżka nie istnieje na serwerze, a żądanie zwraca błąd 404. Pozostałe repozytoria aktualizują się poprawnie, a zainstalowane pakiety pozostają nienaruszone. Proces kończy się jednak kodem błędu, więc każdy skrypt sprawdzający status wyjścia apt update będzie zgłaszał awarię przy każdym uruchomieniu. Dlatego warto usuwać martwe źródła na serwerach z skonfigurowanymi automatycznymi aktualizacjami bezpieczeństwa: codzienne komunikaty o błędach mogą maskować rzeczywiste awarie. Skrypty instalacyjne dostawców często napotykają oba te problemy, dlatego większość błędów instalacji Tailscale na Ubuntu wynika z braku zapisu klucza przez skrypt lub użycia nazwy kodowej wydania, której archiwum nie obsługuje.
Wyłączanie jednego źródła bez wpływu na pozostałe
W przypadku pliku w formacie deb822 należy dodać jedno pole do sekcji i zapisać zmiany:
Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: noPodręcznik apt zaleca to rozwiązanie zamiast komentowania każdej linii sekcji, ponieważ jest ono łatwiejsze do cofnięcia. W przypadku pliku jednowierszowego należy umieścić # na początku linii. Dla obu formatów skuteczne jest również przeniesienie pliku poza katalog /etc/apt/sources.list.d/; jest to opcja zalecana, gdy repozytorium nie będzie już używane.
Ponownie uruchom sudo apt update. Blok Err: dla danego repozytorium zniknie, a kod wyjścia wyniesie 0, co można sprawdzić za pomocą echo $? w następnej linii.
Nigdy nie naprawiaj uszkodzonego źródła za pomocą sudo rm /etc/apt/sources.list.d/*. W systemie Ubuntu 24.04 i nowszych polecenie to usuwa plik ubuntu.sources, który zawiera domyślne repozytoria dystrybucji. W rezultacie apt pozostaje bez list pakietów i zgłasza E: Unable to locate package curl dla oprogramowania, które jest dostępne. Jeśli polecenie zostało już wykonane, należy odtworzyć plik:
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.gpgZapisz go jako /etc/apt/sources.list.d/ubuntu.sources, zastępując noble nazwą własnego wydania z pliku lsb_release -cs, a następnie uruchom sudo apt update.
Konwersja starszych plików .list do formatu deb822
Od sierpnia 2026 roku apt w wersji 3.0 i nowszych zawiera konwerter tego formatu. Jest on dostępny w Debian 13, Ubuntu 25.04 oraz wszystkich późniejszych wydaniach, w tym 26.04. Należy sprawdzić wersję, a następnie uruchomić polecenie:
apt --version
sudo apt modernize-sourcesNarzędzie to przepisuje jednowierszowe pliki z katalogu /etc/apt/sources.list.d/ na pliki deb822 w .sources. Należy zapoznać się z wyświetlonymi komunikatami, samodzielnie sprawdzić zawartość katalogu i uruchomić apt update przed uznaniem wyniku za poprawny. Ubuntu 24.04 zawiera starszą wersję apt bez tego podpolecenia, w związku z czym polecenie zwraca E: Invalid operation modernize-sources. W tym wydaniu konwersję należy przeprowadzić ręcznie, korzystając z powyższego mapowania pól.
Konwersja jest obecnie opcjonalna, ponieważ apt nadal obsługuje oba formaty. Warto ją jednak wykonać na serwerze, który ma być utrzymywany długoterminowo, ponieważ wszystkie narzędzia zapisujące źródła używają już formatu deb822, a system zawierający wyłącznie pliki .sources eliminuje ryzyko powstawania duplikatów tego typu.
Utrzymywanie porządku w zewnętrznych źródłach oprogramowania na serwerze
Zewnętrzne repozytoria to element serwera, który starzeje się najszybciej. Każde z nich stanowi obietnicę zewnętrznego dostawcy dotyczącą ciągłości publikacji dla konkretnego wydania Ubuntu, a aktualizacja dystrybucji weryfikuje wszystkie te obietnice w ciągu jednego popołudnia.
- Dodawaj zewnętrzne repozytorium tylko wtedy, gdy pakiety z oficjalnej dystrybucji nie spełniają wymagań. Standardowy stos LAMP na Ubuntu 24.04 nie wymaga żadnych dodatków: archiwum Ubuntu zawiera wszystkie niezbędne pakiety wraz z aktualizacjami bezpieczeństwa przez cały okres wsparcia wydania.
- Przechowuj klucze w
/etc/apt/keyrings/, po jednym pliku na dostawcę, z uprawnieniami 644. Nieuprzywilejowany użytkownik_aptodpowiada za pobieranie i musi mieć możliwość odczytu klucza, dlatego plik dostępny tylko dla root spowoduje błąd uprawnień przy każdej próbie pobrania danych z repozytorium. - Wskaż
Signed-Bybezpośrednio na ten plik w każdej sekcji konfiguracji. Klucz umieszczony w/etc/apt/trusted.gpglub/etc/apt/trusted.gpg.d/jest uznawany za zaufany dla każdego repozytorium w systemie, co oznacza, że klucz dostawcy dodany lata temu może autoryzować pakiety z dowolnego źródła. - Przed aktualizacją wydania przejrzyj swoje źródła i sprawdź, czy każdy dostawca publikuje już pakiety dla wersji, na którą przechodzisz.
Klucz w starym, globalnym zbiorze kluczy (keyring) generuje komunikat przy każdej aktualizacji:
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.Wyeksportuj ten pojedynczy klucz do osobnego pliku, a następnie wskaż go w odpowiedniej sekcji:
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.gpgDodaj Signed-By: /etc/apt/keyrings/docker.gpg do sekcji repozytorium i uruchom sudo apt update. Ostrzeżenie zniknie, gdy żadne repozytorium nie będzie już korzystać ze starego zbioru kluczy, co pozwoli na usunięcie wpisu za pomocą sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.
Jeszcze jeden nawyk pozwala uniknąć największych problemów. do-release-upgrade wyłącza zewnętrzne źródła na czas aktualizacji i pozostawia je wyłączone po jej zakończeniu, a ręczne włączanie ich pojedynczo jest główną przyczyną powstawania duplikatów deklaracji. Przeczytaj przewodnik aktualizacji z Ubuntu 24.04 do 26.04 przed rozpoczęciem prac i sporządź listę repozytoriów, które są nadal potrzebne. Na świeżo zainstalowanej maszynie najlepszym momentem na uporządkowanie źródeł jest pierwsze dziesięć minut na nowym VPS, gdy w systemie znajdują się wyłącznie wpisy dostarczone przez Ubuntu.
FAQ
Dlaczego apt zgłasza, że cel jest skonfigurowany wielokrotnie?
Ponieważ dwa pliki w /etc/apt/sources.list.d/ deklarują to samo repozytorium, dystrybucję i komponent. Komunikat wskazuje oba pliki wraz z numerami linii, na przykład docker.list:1 oraz docker.sources:1. Program apt scala te wpisy i kontynuuje działanie, więc sama aktualizacja nadal przebiega poprawnie. Duplikat warto jednak usunąć: gdy tylko pliki wskażą różne klucze podpisu, apt przerwie pracę z błędem E: Conflicting values set for option Signed-By i odmówi odczytu jakiegokolwiek źródła, co zablokuje również apt install.
Czy zachować plik .list czy plik .sources?
Należy zachować plik .sources. Format deb822 jest używany przez add-apt-repository w systemie Ubuntu 24.04 i nowszych; zawiera on nazwane pola dla każdego ustawienia zamiast tekstu pozycyjnego w nawiasach kwadratowych i stanowi standard, w stronę którego zmierzają dystrybucje. Przed usunięciem pliku .list należy potwierdzić za pomocą ls -l /etc/apt/keyrings/, że ścieżka Signed-By wewnątrz pliku .sources wskazuje na istniejący klucz. Stary plik należy przenieść poza katalog /etc/apt/sources.list.d/ zamiast zmieniać jego nazwę wewnątrz tego samego katalogu, ponieważ pozostały plik z rozszerzeniem .bak powoduje, że apt wyświetla powiadomienie o zignorowaniu pliku przy każdym uruchomieniu.
Jak wyłączyć repozytorium apt bez jego usuwania?
W pliku .sources w formacie deb822 należy dodać wpis Enabled: no do sekcji. W pliku .list w formacie jednowierszowym należy umieścić znak # na początku linii. W obu przypadkach po tej operacji należy wykonać sudo apt update, co spowoduje, że blok Err: dla tego repozytorium zniknie. Jest to właściwe rozwiązanie, gdy repozytorium zewnętrznego dostawcy nie posiada jeszcze pakietów dla danej wersji Ubuntu, a błąd 404 powoduje, że apt update kończy pracę z kodem wyjścia innym niż zero.
Czy format jednowierszowy sources.list zostanie wycofany?
Jest on przestarzały, ale nie został usunięty. Program apt nadal odczytuje pliki .list i będzie to robił przez długi czas, więc żadna konfiguracja na serwerze nie przestanie działać z dnia na dzień. Nowe narzędzia zapisują dane w formacie deb822: Ubuntu 24.04 i nowsze przechowują repozytoria dystrybucji w /etc/apt/sources.list.d/ubuntu.sources, a add-apt-repository tworzy pliki .sources. W wersji apt 3.0 i nowszych polecenie sudo apt modernize-sources konwertuje posiadane pliki do nowego formatu.