我正在设置 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
这百胜.conf(5)联机帮助页提供了有关这些变量的一些信息:
变量
您可以使用许多变量来简化 yum 配置文件的维护。它们在多个选项的值中可用,包括名称、baseurl 和命令。
$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]的值。
答案1
当这个答案是在 2011 年写的时,当时所有版本的 RHEL/CentOS 默认情况下都没有为 python 安装 json,所以我使用 pprint 很好地打印了这些内容。
现在是 2020 年,所有当前版本的 RHEL/CentOS 都默认为 python 提供 json。答案已更新为使用 json 并通过修改更新为包含 RHEL/CentOS 8@sysadmiral 的回答对于费多拉来说。
RHEL/CentOS 8:
/usr/libexec/platform-python -c 'import dnf, json; db = dnf.dnf.Base(); 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
# 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)'
输出示例:
# 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 /]#
原答案如下:
如果您安装yum-utils
,它将向您提供yum-debug-dump
将这些变量和更多调试信息写入文件的功能。没有写入标准输出的选项,它总是会写入一些文件,这确实没有什么帮助。
这显然不是一个很好的解决方案,所以这里有一个 python 单行代码,您可以复制并粘贴,它将把这些变量打印到标准输出。
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]#
答案2
以防万一有人像我一样在这里寻找 Fedora 上 dnf 的等效答案,我想出了以下 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'}
答案3
要获得所有这些,您需要使用类似的代码MMckinst 发布,但如果您只是想检查$releasever
是否可以yum version nogroups
在 RHEL-6 上运行。
在 RHEL-6 中要做的另一件事是在/etc/yum/vars
.
答案4
并深入了解 $releasever 是如何分配的:
这函数_getsysver查询 rpm 数据库,如下所示:
rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3
定义“system-release(releasever)”值这里,并且它可以被覆盖发行包在 yum.conf 中
如果查询未返回任何值,releasever 将设置为“$releasever”(例如,如果您设置distroverpkg=centos-release但已经安装了 rpm redhat-release-server)