- Вопрос или проблема
- RHEL/CentOS 8 и 9:
- RHEL/CentOS 6 и 7
- RHEL/CentOS 4 и 5
- Пример вывода:
- Ответ или решение
- Как просмотреть переменные $releasever, $basearch и $YUM0 в Yum
- Введение
- Переменные Yum
- Просмотр переменных в Yum
- Для RHEL/CentOS 8 и 9
- Для RHEL/CentOS 6 и 7
- Для RHEL/CentOS 4 и 5
- Альтернативные методы получения переменных
- Дополнительные инструменты
- Заключение
Вопрос или проблема
Я настраиваю репозиторий yum и мне нужно отладить некоторые URL в файле yum.conf. Мне нужно узнать, почему Scientific Linux пытается получить этот URL, когда я ожидал, что он получит другой URL:
# yum install package
http://192.168.1.100/pub/scientific/6.1/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "Запрашиваемый URL вернул ошибку: 404"
Попытка другого зеркала.
Ошибка: Невозможно получить метаданные репозитория (repomd.xml) для репозитория: sl. Пожалуйста, проверьте его путь и попробуйте еще раз
Страница man yum.conf(5) содержит некоторую информацию о этих переменных:
Переменные
Существует несколько переменных, которые вы можете использовать для облегчения обслуживания
конфигурационных файлов yum. Они доступны в значениях нескольких
параметров, включая name, baseurl и команды.$releasever Это будет заменено значением версии
пакета, указанного в distroverpkg. По умолчанию это версия
пакета ‘redhat-release’.$arch Это будет заменено вашей
архитектурой, как указано в os.uname()[4] в Python.$basearch Это будет заменено вашей базовой архитектурой в yum.
Например, если ваша $arch – i686, то ваша $basearch будет i386.$YUM0-$YUM9 Это будут заменены значением переменной окружения оболочки
с тем же именем. Если переменная окружения оболочки
не существует, то переменная конфигурационного файла не будет
заменена.
Есть ли способ просмотреть эти переменные с помощью командной утилиты yum
? Я предпочел бы не искать версию пакета ‘redhat-release’ или вручную получать значение os.uname()[4] в Python.
Когда этот ответ был написан в 2011 году, json
не был установлен для python по умолчанию для всех версий RHEL/CentOS в то время, поэтому я использовал pprint, чтобы красиво распечатать содержимое.
Сейчас 2024 год, и все современные версии RHEL/CentOS имеют модуль json
по умолчанию для python. Ответ был обновлен для использования json
и обновлен, чтобы включить RHEL/CentOS 8 и 9, изменив @sysadmiral’s answer для Fedora.
RHEL/CentOS 8 и 9:
/usr/libexec/platform-python -c '
import dnf, json
db = dnf.dnf.Base()
db.conf.substitutions.update_from_etc("/")
print(json.dumps(db.conf.substitutions, indent=2))'
RHEL/CentOS 6 и 7
python -c 'import yum, json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'
RHEL/CentOS 4 и 5
# если вы установите python-simplejson
python -c 'import yum, simplejson as json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'
# в противном случае
python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Пример вывода:
# CentOS 8:
# ---
[root@0928d3917e32 /]# /usr/libexec/platform-python -c '
import dnf, json
db = dnf.dnf.Base()
db.conf.substitutions.update_from_etc("/")
print(json.dumps(db.conf.substitutions, indent=2))'
Не удалось установить локаль, умолчание установлено на C
{
"arch": "x86_64",
"basearch": "x86_64",
"releasever": "8"
}
[root@0928d3917e32 /]#
# CentOS 7:
# ---
[root@c41adb7f40c2 /]# python -c 'import yum, json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'
Загруженные плагины: fastestmirror, ovl
{
"uuid": "cb5f5f60-d45c-4270-8c36-a4e64d2dece4",
"contentdir": "centos",
"basearch": "x86_64",
"infra": "container",
"releasever": "7",
"arch": "ia32e"
}
[root@c41adb7f40c2 /]#
# CentOS 6:
# ---
[root@bfd11c9a0880 /]# python -c 'import yum, json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'
Загруженные плагины: fastestmirror, ovl
{
"releasever": "6",
"basearch": "x86_64",
"arch": "ia32e",
"uuid": "3e0273f1-f5b6-481b-987c-b5f21dde4310",
"infra": "container"
}
[root@bfd11c9a0880 /]#
Оригинальный ответ ниже:
Если вы установите yum-utils
, это даст вам yum-debug-dump
, который запишет эти переменные и больше отладочной информации в файл. Нет опции для записи в stdout, он всегда будет записывать в какой-то файл, что на самом деле не слишком полезно.
Это явно не лучшее решение, поэтому вот однострочный скрипт на python, который вы можете скопировать и вставить, который распечатает эти переменные в stdout.
python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Это работает в CentOS 5 и 6, но не в 4. yum написан на python, так что модуль yum python уже на вашем сервере, нет необходимости устанавливать что-либо еще.
Вот как это выглядит в CentOS 5:
[root@somebox]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
{'arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '5',
'yum0': '200',
'yum5': 'foo'}
[root@somebox]#
На всякий случай, если кто-то окажется здесь, как и я, и будет искать эквивалентный ответ для dnf на Fedora, я придумал следующий однострочник на python:
python3 -c 'import dnf, pprint; db = dnf.dnf.Base(); pprint.pprint(db.conf.substitutions,width=1)'
На Fedora 24 это выглядит так:
{'arch': 'x86_64',
'basearch': 'x86_64',
'releasever': '24'}
Чтобы получить все из них, вам нужно использовать код, как mmckinst опубликовал, но если вы просто хотите проверить $releasever
, вы можете выполнить yum version nogroups
на RHEL-6.
Другой вариант для RHEL-6 – просто создать свой собственный в /etc/yum/vars
.
Для полного дампа вы можете использовать:
yum config-manager --dump
dnf config-manager --dump
Чтобы выгрузить переменные, вы можете использовать:
yum config-manager --dump-variables
dnf config-manager --dump-variables
yum-config-manager
также доступен, но обычно перенаправляет на плагин dnf config-manager.
С https://linux.die.net/man/5/yum.conf:
$releasever
Это будет заменено значением версии
пакета, указанного в distroverpkg. По умолчанию это версия
пакета ‘redhat-release’. $arch Это будет заменено вашей
архитектурой, как указано в os.uname()[4] в Python.
$basearch
Это будет заменено вашей базовой архитектурой в yum.
Например, если ваша $arch – i686, то ваша $basearch будет i386.
$uuid
Это будет заменено уникальным, но постоянным uuid для
этого компьютера. Первоначально сгенерированное значение будет храниться в
/var/lib/yum/uuid и повторно использоваться, пока этот файл не будет удален.
$YUM0-$YUM9
Эти будут заменены значением переменной окружения оболочки
с тем же именем. Если переменная окружения оболочки
не существует, то переменная конфигурационного файла не будет
заменена.
И углубляясь в то, как назначается $releasever:
Функция _getsysver запрашивает базу данных rpm следующим образом:
rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3
Значение “system-release(releasever)” определяется здесь, и его можно переопределить переменной distroverpkg в yum.conf
Если запрос не вернул никакого значения, releasever устанавливается в ‘$releasever’ (например, если вы установили distroverpkg=centos-release, но установили rpm redhat-release-server)
Для CentOS 8 Stream, который использует больше переменных, таких как $stream – вы также можете сделать так:
# cd /etc/dnf/vars;grep . *
что раскрывает их следующим образом:
contentdir:centos
infra:stock
stream:8-stream
Получить значение для $arch
должно быть так же просто, как arch="$(arch)"
или arch="$(uname --machine)"
, но если вы действительно хотите знать, что yum
имеет в качестве значения для $arch
, попробуйте:
bash-4.2# arch="$(python -c 'from rpmUtils import arch; print(arch.getCanonArch());')";
bash-4.2# declare -p arch
declare -- arch="ia32e"
Получить значения для других переменных без необходимости использовать Python немного проще.
Вариант 1:
bash-4.2# distroverpkg="$(awk --field-separator \= '/distroverpkg/{print$2}' /etc/yum.conf)";
bash-4.2# releasever="$(rpm --query --queryformat '%{VERSION}\n' "${distroverpkg:-redhat-release}")";
bash-4.2# basearch="${HOSTTYPE:-$(uname --machine)}";
bash-4.2# declare -p distroverpkg releasever basearch
declare -- distroverpkg="centos-release"
declare -- releasever="7"
declare -- basearch="x86_64"
Вариант 2:
bash-4.2# releasever="$(rpm --query --file --queryformat '%{VERSION}\n' /etc/system-release)";
bash-4.2# basearch="$(rpm --query --queryformat '%{ARCH}\n' "kernel-$(uname --kernel-release)")";
bash-4.2# declare -p releasever basearch
declare -- releasever="7"
declare -- basearch="x86_64"
Примечание: Команды показаны с использованием
long-opts
(когда это возможно) для ясности.
Другой способ увидеть результаты замены переменных – сделать что-то вроде этого:
yum-config-manager -c /etc/reposyncb.conf | grep -i spacewalk
Я экспериментировал с переменными yum, чтобы управлять тем, какой клиент spacewalk будет выбран для создания локального репозитория, и нашел это полезным для того, чтобы увидеть, как переменные интерпретируются.
Ответ или решение
Как просмотреть переменные $releasever, $basearch и $YUM0 в Yum
Введение
При работе с Yum, системным менеджером пакетов для Linux-дистрибутивов на основе RPM, иногда возникает необходимость отладки конфигурации репозиториев. Основными переменными, которые могут потребоваться для понимания поведения Yum, являются $releasever
, $basearch
и переменные окружения $YUM0
–$YUM9
. В данной статье мы рассмотрим, как их просмотреть, и объясним, какие шаги предпринимать для успешной отладки конфигурации репозиториев.
Переменные Yum
- $releasever: Эта переменная принимает значение версии, установленной в пакете, указанном в
distroverpkg
. По умолчанию это версия пакетаredhat-release
. - $basearch: Определяет базовую архитектуру Yum. Например, если ваша архитектура
$arch
равнаi686
, то$basearch
будет равенi386
. - $YUM0-$YUM9: Эти переменные заменяются значениями из переменных окружения с таким же именем. Если переменные окружения не заданы, значение в конфигурации заменяться не будет.
Просмотр переменных в Yum
Для RHEL/CentOS 8 и 9
На современных версиях RHEL/CentOS можно использовать встроенный Python-интерфейс для работы с DNF, чему Yum является предшественником:
/usr/libexec/platform-python -c 'import dnf, json; db = dnf.dnf.Base(); db.conf.substitutions.update_from_etc("/"); print(json.dumps(db.conf.substitutions, indent=2))'
Этот скрипт выведет все текущие переменные, включая $releasever
, $basearch
и многие другие.
Для RHEL/CentOS 6 и 7
На этих версиях можно использовать следующее:
python -c 'import yum, json; yb = yum.YumBase(); print(json.dumps(yb.conf.yumvar, indent=2))'
Для RHEL/CentOS 4 и 5
Если Python-библиотека simplejson
установлена:
python -c 'import yum, simplejson as json; yb = yum.YumBase(); print(json.dumps(yb.conf.yumvar, indent=2))'
В противном случае:
python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Альтернативные методы получения переменных
Есть и более простые способы получить значения переменных без использования Python:
- Опция 1: Используйте
awk
иrpm
для получения значений:
distroverpkg="$(awk -F= '/distroverpkg/{print $2}' /etc/yum.conf)"
releasever="$(rpm --query --queryformat '%{VERSION}\n' "${distroverpkg:-redhat-release}")"
basearch="$(uname -m)"
- Опция 2: Выполните команду для получения других значений:
releasever="$(rpm --query --queryformat '%{VERSION}\n' /etc/system-release)"
basearch="$(rpm --query --queryformat '%{ARCH}\n' "kernel-$(uname --kernel-release)")"
Дополнительные инструменты
Для получения детальной информации о конфигурациях и переменных Yum вы можете использовать команды:
yum-config-manager --dump
dnf config-manager --dump
или для значений переменных:
yum-config-manager --dump-variables
dnf config-manager --dump-variables
Заключение
Подводя итог, для отладки Yum и понимания, почему система пытается подгрузить именно определенные URL, знание и использование переменных, таких как $releasever
, $basearch
и $YUM0
–$YUM9
, критически важно. Способы, описанные выше, позволят вам получить информацию о текущих настройках вашего менеджера пакетов, что в свою очередь поможет вам настроить правильные URL-адреса для репозиториев.