Як виправити дублікати джерел apt у .list і .sources
Помилка "Target is configured multiple times"? Знайдіть пару legacy .list і deb822 .sources, залиште один файл та перевірте чистий apt update.
Що означає помилка про дублікати джерел apt
Дублікати джерел apt означають, що один репозиторій оголошено двічі у двох різних файлах, і APT (advanced package tool) виявив обидві копії. В Ubuntu 24.04 і новіших версіях це майже завжди трапляється через те, що сторонній інсталяційний скрипт записав старий однорядковий файл .list, хоча файл у форматі deb822 .sources для того самого репозиторію вже був на диску. Нічого не пошкоджено, і жоден пакет не перебуває під загрозою. Видаліть одне з двох оголошень, і повідомлення зникне.
Ось рядок, який зазвичай вставляють у поле пошуку:
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Читайте його з кінця. Два файли, кожен із номером рядка, оголошують те саме. Target Packages — це індекс, який apt завантажує, щоб дізнатися, які пакети пропонує репозиторій, а stable/binary-amd64/Packages визначає компонент (stable) і архітектуру (amd64), яких стосується цей індекс. Отже, apt повідомляє, що індекс amd64 для компонента stable налаштовано у docker.list у рядку 1, а також у docker.sources у рядку 1.
В apt 3.0 і новіших версіях, тобто в Ubuntu 25.04 і новіших версіях та Debian 13, те саме повідомлення починається з Warning: замість W:. Текст після префікса не змінюється.
Це попередження є легким випадком. apt об’єднує два оголошення, і оновлення виконується, оскільки обидва описують той самий архів із тим самим ключем. У складному випадку весь процес зупиняється:
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 відмовляється продовжувати, оскільки два оголошення вказують на різні ключі підпису одного архіву. apt об’єднає два ідентичні оголошення, але не вибиратиме між двома значеннями Signed-By, оскільки неправильний вибір означає перевірку підписів пакетів за ключем, яким власник архіву їх не підписував. Тому apt не читає жодних джерел. apt update і apt install обидві завершуються з тією самою помилкою у двох рядках, доки ви не відредагуєте файли вручну.
Як з’являється дублікат
Два формати зберігаються в окремих файлах із різними розширеннями, тому на диску ніщо не заважає їм існувати одночасно. apt виявляє конфлікт лише на пізньому етапі, коли розгортає кожен файл джерел у список цілей індексів, які планує завантажити. До цього моменту docker.list і docker.sources є двома непов’язаними файлами.
Пара з’являється внаслідок чотирьох типових подій:
- Скрипт інсталяції постачальника або команда зі старої інструкції створює
/etc/apt/sources.list.d/vendor.listіз рядкомtee. - Пізніше власний пакет постачальника постачає
/etc/apt/sources.list.d/vendor.sourcesі встановлює його. add-apt-repositoryв Ubuntu 24.04 і новіших версіях створює файли deb822.sources, тому PPA (personal package archive), який ви колись додали вручну як.list, знову з’являється як.sources.- Під час оновлення дистрибутива його власні джерела було перетворено на формат deb822, а ваш створений вручну файл
.listзалишився поруч без змін.
Кожен із цих шляхів окремо є нормальним. Дублікат з’являється, коли два з них відбуваються на одному сервері, часто з різницею в кілька місяців.
Два формати поруч
Старий формат містить один рядок на репозиторій, і кожна його частина визначається позицією.
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stableПорядок фіксований: тип (deb для бінарних пакетів, deb-src для пакетів із вихідним кодом), потім параметри у квадратних дужках, URI (uniform resource identifier) архіву, suite, а потім один або кілька components. Оскільки значення визначається позицією, пробіл у неправильному місці змінює те, як apt читає запис.
deb822 подає ту саму інформацію як stanza з іменованими полями. Назва походить від RFC 822 — формату заголовків електронної пошти, який Debian уже використовує для файлів керування пакетами.
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascТой самий репозиторій, той самий ключ, без додаткових даних. Відповідність пряма: deb стає Types, адреса архіву стає URIs, suite стає Suites, components стають Components, а кожен параметр у дужках перетворюється на окреме поле, тому signed-by= стає Signed-By:, а arch= — Architectures:.
Назви всіх полів мають форму множини, оскільки кожне поле приймає список, елементи якого розділені пробілами. Suites: noble noble-updates noble-backports в одній stanza замінює три окремі рядки deb. Порожній рядок завершує stanza, тому один файл .sources може містити кілька репозиторіїв. deb822 також підтримує параметри, з якими однорядковий формат працює незручно: Enabled: no для вимкнення репозиторію, Trusted, Check-Valid-Until і вбудований ключ, вставлений безпосередньо в Signed-By, де кожен рядок має відступ в один пробіл, а порожні рядки записуються як одна крапка.
Де розташований кожен файл
/etc/apt/sources.list: початковий єдиний файл. В Ubuntu 24.04 і новіших версіях він зазвичай порожній або містить лише коментар із посиланням на нове розташування./etc/apt/sources.list.d/*.list: записи в один рядок, зазвичай по одному файлу на репозиторій./etc/apt/sources.list.d/*.sources: блоки deb822. В Ubuntu 24.04 і новіших версіях у цьому каталозі зберігаються власні репозиторії дистрибутива, уubuntu.sources./etc/apt/keyrings/: каталог для ключів, які ви додаєте./usr/share/keyrings/містить ключі, що надійшли з пакетом.
apt читає лише файли, назви яких закінчуються на .list або .sources, а ім’я файлу може містити літери, цифри, символи підкреслення, дефіси й крапки. Файл з будь-яким іншим розширенням пропускається з відповідним повідомленням. Це важливо для виправлення нижче.
Знайдіть дубльовану пару
Почніть із перегляду вмісту каталогу:
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Два файли з однаковою основою і різними розширеннями — це поширена пара, але не довіряйте назвам. Прочитайте вміст, оскільки дубль може бути у файлі з будь-якою назвою:
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Пара складається з двох записів з однаковими хостом і suite. Обидва вказують на https://download.docker.com/linux/ubuntu і suite noble, тому це один і той самий репозиторій, записаний двічі. Їхні шляхи Signed-By також відрізняються, через що виникає помилка Conflicting values, показана раніше.
Для цього кроку використайте grep, а не команду apt. Коли apt уже зупиняється через конфлікт, він також не може вивести список джерел, тому apt-cache policy виведе ту саму помилку замість потрібної відповіді.
Виправлення: залиште файл deb822 і видаліть застарілий файл
Залиште файл .sources. Саме такий формат тепер створюють інструменти apt, і саме до нього переходять Debian та Ubuntu. Перш ніж щось видаляти, перевірте, який із двох основних шляхів існує у файловій системі:
ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker-rw-r--r-- 1 root root 4813 Aug 9 14:40 docker.ascПрисутній лише /etc/apt/keyrings/docker.asc, тому файл deb822 містить правильні дані, а файл .list посилається на ключ, який було видалено. Якщо виявиться, що у файлі, який ви плануєте залишити, указано відсутній ключ, спочатку скопіюйте до нього робочий шлях, а потім видаліть інший файл.
Перемістіть застарілий файл за межі цього каталогу, а не видаляйте його одразу:
sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt updateПерейменування на docker.list.bak із залишенням у цьому самому каталозі також працює, оскільки apt ігнорує невідомі розширення. Однак під час кожного запуску apt виводитиметься таке повідомлення:
N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extensionПереміщення файлу в інше місце прибирає це повідомлення з виводу та водночас зберігає резервну копію. Після цього коректний файл apt update має виглядати так, без рядка, у якому вказано два файли:
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.Тепер переконайтеся, що репозиторій залишився працездатним після редагування:
apt-cache policy | grep download.docker.com 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
origin download.docker.comЯкщо в документації постачальника досі передбачається файл з одним рядком, можна залишити його, а файл .sources видалити. Правило однакове в обох випадках: для певного архіву та suite може бути оголошено рівно один файл.
Чому одне непрацююче стороннє джерело блокує apt update
Суміжна помилка виглядає інакше, але має ту саму причину: стороннє джерело, яке apt не може використовувати. Перший варіант — відсутній ключ:
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.Поле Signed-By відсутнє або вказує на файл, який не містить придатного ключа, тому apt не може перевірити підпис файлу InRelease архіву. Тоді apt відкидає весь цей репозиторій, а не довіряє спискам пакетів, які неможливо перевірити. Перевірте сам файл ключа:
ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.ascУ справному файлі ключа виводиться рядок pub з ідентифікатором ключа та рядок uid з назвою постачальника. gpg: no valid OpenPGP data found. означає, що файл взагалі не є ключем. Зазвичай це означає, що під час завантаження було збережено сторінку помилки, оскільки URL ключа змінився. Завантажте ключ ще раз, перевірте файл і виконайте apt update.
Другий варіант виникає після оновлення релізу:
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 не опублікував нічого для цього suite, тому шлях не існує на сервері, а запит повертає 404. Інші репозиторії й надалі оновлюються, а вже встановлені пакети не змінюються. Однак команда завершується з ненульовим кодом, тому будь-який скрипт, який перевіряє код завершення apt update, тепер повідомляє про помилку під час кожного запуску. Саме тому варто видаляти непрацююче джерело на сервері, де налаштовані автоматичні оновлення безпеки: серед щоденних повідомлень легко пропустити справжню помилку. Скрипти встановлення постачальників стикаються з обома варіантами. Тому більшість помилок встановлення Tailscale на Ubuntu зрештою спричинені keyring, який скрипт не записав, або codename релізу, якого немає в архіві.
Вимкнення одного джерела без порушення роботи інших
Для файлу deb822 додайте одне поле до stanza та збережіть файл:
Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: noУ посібнику apt рекомендовано цей спосіб замість коментування кожного рядка stanza. Також його простіше скасувати. Для однорядкового файлу поставте # на початку рядка. Для обох форматів також можна перемістити файл за межі /etc/apt/sources.list.d/. Саме цей варіант слід вибрати, якщо репозиторій видалено назавжди.
Знову виконайте sudo apt update. Блок Err: для цього репозиторію зникне, а код завершення знову буде 0. Перевірити його можна командою echo $? у наступному рядку.
Не виправляйте несправне джерело за допомогою sudo rm /etc/apt/sources.list.d/*. В Ubuntu 24.04 і новіших версіях ця команда видаляє ubuntu.sources, де містяться власні репозиторії дистрибутива. У результаті apt не матиме жодних списків пакетів і повідомлятиме E: Unable to locate package curl для програм, які фактично існують. Якщо ви вже виконали цю команду, відновіть файл:
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Збережіть його як /etc/apt/sources.list.d/ubuntu.sources, замінивши noble власною назвою випуску з lsb_release -cs, а потім виконайте sudo apt update.
Перетворення застарілих файлів .list на deb822
Станом на August 2026, apt 3.0 і новіші версії містять для цього конвертер. Він є в Debian 13, а також в Ubuntu 25.04 і всіх наступних випусках, зокрема 26.04. Перевірте версію, а потім запустіть конвертер:
apt --version
sudo apt modernize-sourcesВін перезаписує однорядкові файли в /etc/apt/sources.list.d/ у форматі deb822 у файли .sources. Перегляньте його вивід, потім самостійно перегляньте вміст каталогу та виконайте apt update, перш ніж довіряти результату. В Ubuntu 24.04 постачається старіша версія apt без такої підкоманди, і там команда повертає E: Invalid operation modernize-sources. У цьому випуску виконайте перетворення вручну, використовуючи наведену вище таблицю відповідності полів.
Сьогодні перетворення необов’язкове, оскільки apt досі читає обидва формати. На сервері, який ви плануєте й надалі використовувати, це варто зробити, оскільки всі інструменти, що записують джерела пакетів, тепер використовують deb822, а на сервері лише з файлами .sources не може виникнути такий тип дублювання.
Не допускайте безладу в сторонніх джерелах на сервері
Сторонні репозиторії старіють найгірше. Кожен із них означає, що інший постачальник має й надалі публікувати пакети для вашого випуску Ubuntu. Під час оновлення випуску перевіряється, чи виконав кожен постачальник цю умову.
- Додавайте сторонній репозиторій лише тоді, коли пакет із дистрибутива не підходить. Для звичайного LAMP stack в Ubuntu 24.04 сторонні репозиторії не потрібні: архів Ubuntu містить усі потрібні пакети та надає оновлення безпеки протягом життєвого циклу випуску.
- Зберігайте ключі в
/etc/apt/keyrings/, по одному файлу на постачальника, з mode 644. Завантаження виконує непривілейований користувач_apt, якому потрібно читати ключ. Тому файл ключа, доступний лише root, спричинятиме помилку доступу під час кожного отримання даних із цього репозиторію. - У кожному stanza вказуйте
Signed-Byна цей точний файл. Ключ у/etc/apt/trusted.gpgабо/etc/apt/trusted.gpg.d/вважається довіреним для всіх репозиторіїв на сервері. Через це ключ постачальника, доданий кілька років тому, може підтверджувати пакети з будь-якого джерела. - Перед оновленням випуску перегляньте свої джерела та перевірте, чи кожен постачальник уже публікує пакети для suite, до якого ви переходите.
Ключ у старому глобальному keyring проявляється під час кожного оновлення:
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.Експортуйте цей ключ в окремий файл і вкажіть його у stanza:
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Додайте Signed-By: /etc/apt/keyrings/docker.gpg до stanza репозиторію та виконайте sudo apt update. Попередження зникне, коли жоден репозиторій більше не залежатиме від старого keyring. Після цього можна видалити запис за допомогою sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.
Є ще одна звичка, яка допомагає уникнути більшості проблем. do-release-upgrade вимикає сторонні джерела на час оновлення та залишає їх вимкненими після нього. Повторне ввімкнення вручну, по одному джерелу, якраз часто призводить до створення дублікатів. Перед початком прочитайте посібник з оновлення Ubuntu 24.04 до 26.04 і запишіть, які репозиторії вам ще потрібні. На щойно створеній машині найкращий момент для впорядкування джерел — перші десять хвилин на новому VPS, коли на сервері є лише записи, які постачає Ubuntu.
FAQ
Чому apt повідомляє, що джерело налаштовано кілька разів?
Тому що два файли в /etc/apt/sources.list.d/ оголошують той самий репозиторій, suite і component. У повідомленні вказано обидва файли з номерами рядків, наприклад docker.list:1 і docker.sources:1. apt об’єднує їх і продовжує роботу, тому саме оновлення все одно виконується. Однак дубль варто прибрати: щойно у двох файлах буде вказано різні ключі підпису, apt завершиться з помилкою E: Conflicting values set for option Signed-By і відмовиться читати будь-які джерела, через що також буде заблоковано apt install.
Чи потрібно залишити файл .list або файл .sources?
Залиште файл .sources. deb822 використовується add-apt-repository в Ubuntu 24.04 і новіших версіях. У ньому для кожного параметра є окреме поле з назвою, а не позиційний текст у квадратних дужках. Саме цей формат надалі використовуватимуть дистрибутиви. Перш ніж видаляти файл .list, переконайтеся за допомогою ls -l /etc/apt/keyrings/, що шлях Signed-By у файлі .sources вказує на наявний ключ. Перемістіть старий файл за межі /etc/apt/sources.list.d/, а не перейменовуйте його всередині цього каталогу, оскільки залишене ім’я .bak змушуватиме apt виводити повідомлення про проігнорований файл під час кожного запуску.
Як вимкнути один репозиторій apt, не видаляючи його?
У файлі deb822 .sources додайте до stanza параметр Enabled: no. В однорядковому файлі .list поставте # на початку рядка. В обох випадках після цього виконайте sudo apt update, і блок Err: для цього репозиторію зникне. Це правильний підхід, якщо сторонній репозиторій ще не містить пакетів для вашого випуску Ubuntu, а його помилка 404 змушує apt update завершуватися з ненульовим кодом.
Чи буде однорядковий формат sources.list вилучено?
Його визнано застарілим, але не вилучено. apt і надалі читає файли .list, і це триватиме ще довго, тому завтра на вашому сервері нічого не перестане працювати. Нові інструменти записують дані у форматі deb822: Ubuntu 24.04 і новіші версії зберігають репозиторії дистрибутива у /etc/apt/sources.list.d/ubuntu.sources, а add-apt-repository записує файли .sources. У apt 3.0 і новіших версіях sudo apt modernize-sources перетворює наявні файли.