dnf и сторона RHEL
RHEL/Fedora использует ту же двухуровневую модель: dnf — front-end, rpm — движок. Конфигурация репозиториев в /etc/yum.repos.d/. У каждой команды apt есть аналог в dnf — выучив соответствие, ты станешь эффективен на обоих семействах дистрибутивов.
Три года на Ubuntu. Каждый сервер, который ты развернул, использует apt. Затем ты приходишь в команду, где production работает на RHEL 9 — и каждая команда выдаёт ошибку. apt не найден. sources.list не существует. Названия пакетов немного другие. Путь к «просто установить nginx» теперь — три незнакомые команды и файл репозитория, который ты никогда не писал. Этот урок — мост. Архитектура идентична: front-end над низкоуровневым движком. Как только ты увидишь соответствие, за час станешь дееспособным на RHEL/Fedora/CentOS Stream.
После этого урока ты сможешь переводить распространённые команды apt в их аналоги dnf, управлять файлами репозиториев в /etc/yum.repos.d/, использовать rpm для запросов и проверки установленных пакетов, объяснять что такое модули AppStream и почему они заменяют некоторые простые установки через dnf, а также объяснять соотношение RHEL, Fedora и CentOS Stream.
Двухуровневая модель идентична для обоих семейств дистрибутивов. На Debian/Ubuntu: apt (front-end) → dpkg (движок). На RHEL/Fedora: dnf (front-end) → rpm (движок). То же разделение ответственности: dnf разрешает зависимости и управляет репозиториями, rpm управляет локальной базой и установкой файлов.
| apt (Debian/Ubuntu) | dnf (RHEL/Fedora) | что делает |
|---|---|---|
apt update | dnf check-update | обновить индекс пакетов |
apt upgrade | dnf upgrade | установить доступные обновления |
apt install nginx | dnf install nginx | установить пакет |
apt remove nginx | dnf remove nginx | удалить пакет |
apt autoremove | dnf autoremove | удалить неиспользуемые зависимости |
apt search nginx | dnf search nginx | поиск в индексе |
apt show nginx | dnf info nginx | показать метаданные пакета |
# Аналоги распространённых apt-команд на RHEL/Fedora
sudo dnf check-update # проверить обновления (не устанавливать)
sudo dnf upgrade # установить все доступные обновления
sudo dnf install nginx # установить nginx
sudo dnf remove nginx # удалить nginx
dnf info nginx # версия, размер, описаниеОдно поведенческое отличие: dnf upgrade автоматически выполняет аналог apt update перед проверкой обновлений. Запускать dnf check-update отдельно перед dnf upgrade не нужно.
Конфигурация репозиториев находится в файлах /etc/yum.repos.d/*.repo. Формат — INI, аналогично unit-файлам systemd:
# /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=trueКлючевые поля: baseurl (или mirrorlist), gpgcheck=1 (проверять подписи — всегда оставляй 1), enabled=1/0 (включить/выключить без удаления), gpgkey (URL или путь к GPG-ключу).
# Добавить репозиторий из .repo-файла
sudo dnf config-manager --add-repo https://example.com/package.repo
# Список включённых репозиториев
dnf repolist
# Список всех репозиториев, включая отключённые
dnf repolist --all
# Включить/выключить репозиторий по ID
sudo dnf config-manager --set-enabled nginx-stable
sudo dnf config-manager --set-disabled nginx-stableПеременные $releasever и $basearch подставляются dnf во время выполнения: $releasever становится 9 на RHEL 9, $basearch — x86_64 или aarch64 в зависимости от системы. Это позволяет одному .repo-файлу работать на разных мажорных версиях.
rpm — низкоуровневый движок, аналог dpkg. Все метаданные установленных пакетов хранятся в /var/lib/rpm/ (база данных SQLite, в отличие от plain-text формата dpkg). Флаги запросов зеркалят флаги dpkg:
| команда dpkg | аналог rpm | назначение |
|---|---|---|
dpkg -l | rpm -qa | список всех установленных пакетов |
dpkg -L nginx | rpm -ql nginx | файлы пакета |
dpkg -S /usr/sbin/nginx | rpm -qf /usr/sbin/nginx | пакет-владелец файла |
dpkg -V nginx | rpm -V nginx | проверка контрольных сумм |
dpkg -i ./pkg.rpm | rpm -i ./pkg.rpm | установить из локального файла |
# Список всех установленных пакетов
rpm -qa
# Какой пакет владеет этим файлом?
rpm -qf /usr/bin/nginx
# Список всех файлов, установленных nginx
rpm -ql nginx
# Проверить файлы nginx по базе RPM (обнаружить вмешательство)
rpm -V nginx
# Формат вывода: SM5DLUGTP c /etc/nginx/nginx.conf
# S=размер, M=права, 5=md5, D=устройство, L=симлинк, U=пользователь, G=группа, T=mtime
# Установить локальный .rpm-файл (rpm не разрешает зависимости — лучше использовать dnf)
sudo rpm -ivh ./package-1.0.x86_64.rpm
# -i=install, -v=verbose, -h=прогресс-бар хешамиКак и dpkg, rpm -i не разрешает зависимости. Если .rpm требует libfoo, нужно сначала установить libfoo, или использовать dnf localinstall ./package.rpm — он вызывает rpm, но также разрешает зависимости из настроенных репозиториев.
Модули AppStream — концепция RHEL/CentOS Stream без прямого аналога в apt. Они позволяют устанавливать несколько версий одного ПО (например, nginx 1.20 stable и 1.24 mainline) без добавления стороннего репозитория. Это ответ RHEL на Ubuntu PPA.
# Список доступных потоков модулей для nginx
dnf module list nginx
# Name Stream Profiles Summary
# nginx mainline [d] common [d] A high performance web server
# nginx 1.22 common ...
# Включить конкретный поток (фиксирует версионный поток)
sudo dnf module enable nginx:mainline
# Установить из включённого потока
sudo dnf module install nginx
# Проверить, какой поток активен
dnf module list nginx | grep '\[e\]' # [e] = enabled, [d] = default, [i] = installed
# Переключить потоки (сначала нужен сброс)
sudo dnf module reset nginx
sudo dnf module enable nginx:1.22
sudo dnf module install nginxМодули AppStream хранятся в /etc/dnf/modules.d/. Когда поток включён, dnf при dnf upgrade автоматически не переключится на более новый поток — переключение потока явное, что предотвращает внезапные обновления мажорных версий.
Дерево семейства RHEL: RHEL → CentOS Stream → Fedora. Понимание того, на чём ты работаешь, влияет на то, как добавлять репозитории и какие пакеты доступны.
Fedora (cutting-edge, цикл выпуска 6 месяцев)
↓ функции переходят downstream после стабилизации
CentOS Stream (скользящий предварительный просмотр следующего минорного выпуска RHEL)
↓ отобранные, протестированные, hardened
RHEL (Red Hat Enterprise Linux — платная поддержка, жизненный цикл 10 лет)
↓ бинарно-совместимые пересборки
AlmaLinux / Rocky Linux / Oracle Linux (бесплатные пересборки RHEL)# Проверить дистрибутив и версию
cat /etc/os-release
# ID=rhel / fedora / centos
# VERSION_ID=9.3
# RHEL требует подписки для доступа к базовым репозиториям
subscription-manager register --username=user --password=pass
# На AlmaLinux/Rocky (пересборки RHEL, подписка не нужна)
dnf install epel-release # Extra Packages for Enterprise LinuxEPEL (Extra Packages for Enterprise Linux) — аналог компонента universe Ubuntu: пакеты, поддерживаемые сообществом, которых нет в официальных репозиториях RHEL. Если пакет не находится через dnf search, сначала добавь EPEL.
Настроить nginx из официального репозитория nginx на свежем сервере Rocky Linux 9.
Rocky Linux 9 — пересборка RHEL 9. Nginx по умолчанию из AppStream старее; официальный репозиторий nginx предоставляет последний стабильный выпуск.
# 1. Проверить, что доступно (версия AppStream)
dnf module list nginx
# nginx mainline common [d] ...
# 2. Добавить официальный репозиторий nginx
sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# 3. Явно импортировать GPG-ключ
sudo rpm --import https://nginx.org/keys/nginx_signing.key
# 4. Проверить приоритет — побеждает ли новый репозиторий?
dnf info nginx
# Секция Available Packages должна показывать версию с nginx.org
# 5. Установить (module_hotfixes=true позволяет репозиторию переопределить AppStream)
sudo dnf install nginx
# 6. Проверить установленную версию и владельцев файлов
rpm -q nginx # nginx-1.26.x-1.el9.ngx.x86_64
rpm -qf /usr/sbin/nginx # nginx-1.26.x-...
rpm -V nginx # нет вывода = все файлы в порядкеФлаг module_hotfixes=true специфичен для RHEL: без него модульная фильтрация DNF блокирует пакеты не из AppStream от переопределения пакетов AppStream, даже если репозиторий с более высоким приоритетом их предоставляет.
▸Почему это работает
Почему RHEL использует базу данных SQLite для RPM, а dpkg использует plain text? База данных RPM появилась раньше dpkg и была разработана для атомарных обновлений с использованием Berkeley DB (теперь SQLite). Plain text проще проверять и исправлять вручную при повреждении — повреждённый файл статуса dpkg можно исправить текстовым редактором в аварийной ситуации. Повреждённая база RPM требует rpm --rebuilddb, который регенерирует её из заголовков установленных пакетов. Оба подхода помогали восстанавливаться из повреждений в production в 3 часа ночи; восстановление dpkg немного прозрачнее, потому что статус-файл можно читать и редактировать напрямую.
▸Частая ошибка
На RHEL/CentOS Stream никогда не отключай gpgcheck в .repo-файле, чтобы «просто заставить работать». Это самая распространённая ошибка при отладке GPG-ошибок репозитория. Реальное исправление — импорт GPG-ключа: sudo rpm --import <gpg-key-url>. Отключение gpgcheck=0 молча открывает дверь для неподписанных пакетов из этого репозитория — любое скомпрометированное зеркало теперь может поставлять произвольные бинарные файлы, которые rpm установит без жалоб. Если импорт ключа не удаётся, проверь правильность URL и то, что файл ключа в ASCII-armored формате (начинается с -----BEGIN PGP PUBLIC KEY BLOCK-----).
На сервере RHEL 9 ты хочешь узнать, какой пакет установил бинарный файл /usr/bin/python3.11. Какая команда даст тебе ответ?
Стек пакетов RHEL/Fedora в точности зеркалит Debian: dnf — front-end (разрешение зависимостей, управление репозиториями), rpm — движок (локальная база, установка файлов). Конфигурация репозиториев в /etc/yum.repos.d/*.repo — всегда оставляй gpgcheck=1. Ключевые запросы rpm: -qa (список всех), -qf (пакет-владелец файла), -ql (файлы пакета), -V (проверка контрольных сумм). Модули AppStream предоставляют несколько версионных потоков без сторонних репозиториев. Семейство RHEL: Fedora (cutting-edge) → CentOS Stream (предварительный просмотр RHEL) → RHEL/AlmaLinux/Rocky. EPEL добавляет пакеты сообщества так же, как universe в Ubuntu. Двухуровневая модель универсальна — выучи один раз, применяй везде.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.