apt update и apt install работают медленно: выбираем зеркало

, 7 мин чтения

Скорость apt почти целиком зависит от зеркала: сервера, с которого скачиваются списки пакетов и сами файлы .deb. Зеркало, выбранное при установке системы, не всегда ближайшее и не всегда быстрое. Ниже: где в современных Ubuntu и Debian прописаны источники, как выбрать зеркало и какие настройки apt помогают на нестабильном канале.

Сначала измерьте

Засеките обновление списков и посмотрите, на каких адресах уходит время:

time sudo apt-get update
sudo apt-get -o Debug::Acquire::http=true update 2>&1 | less

Hit: означает, что список не изменился и не скачивался, Get: что файл загружен, Ign: что файл пропущен. Каждая строка Hit: или Get: содержит адрес источника. Если медленно отвечает один конкретный хост, смена зеркала поможет. Если тормозит всё, включая сторонние репозитории вроде Docker или Node.js, дело скорее в общей сети или DNS. Учтите и то, что сторонние репозитории живут на своих серверах: смена зеркала Ubuntu или Debian их не ускорит.

Скорость скачивания самих пакетов apt показывает в конце установки строкой Fetched ... in ...s (... kB/s). Это удобная точка для сравнения до и после смены зеркала.

Где прописаны источники

Здесь современные системы отличаются от старых инструкций в интернете:

СистемаОсновной файлФормат
Ubuntu 24.04 и новее/etc/apt/sources.list.d/ubuntu.sourcesdeb822
Ubuntu 22.04 и старше/etc/apt/sources.listоднострочный
Debian 12 и старше/etc/apt/sources.listоднострочный
Debian 13/etc/apt/sources.list.d/debian.sourcesdeb822 (рекомендуется)

В Ubuntu 24.04 файл /etc/apt/sources.list остаётся, но в нём только комментарий о переезде. Основные источники правьте в ubuntu.sources. Так выглядит этот файл в формате deb822:

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

Посмотреть, какие настройки apt действуют с учётом всех файлов в /etc/apt/apt.conf.d, можно командой apt-config dump | grep -i acquire.

Зеркало меняется в строке URIs. В Debian 13 команда sudo apt modernize-sources переводит старый sources.list в новый формат.

Сначала резервная копия

Перед любой правкой сохраните файл. Копию не кладите в sources.list.d: apt читает там файлы с расширениями .list и .sources, а про остальные выводит предупреждение. Надёжнее держать копию в домашнем каталоге:

sudo cp /etc/apt/sources.list.d/ubuntu.sources ~/ubuntu.sources.backup

# откат, если что-то пошло не так
sudo cp ~/ubuntu.sources.backup /etc/apt/sources.list.d/ubuntu.sources
sudo apt update

После правки запустите sudo apt update и прочитайте вывод до конца. Строки с W: это предупреждения, с E: ошибки. Если появились ошибки, верните копию и проверьте адрес зеркала.

Как выбрать зеркало Ubuntu

  • Страновые адреса имеют вид http://XX.archive.ubuntu.com/ubuntu/, где XX код страны: de, nl, fi и так далее. За таким именем стоит одно из официальных зеркал этой страны.
  • Полный список официальных зеркал с состоянием синхронизации опубликован на Launchpad: https://launchpad.net/ubuntu/+archivemirrors. Выбирайте зеркала со статусом Up to date.
  • На десктопе то же умеет утилита «Программы и обновления»: в списке серверов выберите «Другой», там есть кнопка «Выбрать лучший сервер».
  • Для arm64 и других архитектур, кроме amd64 и i386, Ubuntu использует ports.ubuntu.com/ubuntu-ports. Многие страновые зеркала эти архитектуры не держат, проверьте перед заменой.

В облаках образы Ubuntu часто уже настроены на зеркало внутри сети провайдера, например с адресом вида <регион>.ec2.archive.ubuntu.com в AWS. Такое зеркало обычно быстрее любого внешнего, и менять его не стоит.

Источник security.ubuntu.com обычно оставляют как есть: обновления безопасности появляются там в первую очередь, а зеркала синхронизируются с задержкой.

Быстро сравнить задержку нескольких зеркал можно так:

for m in archive.ubuntu.com de.archive.ubuntu.com nl.archive.ubuntu.com; do
  printf '%s ' "$m"
  curl -s -o /dev/null -w '%{time_total}\n' "http://$m/ubuntu/dists/noble/InRelease"
done

Файл InRelease небольшой, так что это замер задержки, а не пропускной способности. Для проверки скорости скачайте с кандидата крупный пакет и сравните время.

Многие зеркала доступны и по HTTPS. Для целостности это не обязательно: apt проверяет подпись InRelease ключом из Signed-By, и подменённый пакет не установится. HTTPS скрывает от сети, какие именно пакеты вы ставите, и не даёт промежуточным прокси провайдера вмешиваться в ответы.

Как выбрать зеркало Debian

Для большинства случаев подходит deb.debian.org: этот адрес Debian использует по умолчанию, за ним стоит сеть доставки контента, и запрос уходит на один из ближайших узлов. Если нужен конкретный сервер, список официальных зеркал по странам есть на https://www.debian.org/mirror/list, адреса там вида ftp.XX.debian.org.

Утилита netselect-apt сама замеряет зеркала и пишет результат в файл:

sudo apt install netselect-apt
sudo netselect-apt -c de -o ~/sources.list.test trixie

