Любая работа администратора Debian или Ubuntu сводится к установке, обновлению и удалению софта без поломки системы. В этом уроке разберём два слоя инструментов: низкоуровневый dpkg, который оперирует одним .deb-файлом, и высокоуровневый apt, который тянет зависимости из репозиториев. Поймём, кто за что отвечает, как читать локальную базу пакетов и где прячутся источники. Дистрибутивы для примеров - Debian 13 (trixie) и Ubuntu 24.04 LTS.

Как это работает
Пакет .deb - это ar-архив из трёх частей: метаданные (control), сами файлы (data) и debian-binary с версией формата. dpkg распаковывает data в корень файловой системы, прописывает пакет в свою базу и запускает скрипты сопровождения (preinst, postinst). База dpkg живёт в /var/lib/dpkg: список установленного в файле status, а перечни файлов каждого пакета - в /var/lib/dpkg/info/*.list. Именно по этой базе работают запросы dpkg -l, -L, -S.
Ключевое ограничение: dpkg видит только тот файл, который вы ему дали. Он проверит зависимости и откажется настраивать пакет, у которого их нет, но сам ничего не скачает. Поэтому после dpkg -i с нехваткой зависимостей пакет повисает в состоянии полу-настроенного.
Над dpkg стоит apt. Он знает про репозитории, держит локальный кэш описаний всех доступных пакетов, строит граф зависимостей и решает, что докачать. apt вызывает dpkg для собственно установки. apt-get и apt-cache - это старый стабильный интерфейс для скриптов, а apt - человекочитаемая обёртка с прогресс-баром и цветом. В 2026 в интерактивной работе используют apt, в автоматизации - apt-get (его вывод стабилен между версиями).
Откуда apt берёт пакеты, задаётся в /etc/apt/sources.list и в отдельных файлах каталога /etc/apt/sources.list.d/. В современных Debian 13 и Ubuntu 24.04 формат deb822 (файлы с расширением .sources) стал основным: вместо одной строки - блок полей Types, URIs, Suites, Components, Signed-By. Ключи репозиториев теперь не сваливают в общий доверенный набор, а указывают через Signed-By на конкретный файл в /etc/apt/keyrings.
Команды и примеры
Низкий уровень, dpkg. Установка локального файла, просмотр и поиск:
Код: Выделить всё
dpkg -i ./mc_4.8.31_amd64.deb # установить .deb (зависимости НЕ тянет)
dpkg -l | grep mc # есть ли пакет и его состояние (ii = ok installed)
dpkg -L mc # какие файлы принадлежат пакету
dpkg -S /usr/bin/mc # какому пакету принадлежит этот файл
dpkg -r mc # удалить, оставив конфиги
dpkg -P mc # purge: удалить вместе с конфигами
dpkg --configure -a # донастроить все недонастроенные пакеты
Высокий уровень, apt. Обновление индексов и установка с зависимостями:
Код: Выделить всё
apt update # обновить локальный кэш описаний из репозиториев
apt install nginx # установить пакет и все его зависимости
apt remove nginx # удалить пакет, конфиги оставить
apt purge nginx # удалить вместе с конфигами
apt autoremove # снести зависимости, которые больше никому не нужны
apt search reverse-proxy # поиск по имени и описанию
apt show nginx # подробности: версия, зависимости, размер
Код: Выделить всё
apt upgrade # обновить пакеты БЕЗ удаления уже установленных
apt full-upgrade # то же, но РАЗРЕШЕНО удалять пакеты ради разрешения зависимостей
Фиксация версии (hold), чтобы пакет не обновлялся:
Код: Выделить всё
apt-mark hold nginx # запретить обновление nginx
apt-mark unhold nginx # снять фиксацию
apt-mark showhold # список зафиксированных
dpkg --get-selections | grep hold # альтернативный взгляд через dpkg
Код: Выделить всё
apt install -f # fix-broken: доустановить зависимости и донастроить
Частые грабли
- Забыли apt update перед install после правки источников. apt поставит старую версию из устаревшего кэша или скажет, что пакет не найден.
- Ставите .deb через dpkg -i и удивляетесь ошибке зависимостей. Используйте apt install ./file.deb - он и поставит файл, и подтянет зависимости.
- remove вместо purge оставляет конфиги в /etc. При переустановке всплывают старые настройки, а dpkg -l показывает пакет в состоянии rc.
- apt autoremove может снести нужное, если пакет был установлен как зависимость, а вы пользуетесь им напрямую. Пометьте его apt-mark manual.
- Ручная правка /var/lib/dpkg/status. Это прямой путь к разрушению базы. Состояния меняют только через apt-mark и dpkg.
- Сторонний репозиторий без Signed-By в deb822 либо не подпишется ключом, либо apt откажется его использовать. Старый apt-key в 2026 удалён.
- На стенде Debian 13 или Ubuntu 24.04 выполните apt update, затем apt install mc tree.
- Узнайте, какому пакету принадлежит /usr/bin/tree, через dpkg -S, и выведите список его файлов через dpkg -L.
- Зафиксируйте mc командой apt-mark hold mc и проверьте apt-mark showhold.
- Запустите apt upgrade и убедитесь, что mc в списке к удержанию не трогается.
- Снимите фиксацию apt-mark unhold mc.
- Удалите tree через apt remove, затем найдите оставшийся в состоянии rc пакет в dpkg -l и доведите до purge.
- Запустите apt autoremove и посмотрите, что система предложит убрать.
- Чем dpkg -i принципиально отличается от apt install при установке одного .deb-файла?
- Какая команда покажет, какому пакету принадлежит файл /etc/nginx/nginx.conf?
- В чём разница между apt upgrade и apt full-upgrade и когда нужен второй?
- Что означают символы rc в первой колонке вывода dpkg -l и как от этого состояния избавиться?
- Где задаются источники пакетов и зачем в формате deb822 нужно поле Signed-By?
- Как запретить обновление конкретного пакета и как потом снять запрет?