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 или доустанавливать зависимости вручную. |