Флаг -c ограничивает проверку зеркалами одной страны, -o задаёт выходной файл, последним аргументом идёт кодовое имя выпуска. Утилита пишет файл в однострочном формате, поэтому перенесите адрес найденного зеркала в свой файл источников, а не заменяйте его целиком. Источник обновлений безопасности security.debian.org оставьте как есть, по той же причине, что и в Ubuntu.

Настройки apt для нестабильного канала

Создайте отдельный файл, например /etc/apt/apt.conf.d/80-network:

Acquire::Retries "5";
Acquire::http::Timeout "30";
Acquire::https::Timeout "30";
Acquire::Languages "none";
  • Acquire::Retries повторяет неудачные загрузки. Начиная с apt 2.3 повторы включены по умолчанию, три попытки. Значение выше помогает на совсем плохой связи.
  • Acquire::http::Timeout и Acquire::https::Timeout задают таймаут в секундах для соответствующего протокола.
  • Acquire::Languages "none" отключает загрузку переводов описаний пакетов, и apt update скачивает меньше.
  • Acquire::ForceIPv4 "true" пригодится, если IPv6 у провайдера работает плохо и соединения висят до таймаута.
  • Acquire::Queue-Mode задаёт, как apt распараллеливает загрузки: host открывает соединение на каждый хост, access на каждый тип адреса. Обычно его не трогают.

Любой параметр можно проверить разово, без правки файлов, через -o:

sudo apt-get -o Acquire::Retries=10 -o Acquire::ForceIPv4=true update

При установке пакетов меньше качает apt-get install --no-install-recommends: он ставит только обязательные зависимости без рекомендуемых.

Проверьте, не качает ли apt update лишнего. Если в источниках указано Types: deb deb-src, apt загружает ещё и индексы исходников, которые нужны только для apt-get source. Если когда-то добавлялась вторая архитектура, например i386 для старых программ, apt скачивает списки и для неё. Список дополнительных архитектур покажет dpkg --print-foreign-architectures.

Ошибки apt update и что с ними делать

СообщениеПричинаРешение
Hash Sum mismatch или File has unexpected sizeзеркало синхронизируется прямо сейчас или прокси отдал устаревший файлподождать или сменить зеркало, очистить списки
Could not connect to ...:80сервер недоступен или соединение не устанавливаетсяпроверить адрес зеркала и сеть, выбрать другое
Temporary failure resolvingне работает DNSпроверить resolvectl status и /etc/resolv.conf
Release file is not valid yetневерное системное времявключить синхронизацию: timedatectl set-ntp true

К ошибке размера apt часто добавляет подсказку Mirror sync in progress?. Если повтор через некоторое время не помог, очистите скачанные списки и обновите их заново:

sudo rm -rf /var/lib/apt/lists/*
sudo apt-get update

Ошибки NO_PUBKEY и The following signatures couldn't be verified к выбору зеркала не относятся: apt не нашёл ключ репозитория, чаще всего стороннего. Проверьте путь в Signed-By и сам файл ключа.

Если ошибка повторяется только за корпоративным прокси, попробуйте отключить конвейерную отправку запросов: Acquire::http::Pipeline-Depth "0";. По умолчанию apt отправляет до 10 запросов подряд, не дожидаясь ответов, и некоторые прокси с этим путаются.

Много машин: apt-cacher-ng

Если в сети десятки серверов или контейнеров на одном дистрибутиве, поставьте кэширующий прокси apt-cacher-ng. Первая машина скачивает пакет из интернета, остальные получают его из локальной сети. Для одного или двух серверов такой кэш избыточен: проще выбрать хорошее зеркало.

# на сервере кэша
sudo apt install apt-cacher-ng

# на клиентах: /etc/apt/apt.conf.d/01proxy
Acquire::http::Proxy "http://apt-cache.example.lan:3142";

Порт по умолчанию 3142. HTTPS-источники через такой прокси не кэшируются: содержимое зашифровано. Для официальных репозиториев используйте адреса http://. Целостность пакетов всё равно гарантирует подпись репозитория, которую apt проверяет сам.

Статистику и состояние кэша показывает страница http://<сервер>:3142/acng-report.html. Если отдельный репозиторий нужно забирать мимо прокси, на клиенте добавьте исключение для его хоста: Acquire::http::Proxy::download.example.com "DIRECT";.

В Docker-сборках похожий эффект дают кэш-монтирования BuildKit. В официальных образах Debian и Ubuntu скачанные пакеты удаляются после установки, поэтому сначала это поведение отключают. Пример из документации Docker:

RUN rm -f /etc/apt/apt.conf.d/docker-clean; \
    echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt,sharing=locked \
    apt-get update && apt-get install -y --no-install-recommends gcc

Если зеркало быстрое, а загрузка нет

Когда даже ближайшее зеркало отдаёт пакеты медленно, а замеры показывают долгий ответ сервера, проблема в маршруте. Если проблема в маршруте до репозитория, помогает защищённое подключение через ближайшую к нему локацию.

Коротко

  • Сделайте копию файла источников вне sources.list.d.
  • В Ubuntu 24.04 правьте ubuntu.sources, а не sources.list.
  • Берите зеркала только из официальных списков Ubuntu и Debian и смотрите статус синхронизации.
  • Для arm64 в Ubuntu оставьте ports.ubuntu.com или зеркало, которое держит ports.
  • Добавьте Acquire::Retries, таймауты и Acquire::Languages "none".
  • При Hash Sum mismatch подождите или смените зеркало, затем очистите /var/lib/apt/lists.
  • Для парка машин поставьте apt-cacher-ng.

Стабильный канал для работы

Один ключ, 20 стран, до 5 устройств на Standard. Возврат в течение 7 дней.

Все тарифы