Короткий ответ
Разведите четыре отказа: (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 resolution | DNS |
| NO_PUBKEY | ключ, не «зеркало медленное» |
| kept back | hold/phased/transition |
Возможные причины
unattended-upgradesилиapt.systemd.dailyдержит lock.- ENOSPC — диск.
- Неверное зеркало / старый
archive.ubuntu.comпуть. - Часы сильно в прошлом — TLS и Valid-Until — NTP.
apt-mark hold linux-image-*.- Phased updates Ubuntu (пакет «kept back» без hold).
- Прокси
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: 100Priority 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-upgradesupdate без 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.