Как я могу просмотреть переменные, такие как $releasever, $basearch и $YUM0?

Вопрос или проблема

Я настраиваю репозиторий 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. Опция 1: Используйте awk и rpm для получения значений:
distroverpkg="$(awk -F= '/distroverpkg/{print $2}' /etc/yum.conf)"
releasever="$(rpm --query --queryformat '%{VERSION}\n' "${distroverpkg:-redhat-release}")"
basearch="$(uname -m)"
  1. Опция 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-адреса для репозиториев.

Оцените материал
Добавить комментарий

Капча загружается...