После запуска dnf update что-то перестало работать. Вместо того чтобы часами разбираться, хочется просто вернуться к той версии пакета, которая работала раньше.
Такие ситуации происходят чаще, чем готовы признать многие администраторы Linux. Возможно, новый выпуск Nginx изменил конфигурацию по умолчанию и сломал виртуальные хосты. Обновление библиотеки Python могло поменять API, от которого зависят внутренние скрипты. Или обновлённое ядро больше не работает со сторонним драйвером.
С точки зрения DNF всё установилось успешно, но это не всегда означает, что приложения продолжат работать корректно.
Откатить пакет в дистрибутивах на основе RHEL несложно, если он независим, но задача усложняется, когда от новой версии зависят другие пакеты. Тогда DNF может потребоваться понизить и связанные зависимости, чтобы сохранить целостность системы.
В этом руководстве рассказывается, как проверить доступные версии пакетов, безопасно откатить пакет, запретить его дальнейшее обновление, восстановить старую версию из локального кэша RPM и даже выполнить откат всей транзакции DNF, если обновление вызвало проблемы.
Как DNF обрабатывает откат
Прежде чем приступить к откату пакетов, полезно разобраться, что именно DNF делает за кулисами.
Каждая операция установки, обновления, удаления или отката фиксируется DNF как транзакция в базе истории. Эта история позволяет просмотреть предыдущие изменения и во многих случаях полностью откатить транзакцию вместо ручного восстановления отдельных пакетов.
При откате DNF не просто заменяет новый пакет старым. Сначала проверяется совместимость более старой версии с остальными установленными пакетами.
Если другой пакет зависит от новой версии, DNF обнаружит конфликт и в зависимости от ситуации может:
- понизить и требуемые зависимости;
- отказаться от отката, так как это нарушит работу других установленных пакетов;
- запросить подтверждение перед дополнительными изменениями.
Поэтому перед откатом стоит ответить на два вопроса:
- Совместима ли нужная версия с уже установленными пакетами?
- Доступна ли старая версия в подключённых репозиториях или в локальном кэше пакетов?
Проверка этих моментов за минуту избавит от новых проблем с зависимостями.
Проверка доступных версий
Прежде чем откатывать пакет, нужно узнать, какая версия установлена сейчас и доступна ли более старая версия в подключённых репозиториях.
Чтобы посмотреть все доступные версии пакета, выполните:
dnf list --showduplicates nginx
Пример вывода:
Installed Packages
nginx.x86_64 1:1.26.2-2.el10 @appstream
Available Packages
nginx.x86_64 1:1.24.0-4.el10 appstream
nginx.x86_64 1:1.26.2-2.el10 appstream
Раздел Installed Packages показывает версию, установленную в системе.
Раздел Available Packages перечисляет все версии, которые предоставляют подключенные репозитории. Если нужная версия присутствует, можно выполнить откат.
Если нет, репозиторий больше не содержит этот пакет. Далее в руководстве будет показано, как восстановить старые пакеты из локального кэша RPM.
Для получения подробной информации об установленном пакете, включая исходный репозиторий, используйте:
dnf info nginx
Пример вывода:
Installed Packages
Name : nginx
Epoch : 1
Version : 1.26.2
Release : 2.el10
Architecture : x86_64
Size : 1.7 M
Source : nginx-1.26.2-2.el10.src.rpm
Repository : @System
From repo : appstream
Summary : A high performance web server and reverse proxy server
License : BSD
Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP,
: POP3 and IMAP protocols, with a strong focus on high concurrency,
: efficiency and low memory footprint.
Обратите внимание на поля Version, Release и Epoch. Вместе они однозначно идентифицируют версию пакета. Если потребуется откат до конкретного выпуска, эта информация пригодится в команде отката.
Откат до предыдущей версии
Чтобы просто вернуться к предыдущей версии пакета, выполните команду dnf downgrade:
sudo dnf downgrade nginx
Пример вывода:
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Downgrading:
nginx x86_64 1:1.24.0-4.el10 appstream 42 k
Transaction Summary
================================================================================
Downgrade 1 Package
Total download size: 42 k
Is this ok [y/N]: y
Команда sudo запускает DNF с правами администратора, необходимыми для установки, удаления или отката системных пакетов.
dnf downgrade автоматически выбирает самую старшую из доступных версий, которая старше текущей. Изучите сводку транзакции и, если всё верно, нажмите y для продолжения.
После завершения отката убедитесь, что установлена ожидаемая версия:
nginx -v
Пример вывода:
nginx version: nginx/1.24.0
Если вывод соответствует ожидаемой версии, откат выполнен успешно.
Важно: Перед подтверждением транзакции внимательно изучите список пакетов, которые DNF планирует понизить или удалить. Понижение версий связанных пакетов, например nginx-core или nginx-filesystem, вместе с nginx — нормальная практика. Однако если DNF собирается удалить пакеты, от которых зависят другие приложения или службы, отмените операцию и разберитесь с изменениями зависимостей.
Откат до конкретной версии
Если требуется откат на несколько выпусков назад, укажите имя пакета и целевую версию:
sudo dnf downgrade nginx-1.24.0-4.el10
Пример вывода:
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Downgrading:
nginx x86_64 1:1.24.0-4.el10 appstream 42 k
Transaction Summary
================================================================================
Downgrade 1 Package
Total download size: 42 k
Is this ok [y/N]: y
Downloading Packages:
nginx-1.24.0-4.el10.x86_64.rpm 42 kB/s | 42 kB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Downgrading : nginx-1:1.24.0-4.el10.x86_64 1/2
Cleanup : nginx-1:1.26.2-2.el10.x86_64 2/2
Verifying : nginx-1:1.24.0-4.el10.x86_64 1/2
Verifying : nginx-1:1.26.2-2.el10.x86_64 2/2
Downgraded:
nginx-1:1.24.0-4.el10.x86_64
Complete!
Вывод транзакции легко читается:
- Downgrading: DNF устанавливает старую версию пакета.
- Cleanup: удаление новой версии из системы.
- Verifying: подтверждение успешного отката и целостности базы RPM.
После завершения транзакции проверьте установленную версию:
nginx -v
Если вывод показывает запрошенную версию, откат выполнен успешно.
Блокировка версии пакета с помощью versionlock
После отката пакета следующая команда dnf update попытается снова установить самую свежую версию. Чтобы зафиксировать текущую версию, воспользуйтесь плагином versionlock.
sudo dnf install python3-dnf-plugins-core
Когда плагин установлен, заблокируйте текущую версию пакета:
sudo dnf versionlock add nginx
Для просмотра всех заблокированных пакетов выполните:
sudo dnf versionlock list
Пример вывода:
Last metadata expiration check: 0:02:31 ago on Mon Jun 29 11:14:08 2026.
nginx-1:1.24.0-4.el10.*
.* в конце — это шаблон, соответствующий всем архитектурам этой версии пакета. После блокировки будущие команды dnf update будут пропускать nginx, оставляя его на зафиксированной версии.
Когда вы снова захотите получать обновления, снимите блокировку:
sudo dnf versionlock delete nginx
Совет: Ещё один способ запретить обновления — добавить exclude=nginx в /etc/dnf/dnf.conf. Однако такая настройка будет блокировать все будущие обновления пакета, пока её не удалят.
Откат из локального RPM-файла
Иногда нужная версия больше не доступна в подключённых репозиториях. Её могли заменить более новым выпуском, удалить из репозитория, либо вы работаете на системе без доступа в интернет.
Если старый RPM-файл всё ещё есть, его можно установить напрямую.
Сначала проверьте, остался ли пакет в локальном кэше DNF:
find /var/cache/dnf -name "nginx*.rpm"
Пример вывода:
/var/cache/dnf/appstream-3f8c21a9d4b72e01/packages/nginx-1.24.0-4.el10.x86_64.rpm
Если нужная версия найдена, установите её, указав полный путь к RPM-файлу:
sudo dnf install /var/cache/dnf/appstream-3f8c21a9d4b72e01/packages/nginx-1.24.0-4.el10.x86_64.rpm
Пример вывода:
Examining /var/cache/dnf/appstream-3f8c21a9d4b72e01/packages/nginx-1.24.0-4.el10.x86_64.rpm: 1:nginx-1.24.0-4.el10.x86_64
Marking nginx-1.24.0-4.el10.x86_64.rpm as an update to 1:nginx-1.26.2-2.el10.x86_64
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Downgrading:
nginx x86_64 1:1.24.0-4.el10 @commandline 42 k
Transaction Summary
================================================================================
Downgrade 1 Package
Is this ok [y/N]: y
...
Complete!
Даже при ручной установке RPM-файла DNF распознаёт, что пакет старше установленной версии, и выполняет откат вместо обычной установки. Также проверяются зависимости, как при установке из репозитория.
Если RPM-файл получен из другой системы или внешнего источника, проверьте его подпись перед установкой:
rpm --checksig nginx-1.24.0-4.el10.x86_64.rpm
Откат всей транзакции с помощью истории DNF
Если обновление системы затронуло несколько пакетов, нет необходимости откатывать их по одному. DNF хранит историю всех транзакций, что позволяет отменить целое обновление одной командой.
Для начала просмотрите недавние транзакции DNF:
sudo dnf history list
Пример вывода:
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
12 | update nginx | 2026-06-29 09:14 | Update | 1
11 | install httpd | 2026-06-28 14:22 | Install | 3
10 | update | 2026-06-27 08:00 | Update | 47
9 | install python3-flask | 2026-06-26 16:44 | Install | 5
Каждая транзакция имеет уникальный идентификатор. Он понадобится для просмотра или отмены конкретной операции.
Чтобы увидеть, что именно изменилось в транзакции, выполните:
sudo dnf history info 12
Пример вывода:
Transaction ID : 12
Begin time : Sun Jun 29 09:14:22 2026
Begin rpmdb : 847:f3a2c...
End time : Sun Jun 29 09:14:38 2026 (16 seconds)
End rpmdb : 847:9b14d...
User : root
Return-Code : Success
Command Line : update nginx
Transaction performed with:
Installed rpm-4.19.1-1.el10.x86_64
Installed dnf-4.18.0-1.el10.noarch
Packages Altered:
Upgrade nginx-1:1.26.2-2.el10.x86_64 @appstream
nginx-1:1.24.0-4.el10.x86_64 @System
Вывод показывает, что транзакция 12 обновила nginx с версии 1.24.0 до 1.26.2.
Для отмены этой транзакции выполните:
sudo dnf history undo 12
После подтверждения DNF восстановит версии пакетов, которые были до транзакции 12.
Если нужно просто отменить последнюю транзакцию, искать её ID не обязательно:
sudo dnf history undo last
Решение проблем с зависимостями после отката
Если после отката dnf отказывается что-либо устанавливать или обновлять из-за нарушенных зависимостей, сначала выполните проверку целостности:
sudo dnf check
Пример вывода:
nginx-1:1.24.0-4.el10.x86_64 requires nginx-filesystem = 1:1.24.0-4.el10
nginx-filesystem-1:1.26.2-2.el10.x86_64 is a newer version
Вывод точно показывает, что сломано и почему. В этом примере nginx был откачен, а nginx-filesystem — нет, поэтому требование к версии не выполнено.
Исправьте это, понизив версию зависимости:
sudo dnf downgrade nginx-filesystem
Снова выполните dnf check, чтобы убедиться, что проблем больше не осталось:
sudo dnf check
Отсутствие вывода означает, что база RPM целостна и все зависимости удовлетворены.






Пока нет комментариев. Будьте первым!