В мире Red Hat, Fedora и SUSE пакеты упакованы в формат RPM, а ставятся и обновляются через менеджеры более высокого уровня. Задача администратора - не просто поставить программу, а понимать, какой инструмент за что отвечает: rpm работает с одним файлом и локальной базой, dnf и zypper тянут зависимости из репозиториев и проверяют подписи. В этом уроке разберём оба уровня, увидим, чем dnf5 в Fedora 41+ отличается от dnf4 в RHEL 10, и как zypper делает то же самое на стороне SUSE.

Как это работает
RPM - это и формат файла (имя_версия_релиз_архитектура.rpm), и низкоуровневая утилита, и локальная база установленных пакетов. База в современных системах лежит в /var/lib/rpm и с RHEL 9 хранится в формате sqlite, а не в старых berkeley db файлах. Команда rpm работает только с тем, что вы ей подсунули: дали один .rpm - поставит ровно его, а если ему не хватает зависимостей, просто откажется с ошибкой. Сам он по сети ничего не ищет.
Поверх rpm стоит менеджер уровня репозиториев. Он читает метаданные из настроенных репозиториев, строит граф зависимостей через решатель (в dnf это libdnf и libsolv, в zypper - libzypp с тем же libsolv), скачивает нужные пакеты и вызывает rpm транзакцией. Именно поэтому вы говорите dnf install nginx, а не ищете руками десяток зависимых rpm.
Репозиторий - это каталог с пакетами плюс сжатые метаданные (repodata), описывающие, что в нём лежит и что от чего зависит. Доверие к репозиторию строится на GPG-подписи: метаданные и сами пакеты подписаны ключом, а открытый ключ вы импортируете заранее. Без совпадения подписи менеджер откажется ставить пакет - это защита от подмены.
Важный сдвиг 2026 года: в Fedora 41 и новее по умолчанию стоит dnf5 - переписанный на C++ менеджер, который заодно заменил собой microdnf, так что отдельного minimal-варианта в контейнерах больше не нужно. А вот RHEL 10, Rocky и Alma 10 пока остаются на dnf4 (ветка из Fedora 40). Команда yum во всех них - просто символическая ссылка на dnf, живущая для совместимости.
Команды и примеры
Низкоуровневый rpm. Запросы (-q) читают локальную базу, установка (-i) и удаление (-e) меняют систему.
Код: Выделить всё
rpm -qa # все установленные пакеты
rpm -q bash # версия конкретного пакета
rpm -qi bash # подробная инфо: лицензия, сборщик, дата
rpm -ql bash # список файлов пакета
rpm -qf /bin/ls # какому пакету принадлежит файл
rpm -qc httpd # только конфиги пакета
rpm -V bash # верификация: что изменилось с момента установки
rpm -ihv ./pkg.rpm # установить локальный файл (h - прогресс, v - подробно)
rpm -e bash # удалить (откажется, если есть зависящие)
rpm --import KEY.gpg # импортировать GPG-ключ в базу rpm
DNF на RHEL/Fedora. Имена подкоманд одинаковы для dnf4 и dnf5.
Код: Выделить всё
dnf search nginx # поиск по имени и описанию
dnf info nginx # сведения о пакете из репозитория
dnf provides /usr/sbin/nginx # какой пакет даёт этот файл/возможность
dnf install nginx # установка с зависимостями
dnf remove nginx # удаление
dnf upgrade # обновить всё (update - синоним)
dnf list installed # установленные пакеты
dnf list --available # доступные в репозиториях
dnf history # журнал транзакций
dnf history undo 42 # откатить транзакцию номер 42
dnf group list # группы пакетов
dnf group install "Development Tools"
dnf repolist # список подключённых репозиториев
Код: Выделить всё
[myrepo]
name=My Local Repo
baseurl=https://repo.example.com/el10/
enabled=1
gpgcheck=1
gpgkey=https://repo.example.com/RPM-GPG-KEY-example
Код: Выделить всё
zypper search nginx # поиск (se)
zypper info nginx # сведения
zypper install nginx # установка (in)
zypper remove nginx # удаление (rm)
zypper refresh # обновить метаданные репозиториев (ref)
zypper update # обновить пакеты (up)
zypper dup # distribution upgrade - для rolling и смены версии
zypper repos # список репозиториев (lr)
zypper addrepo URL alias # добавить репозиторий (ar)
zypper what-provides /bin/ls # аналог dnf provides (wp)
Частые грабли
- rpm -i не подтянет зависимости и просто упадёт с failed dependencies - для всего, что сложнее одного автономного пакета, берите dnf или zypper.
- Отключать gpgcheck ради удобства - прямой путь к установке подменённого пакета. Лучше импортировать ключ через rpm --import.
- После добавления репозитория метаданные могут быть кэшированы. В zypper нужен refresh, в dnf обычно срабатывает автоматически, но dnf clean all спасает при странном поведении.
- Путать update и upgrade в dnf не страшно (синонимы), а вот в zypper up и dup - совсем разные вещи: dup может удалить пакеты при смене дистрибутива.
- Ждать microdnf на Fedora 41+ бессмысленно - его больше нет, dnf5 сам по себе компактный. На RHEL 10 microdnf ещё встречается в минимальных образах.
- rpm -e по имени без версии при двух установленных версиях выдаст ошибку multiple packages - указывайте полное имя-версию.
- На стенде с Fedora/RHEL или openSUSE определите версию менеджера: dnf --version (увидите 5.x на Fedora 41+) или zypper --version.
- Узнайте, какому пакету принадлежит /usr/bin/ssh, через rpm -qf, затем посмотрите все его файлы через rpm -ql.
- Найдите пакет, предоставляющий бинарник, командой dnf provides */netstat (или zypper wp), и поставьте его.
- Запустите rpm -V на любом пакете, отредактируйте его конфиг и снова выполните rpm -V - найдите строку с пометкой c.
- Создайте файл репозитория в /etc/yum.repos.d/ или добавьте репозиторий через zypper ar, проверьте через dnf repolist / zypper lr.
- Посмотрите журнал dnf history (или zypper история через /var/log/zypp/history) и найдите свою последнюю установку.
- Чем принципиально отличается rpm -i от dnf install при установке пакета с зависимостями?
- Какой ключ rpm покажет, какому пакету принадлежит конкретный файл, и какой - список всех файлов пакета?
- Что произойдёт при установке, если gpgcheck=1, но соответствующий GPG-ключ не импортирован?
- В чём разница между zypper update и zypper dup, и когда применять второе?
- Что изменилось в Fedora 41+ относительно dnf и microdnf, и какой менеджер по умолчанию в RHEL 10?
- Как откатить последнюю транзакцию dnf и где dnf хранит её журнал?