- Вопрос или проблема
- Решение #1: rpm --test -e
- Решение #2: dnf repoquery --whatrequires <имя_пакета>
- Решение #3: repoquery --installed --whatrequires
- Решение #3: rpmdep --depending
- Ответ или решение
- Пакеты, зависимые от заданного пакета: Практическое руководство
- Введение
- Основной метод: Использование rpm -q --whatrequires
- Альтернативные решения
- Заключение
Вопрос или проблема
Я хочу получить список пакетов, которые зависят от запрашиваемого пакета. Например, я хочу получить все пакеты, которые зависят от telnet
. Я пришел к этому скрипту:
for i in `rpm -qa | sort`;
do rpm -qR $i | grep telnet > /dev/null;
if [ $? -eq 0 ]; then
echo $i;
fi;
done
Есть ли более хороший способ сделать это?
Спасибо.
Команда, которая вам нужна:
rpm -q --whatrequires <имя_пакета>
Таким образом:
rpm -q --whatrequires telnet
Из страницы руководства
--whatrequires CAPABILITY Запрос всех пакетов, которые требуют CAPABILITY для корректной работы.
К сожалению, rpm -q --whatrequires
иногда бывает недостаточно:
$ rpm -q --whatrequires perl-libwww-perl
нет пакетов, которые требуют perl-libwww-perl
$ rpm -e perl-libwww-perl
ошибка: Неудовлетворенные зависимости:
perl(LWP) требуется для (установленного) perl-XML-Parser-2.36-7.el6.x86_64
Это потому, что --whatrequires
принимает в качестве аргумента имя возможности, а не имя пакета. Если (как часто бывает) RPM-пакет предоставляет только одну одноимённую возможность, указание имени этого пакета в качестве аргумента --whatrequires
работает нормально; но если нет (как в приведенном выше примере perl-libwww-perl
), нам нужно другое решение.
Решение #1: rpm --test -e
Передайте опцию --test
(“пробный запуск”) с -e
; если команда выполнится успешно (без фактических изменений в вашей системе!), то зависимостей нет:
$ rpm --test -e emacs-common && echo 'Нет зависимостей!'
Нет зависимостей!
; если она не выполнится, вы получите вывод ошибки, который мы уже видели выше:
$ rpm --test -e perl-libwww-perl && echo 'Нет зависимостей!'
ошибка: Неудовлетворенные зависимости:
perl(LWP) требуется для (установленного) perl-XML-Parser-2.36-7.el6.x86_64
Решение #2: dnf repoquery --whatrequires <имя_пакета>
Для систем, использующих DNF (CentOS Stream RHEL 8 и его производные и др.):
dnf repoquery --whatrequires perl-libwww-perl
Не root, репозитории управления подписками не обновлены
BaseOS x86_64 os 53 kB/s | 2.3 kB 00:00
AppStream x86_64 os 60 kB/s | 2.6 kB 00:00
arp-scan-0:1.10.0-1.el9.x86_64
awstats-0:7.8-9.el9.noarch
cpanspec-0:1.78-44.el9.noarch
ctstream-0:33-1.el9.noarch
debmirror-0:2.42-1.el9.noarch
(...)
Недостатки:
- Не удаляет дубликаты вывода (легко исправить, добавив
| sort -u
) - Не фильтрует имя входящего пакета (тоже легко обойти)
Решение #3: repoquery --installed --whatrequires
Команда repoquery(1)
, которая является частью RPM yum-utils
, знает достаточно, чтобы разрешать имена пакетов в имена возможностей и наоборот:
$ repoquery --installed --whatrequires perl-libwww-perl
perl-libwww-perl-0:5.833-5.el6.noarch
perl-XML-Parser-0:2.36-7.el6.x86_64
perl-libwww-perl-0:5.833-5.el6.noarch
Недостатки:
- То же, что и у
dnf --whatprovides
выше yum-utils
может не быть установлен на вашей системеyum
(который требуетyum-utils
) может не быть установлен на вашей системе
Итак, хотя Решение #1 и является временным, в целом оно кажется более надежным и более простым в использовании.
Решение #3: rpmdep --depending
Вместо того чтобы показывать зависимости пакетов (rpm -qR), показать пакеты, которые зависят от данного аргумента: rpmdep, таким образом, работает как улучшенная команда rpm -q --whatrequires
. [взято из страницы man rpmdep]
Я также хотел бы отметить, что решение #2 требует установки большого количества пакетов. На openSUSE Leap 15.4 zypper определил зависимости для 23 пакетов (всего 3.7 МБ), которые необходимо было установить, только чтобы активировать команду repoquery.
rpmdep является одной из утилит в пакете rpmorphan. Он похож на rpm -q --provides
/ --requires
, основное различие заключается в том, что он работает с пакетами, а не с возможностями. Что именно и спрашивал автор вопроса.
Примеры:
$ rpmdep --depending firewalld
нет зависимостей : firewalld является сиротой
$ rpmdep --depending iptables
iptables требуется для firewalld
Ответ или решение
Пакеты, зависимые от заданного пакета: Практическое руководство
Введение
Работа с пакетами в системах, использующих RPM (Red Hat Package Manager), часто требует понимания зависимостей между ними. В этой статье мы рассмотрим, как определить, какие RPM-пакеты зависят от заданного пакета, такого как telnet
. Мы также проанализируем различные подходы к решению этой задачи, предоставляя более эффективные методы подачи запросов.
Основной метод: Использование rpm -q --whatrequires
Наиболее прямой и эффективный способ получить список пакетов, зависящих от определённого пакета, — это использовать команду:
rpm -q --whatrequires <название_пакета>
Например, для telnet
команда будет выглядеть так:
rpm -q --whatrequires telnet
Этот метод позволяет запросить все пакеты, которые требуют указанный пакет для своей нормальной работы.
Ограничение метода
Однако стоит отметить, что --whatrequires
затрагивает только соответствующие имена возможностей (capabilities), а не имена самих пакетов. Это может привести к ситуации, когда запрашиваемый пакет не будет иметь явных зависимостей, хотя другие установленные пакеты могут к нему обращаться.
Альтернативные решения
1. Проверка с помощью rpm --test -e
Для проверки зависимостей с необходимостью идентификации возможных зависимостей вы можете использовать опцию --test
. Эта команда производит тестовый вывод, не внося изменений в систему:
rpm --test -e <название_пакета> && echo 'Нет зависимостей!'
Если команда завершится с ошибкой, будет выдан список зависимостей, которые требует пакет.
2. dnf repoquery --whatrequires
Если вы используете системы на базе DNF (например, CentOS Stream или RHEL 8 и выше), вы можете применить следующую команду:
dnf repoquery --whatrequires <имя_пакета>
Этот способ более гибок и способен находить зависимости в репозиториях, которые могут не быть установлены локально. Обратите внимание, что вывод не фильтрует имена входных пакетов, но это можно исправить, добавив вывод как | sort -u
.
3. Использование repoquery
Команда repoquery
, входящая в пакет yum-utils
, позволяет более точно работать с зависимостями, позволяя не только искать требуемые зависимости, но и показывать уже установленные:
repoquery --installed --whatrequires <название_пакета>
Эта команда разрешит имена пакетов к именам возможностей, что значительно улучшает точность нахождения зависимостей. Однако наличие yum-utils
может не гарантироваться на вашей системе.
4. Использование rpmdep
Существует утилита rpmdep
, которая может отображать пакеты, зависящие от указанного аргумента. Утилита является частью пакета rpmorphan
и отлично справляется с задачей определения зависимостей, обращаясь к именам пакетов, а не возможностей:
rpmdep --depending <название_пакета>
Это улучшенное решение, так как позволяет напрямую видеть, какие пакеты зависят от указанного.
Заключение
Хотя rpm -q --whatrequires
предоставляет базовый функционал для запроса зависимостей, существует множество других методов, которые могут улучшить надежность и точность этой работы. Используйте подходящий метод в зависимости от ваших нужд и текущей конфигурации системы. Всегда полезно иметь несколько инструментов под рукой для работы с зависимостями в RPM.