Короткий ответ

Разведите четыре отказа: (1) lock — другой apt/unattended-upgrades жив; (2) сеть/DNS/зеркало; (3) подпись Release (NO_PUBKEY, EXPKEYSIG); (4) hold/phased updates/broken depends. rm /var/lib/dpkg/lock без lsof — путь к сломанной базе. На 24.04 источники часто в /etc/apt/sources.list.d/ubuntu.sources (DEB822), на 22.04 — /etc/apt/sources.list. Suite jammy vs noble должен совпадать с lsb_release.

Хост host.example (10.0.20.10), пользователь admin.

Симптомы и как отличить

sudo apt-get update
sudo apt-get upgrade --dry-run
СообщениеКуда
Could not get lockэта статья + dpkg заблокирован
404 / suiteрепозиторий
Temporary failure in name resolutionDNS
NO_PUBKEYключ, не «зеркало медленное»
kept backhold/phased/transition

Возможные причины

  1. unattended-upgrades или apt.systemd.daily держит lock.
  2. ENOSPC — диск.
  3. Неверное зеркало / старый archive.ubuntu.com путь.
  4. Часы сильно в прошлом — TLS и Valid-Until — NTP.
  5. apt-mark hold linux-image-*.
  6. Phased updates Ubuntu (пакет «kept back» без hold).
  7. Прокси Acquire::http::Proxy мёртвый.

Диагностика

lsb_release -a
uname -r
sudo lsof /var/lib/dpkg/lock-frontend /var/lib/apt/lists/lock 2>/dev/null
ps aux | grep -E 'apt|dpkg|unattended' | grep -v grep
df -h / /var
timedatectl

Источники:

cat /etc/apt/sources.list
ls -l /etc/apt/sources.list.d/
cat /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null

Ключи и политика:

sudo apt-get update 2>&1 | tail -n 40
apt-cache policy
apt-mark showhold
apt-config dump | grep -iE 'proxy|hash|phased'

Phased:

apt-config dump | grep Machine-ID
cat /etc/apt/apt.conf.d/20apt-esm-hook.conf 2>/dev/null

Для конкретного пакета:

apt-cache policy nginx

Решение

Сценарий A. Живой apt

Не убивайте. Ждите или:

systemctl status unattended-upgrades apt-daily.service apt-daily-upgrade.service --no-pager

Если завис часами на ENOSPC — чистите диск, затем dpkg lock по процедуре.

Сценарий B. Зеркало и suite

См. отдельную статью про репозиторий. Кратко: не меняйте jammy на noble в sources как «способ обновиться» — это не do-release-upgrade.

Сценарий C. NO_PUBKEY

Идентификатор из ошибки, ключ из Ubuntu keyring пакетов:

sudo apt-get install --reinstall ubuntu-keyring
sudo apt-get update

Не качайте ключи с произвольных github gist. Для PPA — signed-by= в DEB822.

Сценарий D. Hold

apt-mark showhold
sudo apt-mark unhold имя_пакета

Только если hold ставили вы, не вендор ради ядра.

Сценарий E. Phased kept back

Либо ждать фазу, либо (осознанно)

sudo apt-get -o APT::Get::Always-Include-Phased-Updates=true upgrade --dry-run

Не включайте always глобально без политики.

Сценарий F. Hash sum mismatch

