← Весь справочник

apt и dpkg

Пакеты в Debian и Ubuntu — установка, удаление, поиск, версии, какому пакету принадлежит файл

В Debian и Ubuntu программы ставятся пакетами .deb. dpkg — низкоуровневый инструмент: устанавливает и удаляет отдельные .deb-файлы и ведёт базу установленных пакетов, но зависимости сам не скачивает. apt (и старые apt-get, apt-cache) работает поверх dpkg: берёт пакеты из репозиториев, сам подтягивает зависимости и обновления. На практике ставят и удаляют через apt, а dpkg используют для вопросов «что установлено?» и «откуда этот файл?».

Синтаксис

apt [опции] команда [пакет…]
apt-get [опции] команда [пакет…]     # стабильный вывод — для скриптов
apt-cache команда [пакет…]
dpkg [опции] действие [пакет|файл…]

Установка и удаление требуют root (sudo). Поиск и просмотр работают от любого пользователя.

apt: установка и удаление

КомандаЧто делает
apt updateскачать свежие списки пакетов из репозиториев — делай перед install
apt install пакет…установить с зависимостями; уже установленный — обновить до последней версии
apt install пакет=версияустановить конкретную версию
apt install ./файл.debустановить локальный .deb с подтягиванием зависимостей (путь обязательно с ./ или /)
apt reinstall пакетпереустановить
apt remove пакетудалить программу, оставив конфигурационные файлы
apt purge пакетудалить вместе с конфигурацией
apt autoremoveудалить зависимости, которые больше никому не нужны
apt upgradeобновить всё установленное (не удаляя пакеты)
apt full-upgradeобновить всё, разрешая удалять и ставить пакеты ради зависимостей
apt download пакеттолько скачать .deb в текущий каталог
apt cleanочистить кэш скачанных .deb в /var/cache/apt/archives

apt: поиск и информация

КомандаЧто делает
apt search словоискать в именах и описаниях; --names-only — только в именах
apt show пакетописание, версия, размер, зависимости
apt list --installedустановленные пакеты
apt list --upgradableчто можно обновить (после apt update)
apt-cache policy пакетустановленная версия, кандидат на установку и из каких репозиториев
apt-cache madison пакетвсе доступные версии по репозиториям
apt-cache depends пакетот чего зависит пакет
apt-cache rdepends пакеткакие пакеты зависят от этого

Опции apt и apt-get

ОпцияЧто делает
-yотвечать «да» на все вопросы — для скриптов
-s, --dry-runтолько показать, что будет сделано
-q / -qqтише / почти без вывода
--no-install-recommendsне ставить рекомендованные пакеты — меньше лишнего
-f installпочинить нарушенные зависимости
--only-upgradeс install: только обновить, если пакет уже стоит

apt-mark

КомандаЧто делает
apt-mark hold пакет / unholdзапретить / разрешить обновление пакета
apt-mark showholdпакеты, закреплённые от обновления
apt-mark showmanual / showautoустановленные вручную / как зависимости (их уберёт autoremove)
apt-mark manual пакетпометить как установленный вручную, чтобы autoremove его не тронул

dpkg

КомандаЧто делает
dpkg -l [шаблон]список пакетов с состоянием и версией: dpkg -l 'python3*'
dpkg -L пакеткакие файлы установил пакет
dpkg -S путькакому пакету принадлежит файл: dpkg -S /usr/bin/flock
dpkg -s пакетстатус и описание установленного пакета
dpkg -i файл.debустановить .deb (зависимости не скачивает)
dpkg -r пакет / dpkg -P пакетудалить / удалить с конфигурацией
dpkg -c файл.deb / dpkg -I файл.debсодержимое / метаданные .deb-файла без установки
dpkg --configure -aдонастроить пакеты после прерванной установки
dpkg-query -W -f='${Package} ${Version}\n'список в своём формате

Состояние в dpkg -l

Первые две буквы строки: желаемое действие и текущее состояние.

КодЧто значит
iiустановлен и работает
rcудалён (remove), но конфигурационные файлы остались — уберёт purge
unне установлен
hiустановлен и закреплён (apt-mark hold)
iU / iFраспакован, но не настроен / настройка сорвалась — лечит dpkg --configure -a

Примеры

# обновить списки и поставить пакет без вопросов
apt update && apt install -y tree

# в Dockerfile и скриптах — apt-get, без рекомендаций и вопросов
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends curl

# какой версии пакет стоит и что доступно
apt-cache policy bash

# установлен ли пакет (для скрипта: код 0 — да)
dpkg -s jq >/dev/null 2>&1 && echo "jq установлен"

# найти пакет, из которого пришла команда
dpkg -S "$(command -v flock)"

# где лежат файлы пакета, например его конфиги
dpkg -L cron | grep ^/etc

# список установленных пакетов с версиями
dpkg-query -W -f='${Package}\t${Version}\n' | head

# самые большие пакеты (размер в КиБ)
dpkg-query -W -f='${Installed-Size}\t${Package}\n' | sort -n | tail -5

# пакеты, удалённые без purge, — с оставшимися конфигами
dpkg -l | awk '/^rc/ { print $2 }'

# посмотреть, что сделает установка, ничего не меняя
apt install -s nginx

# заморозить версию
apt-mark hold nginx

Подводные камни

  • Без сети не установить ничего. В песочнице может не быть доступа в интернет: apt update печатает Temporary failure resolving и всё равно возвращает код 0, а apt install отвечает Unable to locate package или has no installation candidate. Команды dpkg -l/-L/-S/-s и apt-cache policy при этом работают — они читают локальную базу.
  • Unable to locate package часто значит «не было apt update». В Docker-образах списки пакетов удалены ради размера, и сначала их нужно скачать.
  • remove оставляет конфиги. Пакет остаётся в dpkg -l со статусом rc, а файлы в /etc — на месте. Чтобы стереть всё, используй purge.
  • apt — не для скриптов. Его вывод может меняться между версиями, о чём он сам предупреждает: WARNING: apt does not have a stable CLI interface. В скриптах и Dockerfile используй apt-get и apt-cache.
  • Вопросы при установке вешают скрипт. Нужны -y и DEBIAN_FRONTEND=noninteractive — иначе apt ждёт ответа «Y/n» или вопросов от debconf.
  • dpkg -i не ставит зависимости. Если их не хватает, пакет остаётся ненастроенным. Ставь локальные файлы через apt install ./файл.deb или почини после: apt -f install.
  • apt install пакет обновляет уже установленный пакет, если есть новая версия. Чтобы этого не случилось, закрепи его через apt-mark hold.
  • could not get lock /var/lib/dpkg/lock-frontend — уже работает другой apt или dpkg (часто автообновление). Дождись его завершения, а не удаляй файлы блокировки.

См. также

which · sudo · service · curl · env