Репозитории и пакетные менеджеры
Как dnf работает с репозиториями, разрешение зависимостей, кеширование.
На этой странице
Пакеты не существуют в вакууме — они живут в репозиториях, а доступ к ним обеспечивают пакетные менеджеры.
Что такое репозиторий
Репозиторий — это структурированное хранилище пакетов с метаданными. Он состоит из:
repository/
├── repodata/ # Метаданные репозитория
│ ├── repomd.xml # Главный индекс
│ ├── primary.xml.gz # Информация о пакетах
│ ├── filelists.xml.gz # Списки файлов
│ ├── other.xml.gz # Changelog и прочее
│ └── *-comps.xml.gz # Группы пакетов (опционально)
├── Packages/ # Сами RPM-файлы
│ ├── a/
│ │ ├── apache-2.4.57-1.x86_64.rpm
│ │ └── ...
│ ├── b/
│ └── ...
└── drpms/ # Дельта-пакеты (опционально)
Создание метаданных
Метаданные создаются утилитой createrepo_c:
# Создать репозиторий из каталога с RPM
createrepo_c /path/to/packages/
# Обновить после добавления новых пакетов
createrepo_c --update /path/to/packages/
Репозитории в ROSA Linux
ROSA использует несколько типов репозиториев:
| Репозиторий | Назначение |
|---|---|
| main/release | Основные пакеты дистрибутива |
| main/updates | Обновления безопасности и исправления |
| contrib/release | Дополнительные пакеты от сообщества |
| non-free | Проприетарные компоненты |
| restricted | Пакеты с ограниченным распространением |
Конфигурация репозиториев находится в /etc/yum.repos.d/:
ls /etc/yum.repos.d/
# rosa-main.repo
# rosa-contrib.repo
# ...
Пример файла репозитория (путь и зеркало могут отличаться — ориентируйтесь на вашу платформу ROSA):
[rosa-main-release]
name=ROSA Main Release
baseurl=http://mirror.rosa.ru/rosa/rosa13.1/repository/$basearch/main/release/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ROSA
# путь к ключу уточняйте в /etc/pki/rpm-gpg/
Пакетный менеджер dnf
dnf (Dandified YUM) — основной пакетный менеджер в ROSA:
Основные команды
# Поиск пакета
dnf search firefox
# Информация о пакете
dnf info firefox
# Установка
sudo dnf install firefox
# Удаление
sudo dnf remove firefox
# Обновление всех пакетов
sudo dnf upgrade
# Обновление конкретного пакета
sudo dnf upgrade firefox
# Список установленных
dnf list installed
# Список доступных обновлений
dnf check-update
Работа с репозиториями
# Список репозиториев
dnf repolist
dnf repolist all # включая отключённые
# Включить репозиторий
sudo dnf config-manager --set-enabled repo-name
# Отключить
sudo dnf config-manager --set-disabled repo-name
# Временно использовать репозиторий
sudo dnf --enablerepo=testing install package
Работа с группами
# Список групп
dnf group list
# Информация о группе
dnf group info "Development Tools"
# Установка группы
sudo dnf group install "Development Tools"
Разрешение зависимостей
Когда вы устанавливаете пакет, dnf:
- Читает метаданные всех включённых репозиториев
- Строит граф зависимостей — какие пакеты требуются
- Разрешает конфликты — выбирает совместимые версии
- Вычисляет транзакцию — что установить, обновить, удалить
- Скачивает пакеты (или берёт из кеша)
- Выполняет транзакцию
# Посмотреть, что будет установлено (без установки)
dnf install --assumeno firefox
# Подробный вывод
dnf install -v firefox
Типы зависимостей
# Что требуется пакету для работы
dnf repoquery --requires firefox
# Что требуется для сборки (из SRPM)
dnf repoquery --requires --srpm firefox
# Какие пакеты зависят от данного
dnf repoquery --whatrequires openssl-libs
# Какой пакет предоставляет файл
dnf provides /usr/bin/python3
Конфликты и obsoletes
Иногда пакеты несовместимы:
# В SPEC-файле
Conflicts: old-package < 2.0
Obsoletes: renamed-package < 1.0
Provides: renamed-package = %{version}
- Conflicts — нельзя установить вместе
- Obsoletes — заменяет устаревший пакет (dnf автоматически удалит старый)
Кеширование
dnf кеширует метаданные и пакеты:
# Где хранится кеш
ls /var/cache/dnf/
# Очистить кеш метаданных
sudo dnf clean metadata
# Очистить кеш пакетов
sudo dnf clean packages
# Очистить всё
sudo dnf clean all
# Принудительно обновить метаданные
sudo dnf makecache
Настройка в /etc/dnf/dnf.conf:
[main]
keepcache=0 # Не хранить скачанные RPM после установки
metadata_expire=48h # Время жизни кеша метаданных
Приоритеты репозиториев
Если один пакет есть в нескольких репозиториях, dnf выбирает по:
- Приоритету репозитория (меньше = выше)
- Версии пакета (новее = лучше)
[myrepo]
name=My Repository
baseurl=http://example.com/repo/
priority=10 # Выше приоритет, чем у стандартных (99)
Модульность (dnf modules)
Современный dnf поддерживает модули — способ иметь несколько версий одного ПО:
# Список модулей
dnf module list
# Информация о модуле
dnf module info nodejs
# Включить определённый поток (версию)
sudo dnf module enable nodejs:18
# Установить модуль
sudo dnf module install nodejs:18
История и откат
dnf ведёт историю транзакций:
# Посмотреть историю
dnf history
dnf history info 15 # детали транзакции #15
# Откатить последнюю транзакцию
sudo dnf history undo last
# Откатить конкретную
sudo dnf history undo 15
Практика: исследуем репозитории
# Список всех репозиториев
dnf repolist -v
# Сколько пакетов в каждом
dnf repolist
# Найти пакет и узнать, из какого он репозитория
dnf info firefox | grep Repository
# Посмотреть доступные версии пакета
dnf --showduplicates list firefox
# Посмотреть changelog пакета из репозитория
dnf changelog firefox | head -50
Типичные проблемы
«Ничего не найдено»
# Обновить кеш
sudo dnf clean all
sudo dnf makecache
«Конфликт зависимостей»
# Посмотреть, что конфликтует
dnf repoquery --conflicts problem-package
# Попробовать с --allowerasing (удалит конфликтующие)
sudo dnf install package --allowerasing
«Пакет исключён»
Проверьте /etc/dnf/dnf.conf на наличие exclude=...
Проверьте понимание
- Что содержит каталог
repodata/в репозитории? - Как dnf узнаёт, какие пакеты доступны?
- Как посмотреть, какой пакет предоставляет файл
/usr/lib64/libssl.so.3? - Что произойдёт, если пакет A имеет
Obsoletes: B? - Как откатить последнюю установку?