SSD Nodes Learn 🎉 VPS від $5.50/міс
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-08-13

Як виправити дублікати джерел apt і файлів .sources

apt update показує "configured multiple times"? Знайдіть пару старого .list і deb822 .sources, залиште один файл та відновіть чисте оновлення.

Що означає помилка дубльованих джерел 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 відмовляється продовжувати, оскільки два оголошення вказують на різні ключі підпису для одного архіву. Він об’єднає два ідентичні оголошення, але не вибиратиме між двома значеннями 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 (уніфікований ідентифікатор ресурсу) архіву, suite і один або кілька компонентів. Оскільки значення визначається позицією, пробіл у неправильному місці змінює те, як 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, а кожен параметр у дужках перетворюється на окреме поле, тому 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

Пара — це два записи з однаковим хостом і однаковим набором репозиторіїв. Обидва вказують на https://download.docker.com/linux/ubuntu і набір noble, тобто це один репозиторій, записаний двічі. Їхні шляхи Signed-By також відрізняються, через що виникає помилка Conflicting values, показана раніше.

Для цього кроку використовуйте grep, а не команду apt. Якщо apt уже зупиняється через конфлікт, він також не може вивести список джерел, тому apt-cache policy виводить ту саму помилку замість потрібної відповіді.

Виправлення: залиште deb822-файл, видаліть застарілий файл

Залиште файл .sources. Це формат, який apt tooling записує тепер, і саме до нього переходять 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, тепер повідомляє про помилку щоразу під час запуску. Саме тому на сервері з налаштованими автоматичними оновленнями безпеки варто видаляти непрацююче джерело: саме в щоденному шумі може сховатися справжня помилка.

Вимкнення одного джерела без порушення роботи інших

Для файлу 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-стека на Ubuntu 24.04 сторонні репозиторії не потрібні: архів Ubuntu містить усі використовувані ним пакети та надає оновлення безпеки протягом усього життєвого циклу випуску.
  • Зберігайте ключі в /etc/apt/keyrings/, по одному файлу для кожного постачальника, з режимом 644. Непривілейований користувач _apt завантажує пакети й має читати ключ. Тому файл ключа, доступний лише для root, спричиняє помилку дозволів під час кожного завантаження з цього репозиторію.
  • У кожному описі репозиторію вказуйте в Signed-By саме цей файл. Ключ у /etc/apt/trusted.gpg або /etc/apt/trusted.gpg.d/ вважається довіреним для всіх репозиторіїв на сервері. Через це ключ постачальника, доданий кілька років тому, може перевіряти пакети з будь-якого джерела.
  • Перед оновленням до нового випуску перегляньте налаштовані джерела та перевірте, чи кожен постачальник уже публікує пакети для випуску, до якого ви переходите.

Ключ у старому глобальному сховищі ключів повідомляє про себе під час кожного оновлення:

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.

Експортуйте цей ключ в окремий файл і вкажіть його в описі репозиторію:

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 до опису репозиторію та виконайте sudo apt update. Попередження зникне, коли жоден репозиторій більше не залежатиме від старого сховища ключів. Після цього запис можна видалити за допомогою 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 і компонент. У повідомленні вказано обидва файли з номерами рядків, наприклад 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 додайте Enabled: no до stanza. В однорядковому файлі .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 перетворює наявні файли.

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