Перейти к содержанию

8. Управление пакетами и сборка ПО


apt, yum/dnf, приоритеты репозиториев, основы rpm/deb и линковка (ldd) — для управления зависимостями, обновлениями и конфликтами пакетов.


apt (Debian / Ubuntu)

apt — фронтенд к пакетной системе Debian (deb). Управление репозиториями — в /etc/apt/sources.list и файлах в /etc/apt/sources.list.d/. Обновление списков пакетов и установка:

sudo apt update          # обновить кэш списков из репозиториев
sudo apt install nginx   # установить пакет
sudo apt upgrade         # обновить установленные пакеты
sudo apt full-upgrade    # обновить с разрешением смены зависимостей (удаление/установка)
sudo apt remove nginx   # удалить пакет (конфиги остаются)
sudo apt purge nginx    # удалить пакет и конфиги

Зависимости подтягиваются автоматически. При конфликтах или удержании пакетов apt выводит сообщения; разбор: apt-cache policy <pkg>, apt-cache depends <pkg>, dpkg -l для списка установленного.


yum и dnf (RHEL / CentOS / Fedora)

yum (старый) и dnf (новый, по умолчанию в RHEL 8+, Fedora) — менеджеры пакетов для семейства Red Hat (пакеты rpm, репозитории в .repo). Команды аналогичны по смыслу:

sudo dnf update         # обновить все пакеты (аналог upgrade)
sudo dnf install nginx  # установить
sudo dnf remove nginx   # удалить
sudo dnf repolist       # список включённых репозиториев
sudo dnf list installed

Конфиги репозиториев — /etc/yum.repos.d/*.repo. Приоритет репозиториев задаётся параметром priority (в плагине priorities) или по порядку включения; при нескольких репозиториях с одним пакетом выбирается версия согласно приоритету.


Приоритеты репозиториев (repo priorities)

Когда один и тот же пакет доступен из нескольких репозиториев, система должна выбрать, откуда ставить. Приоритет задаёт порядок выбора: меньше число — выше приоритет.

  • apt (Debian/Ubuntu): в строке репозитория можно указать pin; отдельно настраивается через /etc/apt/preferences (Pin-Priority). Или порядок строк в sources.list влияет при равных версиях.
  • dnf/yum: плагин priorities — в .repo файле для репозитория задаётся priority=N. При установке выбирается пакет из репозитория с наивысшим приоритетом (меньшее N).

Типичная схема: базовый дистрибутив — высокий приоритет; сторонний репозиторий (например, EPEL, собственный) — ниже, чтобы не перезаписать системные пакеты неожиданной версией. При «установилась не та версия» проверять приоритеты и список репозиториев.


Основы rpm и deb

rpm

rpm — низкоуровневая установка/запрос пакетов в RHEL/CentOS/Fedora. dnf/yum вызывают rpm внутри. Полезные команды:

rpm -qi nginx       # информация о пакете
rpm -ql nginx       # список файлов пакета
rpm -qf /usr/sbin/nginx   # какому пакету принадлежит файл
rpm -qR nginx       # зависимости (requires)

Установка локального .rpm: rpm -ivh package.rpm (лучше через dnf localinstall, чтобы подтянуть зависимости).

deb и dpkg

dpkg — низкоуровневая установка .deb пакетов в Debian/Ubuntu. apt использует dpkg. Команды:

dpkg -i package.deb  # установить (зависимости не подтягиваются автоматически)
dpkg -l              # список установленных
dpkg -L nginx        # файлы пакета
dpkg -S /usr/sbin/nginx   # какому пакету принадлежит файл

После dpkg -i при нехватке зависимостей часто выполняют apt -f install (fix broken), чтобы apt доставил недостающие пакеты.


Динамическая и статическая линковка (ldd)

Динамическая линковка

При динамической линковке бинарник не содержит код библиотек; при запуске загрузчик (ld.so) подгружает общие библиотеки (.so) из системы (каталоги из /etc/ld.so.conf, LD_LIBRARY_PATH). Зависимости видны в списке «needed» у бинарника. Команда ldd выводит, какие библиотеки требуются и куда они резолвятся:

ldd /usr/bin/nginx
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
# ...

Если библиотека «not found» — путь не найден или версия не та; возможны ошибки при запуске (missing library). Обновление кэша путей: ldconfig.

Статическая линковка

При статической линковке код библиотек включён в сам бинарник; внешние .so для неё не нужны. Размер исполняемого файла больше, зато он не зависит от установленных версий библиотек на системе. Проверка: ldd binary — мало строк или только системные (например, libc); либо file binary может указывать statically linked.

Для переноса бинарников между системами (контейнеры, минимальный образ) иногда собирают статически, чтобы не тащить среду с библиотеками.

!!! tip "Практика"

При «binary not found» или «cannot open shared object» — смотреть ldd на бинарник и при необходимости установить пакет с нужной библиотекой или задать LD_LIBRARY_PATH. При конфликтах пакетов — проверять репозитории и приоритеты (apt policy, dnf repolist и priority в .repo).

Паттерны и антипаттерны

Паттерн Описание
Перед массовым обновлением — тест на копии Обновления могут ломать зависимости; сначала stage/test.
Фиксировать версии в production Не ставить последнюю по умолчанию без контроля; pin или фиксированные репозитории.
Знать свой менеджер пакетов apt vs dnf — разный синтаксис и расположение конфигов.
Антипаттерн Почему плохо Что делать
Смешивать репозитории без приоритетов Из стороннего репо может подтянуться несовместимая версия. Задавать приоритеты и проверять apt policy / dnf repolist.
Игнорировать «broken» после dpkg -i Зависимости не установлены, пакет в поломанном состоянии. Выполнять apt -f install или доустанавливать зависимости вручную.

Дополнительные материалы