open atlas
↑ К треку
Linux: операционная система LIN · 04 · 04

dnf и сторона RHEL

RHEL/Fedora использует ту же двухуровневую модель: dnf — front-end, rpm — движок. Конфигурация репозиториев в /etc/yum.repos.d/. У каждой команды apt есть аналог в dnf — выучив соответствие, ты станешь эффективен на обоих семействах дистрибутивов.

LIN Middle ◷ 20 min
Уровень
ОсновыJuniorMiddleSenior

Три года на 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.

1

Двухуровневая модель идентична для обоих семейств дистрибутивов. На Debian/Ubuntu: apt (front-end) → dpkg (движок). На RHEL/Fedora: dnf (front-end) → rpm (движок). То же разделение ответственности: dnf разрешает зависимости и управляет репозиториями, rpm управляет локальной базой и установкой файлов.

apt (Debian/Ubuntu)dnf (RHEL/Fedora)что делает
apt updatednf check-updateобновить индекс пакетов
apt upgradednf upgradeустановить доступные обновления
apt install nginxdnf install nginxустановить пакет
apt remove nginxdnf remove nginxудалить пакет
apt autoremovednf autoremoveудалить неиспользуемые зависимости
apt search nginxdnf search nginxпоиск в индексе
apt show nginxdnf 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 не нужно.

2

Конфигурация репозиториев находится в файлах /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, $basearchx86_64 или aarch64 в зависимости от системы. Это позволяет одному .repo-файлу работать на разных мажорных версиях.

3

rpm — низкоуровневый движок, аналог dpkg. Все метаданные установленных пакетов хранятся в /var/lib/rpm/ (база данных SQLite, в отличие от plain-text формата dpkg). Флаги запросов зеркалят флаги dpkg:

команда dpkgаналог rpmназначение
dpkg -lrpm -qaсписок всех установленных пакетов
dpkg -L nginxrpm -ql nginxфайлы пакета
dpkg -S /usr/sbin/nginxrpm -qf /usr/sbin/nginxпакет-владелец файла
dpkg -V nginxrpm -V nginxпроверка контрольных сумм
dpkg -i ./pkg.rpmrpm -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, но также разрешает зависимости из настроенных репозиториев.

4

Модули 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 автоматически не переключится на более новый поток — переключение потока явное, что предотвращает внезапные обновления мажорных версий.

5

Дерево семейства 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 Linux

EPEL (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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.