Yum:如何查看 $releasever、$basearch 和 $YUM0 等变量?

Ste*_*ski 86 yum scientific-linux repository dnf

我正在设置一个 yum 存储库,并且需要调试 yum.conf 文件中的一些 URL。我需要知道为什么 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 - "The requested URL returned error: 404"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: sl. Please verify its path and try again
Run Code Online (Sandbox Code Playgroud)

该的yum.conf(5)手册页提供了有关这些变量的一些信息:

变量

您可以使用许多变量来简化 yum 配置文件的维护。它们在几个选项的值中可用,包括 name、baseurl 和 commands。

$releasever 这将替换为 distroverpkg 中列出的软件包版本的值。这默认为 'redhat-release' 包的版本。

$arch 这将被替换为您在 Python 中由 os.uname()[4] 列出的架构。

$basearch 这将替换为您在 yum 中的基础架构。例如,如果您的 $arch 是 i686,您的 $basearch 将是 i386。

$YUM0-$YUM9 这些将被替换为同名 shell 环境变量的值。如果 shell 环境变量不存在,则不会替换配置文件变量。

有没有办法使用yum命令行实用程序查看这些变量?我宁愿不寻找“redhat-release”包的版本,也不想在 Python 中手动获取 os.uname()[4] 的值。

Mar*_*try 118

当这个答案是在 2011 年编写时,当时所有版本的 RHEL/CentOS 默认都没有为 python 安装 json,所以我使用 pprint 很好地打印了这些东西。

现在是 2020 年,所有当前版本的 RHEL/CentOS 默认都为 Python 提供 json。答案已更新为使用 json,并通过修改@sysadmiral对 Fedora的回答更新为包含 RHEL/CentOS 8 。

RHEL/CentOS 8:

/usr/libexec/platform-python -c 'import dnf, json; db = dnf.dnf.Base(); print(json.dumps(db.conf.substitutions, indent=2))'
Run Code Online (Sandbox Code Playgroud)

RHEL/CentOS 6 和 7

python -c 'import yum, json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'
Run Code Online (Sandbox Code Playgroud)

RHEL/CentOS 4 和 5

# if you install python-simplejson
python -c 'import yum, simplejson as json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'

# otherwise
python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'

Run Code Online (Sandbox Code Playgroud)

示例输出:

# CentOS 8:
# ---
[root@0928d3917e32 /]# /usr/libexec/platform-python -c 'import dnf, json; db = dnf.dnf.Base(); print(json.dumps(db.conf.substitutions, indent=2))'
Failed to set locale, defaulting to 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)'
Loaded plugins: 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)'
Loaded plugins: fastestmirror, ovl
{
  "releasever": "6", 
  "basearch": "x86_64", 
  "arch": "ia32e", 
  "uuid": "3e0273f1-f5b6-481b-987c-b5f21dde4310", 
  "infra": "container"
}
[root@bfd11c9a0880 /]# 

Run Code Online (Sandbox Code Playgroud)

原答案如下:

如果您安装yum-utils,这将为您yum-debug-dump提供将这些变量和更多调试信息写入文件的内容。没有写入标准输出的选项,它总是会写入一些确实没有帮助的文件。

这显然不是一个很好的解决方案,所以这里有一个 python one-liner,你可以复制和粘贴,它将这些变量打印到标准输出。

python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'

这适用于 CentOS 5 和 6,但不适用于 CentOS 4。 yum 是用 python 编写的,因此 yum python 模块已经在您的服务器上,无需安装任何 exra。

这是 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]# 
Run Code Online (Sandbox Code Playgroud)

  • `yum-debug-dump` 似乎可以满足我的需求。看起来信息都在 `%%%%YUM INFO` 部分下。我似乎无法让诸如 `$YUM0-$YUM9` 之类的东西出现,但无论如何我从不使用这些变量。 (2认同)
  • 要在 bash shell 中清晰地显示 **$releasever**,请使用以下命令:`/usr/bin/python -c 'import yum;yb=yum.YumBase();yb.doConfigSetup(init_plugins=False);打印 yb.conf.yumvar["releasever"]'` (2认同)

sys*_*ral 17

以防万一有人像我一样,在 Fedora 上寻找 dnf 的等效答案,我想出了以下 python 单线:

python3 -c 'import dnf, pprint; db = dnf.dnf.Base(); pprint.pprint(db.conf.substitutions,width=1)'
Run Code Online (Sandbox Code Playgroud)

在 Fedora 24 上,它看起来像这样:

{'arch': 'x86_64',
 'basearch': 'x86_64',
 'releasever': '24'}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ill 13

要获得所有这些,您需要使用像mmckinst 发布的代码,但如果您只是想检查一下,$releasever您可以yum version nogroups在 RHEL-6 上运行。

在 RHEL-6 中要做的另一件事是在/etc/yum/vars.


小智 8

对于完整转储,您可以使用:

yum config-manager --dump
dnf config-manager --dump
Run Code Online (Sandbox Code Playgroud)

要转储变量,您可以使用:

yum config-manager --dump-variables
dnf config-manager --dump-variables
Run Code Online (Sandbox Code Playgroud)

yum-config-manager也可用,但通常会重定向到 dnf 配置管理器插件。

来自https://linux.die.net/man/5/yum.conf:

$releasever这将替换为 distroverpkg 中列出的软件包版本的值。这默认为“redhat-release”包的版本。$arch 这将替换为 Python 中 os.uname()[4] 列出的架构。

$basearch这将替换为 yum 中的基本架构。例如,如果您的 $arch 是 i686,那么您的 $basearch 将是 i386。
$uuid这将替换为该机器的唯一但持久的 uuid。第一次生成的值将存储在 /var/lib/yum/uuid 中并重复使用,直到删除该文件。

$YUM0-$YUM9这些将被替换为同名的 shell 环境变量的值。如果 shell 环境变量不存在,则不会替换配置文件变量。


小智 6

并深入了解 $releasever 的分配方式:

该_getsysver功能查询rpm数据库,如:

rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3
Run Code Online (Sandbox Code Playgroud)

"system-release(releasever)" 值在这里定义,它可以被yum.conf中的 distroverpkg覆盖

如果查询没有返回任何值,则将 releasever 设置为 '$releasever'(例如,如果您设置了distroverpkg=centos-release但已经安装了 rpm redhat-release-server)