Вопрос или проблема
После установки пакета через yum (с несколькими настроенными репозиториями) как я могу узнать из какого репозитория он был установлен?
Если я выполню yum info package-name
(или yum list package-name
), я могу только увидеть, что пакет “установлен”.
С установленным yum-utils
, repoquery
(с опцией --info
) предоставит нужную информацию (здесь ‘epel’ — это репозиторий).
$ repoquery --info cherokee
Name : cherokee
Version : 0.99.49
Release : 1.el5
Architecture: i386
Size : 8495964
Packager : Fedora Project
Group : Applications/Internet
URL : http://www.cherokee-project.com/
Repository : epel
Summary : Flexible and Fast Webserver
Description :
Cherokee is a very fast, flexible and easy to configure Web Server. It supports
the widespread technologies nowadays: FastCGI, SCGI, PHP, CGI, TLS and SSL
encrypted connections, Virtual hosts, Authentication, on the fly encoding,
Apache compatible log files, and much more.
Какая версия yum?
В текущей версии, если установленный пакет совпадает по версии с самой последней доступной, то будет показан репозиторий, из которого он был установлен.
$ yum info irssi
Installed Packages
Name : irssi
Arch : i586
Version : 0.8.14
Release : 1.fc11
Size : 2.3 M
Repo : installed
From repo : updates
Summary : Modular text mode IRC client with Perl scripting
URL : http://irssi.org/
License : GPLv2+
Description: Irssi is a modular IRC client with Perl scripting. Only text-mode
: frontend is currently supported. The GTK/GNOME frontend is no
: longer being maintained.
$ yum --version
3.2.23
Если доступен более новый пакет, то он будет показан отдельно, с указанием репозитория, из которого доступна новая версия.
Хотя это приходит слишком поздно, но (по крайней мере, в Fedora 15) можно использовать yumdb для подобных запросов:
yumdb info 'python*'
А то, что мне на самом деле нужно было, чтобы перечислить пакеты из заданного репозитория(ов):
yumdb search from_repo 'my-*-repo'
Если все остальное не помогает, вы можете вручную проверить yumdb. Он находится в /var/lib/yum/yumdb
и содержит подробную информацию о каждом установленном пакете. Вас особенно заинтересует from_repo
. Например, для пакета bind-utils
:
# for i in /var/lib/yum/yumdb/b/*bind-utils*/*; do echo $i: `cat $i`; done
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/checksum_data: 39f7840f93d3d76825a9e8da79cfe0366f7fad68f018a273477aee62cccfa3f4
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/checksum_type: sha256
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/command_line: install bind-utils
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/from_repo: updates
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/from_repo_revision: 1397654451
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/from_repo_timestamp: 1397654759
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/installed_by: 0
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/reason: user
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/releasever: 6
Чтобы получить только информацию, которая вам нужна:
# cat /var/lib/yum/yumdb/b/*bind-utils*/from_repo
updates
В более поздних версиях будет предоставлено еще больше данных; например, в EL 7 здесь будет храниться точное зеркало и URL, с которого был загружен пакет.
Чтобы увидеть, что было установлено из репозитория epel: (Должно работать на Centos 5.5) имейте в виду, если у вас нет репозитория с именем epel, он выведет список всех установленных пакетов.
repoquery --repoid=epel -a | xargs yum list installed
rpm -qi packagename
Покажет вам поставщика и упаковщика
Самый простой и прямолинейный подход, не требующий установки дополнительных инструментов, grep или вывода посторонней информации, это:
yum list installed [package name]
Третий столбец предоставит идентификатор репозитория, из которого был установлен пакет.
Это было упомянуто в комментарии к исходному вопросу с использованием grep, но это не обязательно. Вы можете просто передать имя пакета напрямую в yum
для фильтрации.
Если пакет был установлен недавно, вы можете посмотреть в /var/cache/yum.
В этом каталоге есть каталог для каждого репозитория и в нем каталог packages. Поэтому, вы можете сделать что-то вроде:
find /var/cache/yum -name [package-name]*
Однако, кеш должен быть включен в файле /etc/yum.conf:
cachedir=/var/cache/yum
keepcache=1
Учтите, что yum clean [packages|all]
очистит кеш.
Если кеш пуст, есть альтернативный способ. Информация, которую читает yum info [package]
, берется из /var/cache/yum/[repo]/primary.xml.gz.
Вы можете просмотреть файл, введя:
gunzip -d -c /var/cache/yum/[repo]/primary.xml.gz | grep '<name>[package]'
Однако на машинах, где yum info [package]
не отображает “From repo :”, как указано ‘theotherreceive’, это происходит из-за того, что информация не находится в файле primary.xml, поэтому не будет никакого способа получить эту информацию. Следовательно, если пакет находится в двух или более файлах primary.xml, вам придется определить приоритет репозитория в вашей системе.
На основе ответа от Swoogan
В RedHat и CentOS можно сделать
sudo grep -ir PACKAGE_NAME /var/cache/yum/
Результаты будут выглядеть примерно так
Binary file /var/cache/yum/REPOSITORY_NAME/primary.xml.gz.sqlite matches
Где repository_name — это репозиторий, в котором находится ваш пакет, и он, вероятно, был установлен из первого в списке (см. yum repolist)
Я знаю, что это несколько старый вопрос — но он появляется в поиске в гугле по тому, что я искал.
Существует также метод для получения уникального списка используемых репозиториев:
# repoquery -ai | grep 'Repository : ' | sort | uniq
Это покажет репозитории, из которых были установлены пакеты.
Ни одна из вышеуказанных команд не сработала. Вот что мне пришлось сделать.
yum provides "*compat-libstdc*"
Хорошая ссылка здесь.
https://access.redhat.com/sites/default/files/attachments/rh_yum_cheatsheet_1214_jcs_print-1.pdf
Сохранена ли эта информация где-либо? Пакет не содержит этой информации, и yum не заинтересован после того, как найдет пакет. Вы, вероятно, можете восстановить ее, выяснив, какие репозитории имеют пакет, а затем определить, какой из них имеет приоритет.
Это не лучшее решение, но я обнаружил, что команда yum list available покажет вам, где доступна самая новая версия каждого пакета, например:
yum list available | grep gstreamer
PackageKit-gstreamer-plugin.x86_64 0.3.16-1.fc10 updates
bluez-gstreamer.i386 4.30-2.fc10 updates
gstreamer.i386 0.10.21-2.fc10 fedora
gstreamer-devel.i386 0.10.21-2.fc10 fedora
gstreamer-devel.x86_64 0.10.21-2.fc10 fedora
gstreamer-plugins-bad-devel.i386 0.10.9-1.fc10 rpmfusion-free
gstreamer-plugins-bad-devel.x86_64 0.10.9-1.fc10 rpmfusion-free
Таким образом, вы можете сделать yum list available на ваш пакет, затем сравнить вашу установленную версию с помощью yum list installed и получить представление о том, из какого репозитория он поступил, если версии совпадают.
Вы можете добавить флаг verbose к “yum info”:
yum info -v <package_name>
Репозиторий установки будет показан в выводе “From repo”.
Самый легкий способ:
rpm -qa --qf '%{NAME} %{VENDOR}\n'
Больше советов и трюков доступно здесь: http://wiki.centos.org/TipsAndTricks/YumAndRPM
Ответ или решение
Если вы устанавливаете пакет с использованием yum
из множества настроенных репозиториев, может возникнуть вопрос, из какого именно репозитория был установлен данный пакет. Важно уметь определять это, чтобы лучше управлять окружением и понимает, откуда поступают обновления.
Интерфейс командной строки для определения источника репозитория
-
Использование yum-utils и команды repoquery:
Установка пакетного утилитаyum-utils
позволяет воспользоваться командойrepoquery
для получения подробной информации о пакете. Эта команда позволяет точно выяснить, из какого репозитория был установлен пакет:repoquery --info <название-пакета>
В выводе команды вы сможете увидеть строку
Repository
, которая укажет на конкретный репозиторий, из которого был установлен пакет. -
Команда yum info с версией yum 3.2.23 и новее:
В более новых версияхyum
, когда вы выполняете командуyum info <название-пакета>
, вывод может включать строкуFrom repo
, где указан репозиторий, из которого был загружен данный пакет. При этом условие — версия установленного пакета должна совпадать с последней доступной версией в репозитории.yum info <название-пакета>
-
Поиск в базе данных yumdb:
Для углубленного анализа, вы можете вручную исследовать базу данныхyum
, расположенную в/var/lib/yum/yumdb
. Часто информация о репозитории может быть найдена в полеfrom_repo
:cat /var/lib/yum/yumdb/<аббревиатура-пакета>/<название-пакета>/from_repo
Альтернативные подходы
-
Кэширование данных:
Вы можете определить репозиторий напрямую из кэша, если он включен. Ваша конфигурация должна в этот момент содержатьkeepcache=1
. Поиск в кэше производится с помощью команды:find /var/cache/yum -name "<название-пакета>*"
-
Использование grep для определения:
Простой поиск в содержимом/var/cache/yum/
может также сказать, в каком файле упоминается пакет:sudo grep -ir <название-пакета> /var/cache/yum/
Заключение
Для профессионалов, работающих с системами Linux, понимание источников установленных пакетов важно для управления версиями и безопасности систем. Очень важно точно знать, какие репозитории используются для критически важных обновлений. Надеюсь, данные методы помогут вам эффективно управлять вашей инфраструктурой и держать всё под контролем. Не забывайте следить за обновлениями ваших инструментов и репозиториев для поддержания стабильности и безопасности.