Как исправить ошибку дублирования источников в apt
Ошибка apt о многократной настройке целевого репозитория возникает при конфликте файлов .list и .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 отказывается работать, так как два объявления указывают разные ключи подписи для одного архива. 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 и более новых версиях создает файлы.sourcesв формате deb822, поэтому 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 описывает то же самое в виде блока именованных полей. Название происходит от 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, дистрибутив — Suites, компоненты — Components, а каждый параметр в скобках превращается в отдельное поле: signed-by= становится Signed-By:, а arch= — Architectures:.
Названия всех полей даны во множественном числе, так как каждое поле принимает список значений, разделенных пробелами. Одно поле Suites: noble noble-updates noble-backports в блоке заменяет три отдельные строки deb. Пустая строка завершает блок, поэтому один файл .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 и набор 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 не опубликовал ничего для этого дистрибутива, поэтому путь на сервере отсутствует, и запрос возвращает 404. Остальные репозитории продолжают обновляться, а уже установленные пакеты остаются без изменений. Однако команда завершается с ненулевым кодом, поэтому любой скрипт, проверяющий статус выполнения apt update, теперь будет сообщать об ошибке при каждом запуске. Именно поэтому неработающий источник стоит удалить на сервере с настроенными автоматическими обновлениями безопасности: в ежедневном потоке уведомлений легко пропустить реальный сбой. Скрипты установки от поставщиков часто сталкиваются с обеими этими проблемами, поэтому большинство ошибок установки Tailscale в Ubuntu сводятся либо к отсутствующей связке ключей, которую скрипт не смог записать, либо к кодовому имени релиза, отсутствующему в архиве.
Отключение одного источника без нарушения работы остальных
Для файла в формате deb822 добавьте одно поле в секцию и сохраните изменения:
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 рекомендует этот способ вместо комментирования каждой строки секции, так как его проще отменить. Для однострочного файла добавьте # в начало строки. Для обоих форматов также подходит перемещение файла из /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
Начиная с августа 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/ объявляют один и тот же репозиторий, дистрибутив и компонент. Сообщение указывает оба файла с номерами строк, например 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 в нужную секцию. В однострочном файле .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 конвертирует имеющиеся у вас файлы.