Часто зеркало/прокси кэш. Смена зеркала, sudo rm только /var/lib/apt/lists/partial/* не всей базы dpkg.

sudo apt-get clean
sudo apt-get update

Порядок разбора: lock → диск → DNS/время → suite → hold

Не начинайте с sed в sources. Сначала lsof на lock. Затем df -h /var. Затем resolvectl query archive.ubuntu.com и timedatectl. Затем URL из ошибки curl -I. Затем apt-mark showhold и apt-cache policy.

Phased updates на Ubuntu: пакет может быть «kept back», пока ваш Machine-ID не попал в фазу. Это не hold. Признак: apt-cache policy показывает candidate выше installed, но apt-get upgrade не берёт без Always-Include-Phased-Updates. Для сервера БД ожидание фазы часто правильнее, чем форс.

needrestart на 24.04 после upgrade спрашивает TTY; в cron это выглядит как «upgrade завис». В noninteractive:

sudo NEEDRESTART_MODE=a apt-get -y upgrade

или конфиг /etc/needrestart/needrestart.conf. Не kill needrestart на середине kernel unpack.

Прокси NTLM корпоративный ломает apt-transport-https. Диагностика: https_proxy в apt-config dump vs curl -I того же URL. Разные CA — Acquire::https::Verify-Peer не выключайте; добавьте корпоративный CA в /usr/local/share/ca-certificates и update-ca-certificates.

HASH SUM MISMATCH на одном пакете при зелёном InRelease: битый файл в /var/cache/apt/archives. Удалите этот .deb (sudo rm /var/cache/apt/archives/имя_версия.deb) и повторите install, не всю lists базу.

apt-get update пишет в /var/lib/apt/lists. Если этот каталог на заполненном /, получите обрубок Release и загадочный 404/mismatch. Сначала место, потом update.

Архитектура i386 в dpkg --print-foreign-architectures без нужды тянет 404 на зеркалах, где foreign не зеркалируют. Снимите: sudo dpkg --remove-architecture i386 только если нет 32-битных пакетов (dpkg -l | awk '$4=="i386"').

Для air-gapped: apt-offline или локальный file:/mirror. Не подкладывайте чужие InRelease без ключа. Проверка apt-cache policy должна показывать origin вашего зеркала, не случайный CDN.

apt-get dist-upgrade vs upgrade: на сервере с held ядра upgrade молчит, full-upgrade предлагает снять пакеты. Читайте список The following packages will be REMOVED целиком. Снятие cgroup-tools или nfs-common из-за конфликта стороннего репо — стоп, чините pin, не соглашайтесь -y.

Pin пример /etc/apt/preferences.d/no-thirdparty:

Package: *
Pin: origin "bad.mirror.example"
Pin-Priority: 100

Priority 100 не даст стороннему пакету вытеснить Ubuntu без явного install. Проверка: apt-cache policy пакет.

dpkg --get-selections | grep hold дублирует apt-mark showhold в другом формате — сверяйте оба, если наследовали хост с древними hold.

Как проверить, что проблема устранена

sudo apt-get update
sudo apt-get upgrade --dry-run
apt-mark showhold
systemctl is-active unattended-upgrades

update без 404/NO_PUBKEY. Upgrade показывает ожидаемый список, не «0 но kept back» без причины.

Если не помогло

  • ESM/Ubuntu Pro сообщения — отдельная подписка, не поломка apt.
  • dpkg was interrupted — статья lock/configure.
  • Репозиторий третьей стороны ломает full-upgrade — отключите его pin.

Профилактика

  • Не мешать sources руками без бэкапа файла.
  • Мониторинг apt-get update в cron/timer с логом.
  • Hold только с тикетом и датой пересмотра.
  • Время и DNS исправны до зеркала.
  • Бэкап sources.list/ubuntu.sources перед сменой зеркала; после apt-get update смотрите код выхода и полный лог, не только последнюю строку.

FAQ

apt vs apt-get?

На скриптах apt-get/apt-cache. apt может менять CLI.

Нужен ли dist-upgrade всегда?

На сервере upgrade + точечный full-upgrade после чтения, что удалится.

unattended-upgrades «мешает»

Это lock на время работы, не баг. Настройте окно, не удаляйте пакет вслепую.

Можно ли dpkg --configure -a всегда?

Если update просит — да, после проверки, что другой dpkg не жив.

22.04 vs 24.04 sources

22.04: one-line deb http://archive.ubuntu.com/ubuntu jammy main. 24.04: Types/URIs/Suites/Components в .sources. Не смешивайте suite.