apt update и apt install работают медленно: выбираем зеркало
Скорость apt почти целиком зависит от зеркала: сервера, с которого скачиваются списки пакетов и сами файлы .deb. Зеркало, выбранное при установке системы, не всегда ближайшее и не всегда быстрое. Ниже: где в современных Ubuntu и Debian прописаны источники, как выбрать зеркало и какие настройки apt помогают на нестабильном канале.
Сначала измерьте
Засеките обновление списков и посмотрите, на каких адресах уходит время:
time sudo apt-get update
sudo apt-get -o Debug::Acquire::http=true update 2>&1 | lessHit: означает, что список не изменился и не скачивался, 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.sources | deb822 |
| Ubuntu 22.04 и старше | /etc/apt/sources.list | однострочный |
| Debian 12 и старше | /etc/apt/sources.list | однострочный |
| Debian 13 | /etc/apt/sources.list.d/debian.sources | deb822 (рекомендуется) |
В 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.