it-swarm.cn

百胜:如何查看$ releasever,$ basearch和$ YUM0等变量?

我正在设置yum存储库,并且需要调试yum.conf文件中的某些URL。我想知道当科学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

yum.conf(5) 联机帮助页提供了有关这些变量的一些信息:

变数

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

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

$ Arch这将被您的体系结构替换,如os.uname()[4]在Python中列出的那样。

$ basearch这将被yum中的基本体系结构取代。例如,如果您的$ Arch是i686,则$ basearch将是i386。

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

有没有一种方法可以使用yum命令行实用程序来查看这些变量?我宁愿不搜寻'redhat-release'软件包的版本,也不希望在Python中手动获取os.uname()[4]的值。

62
Stefan Lasiewski

如果安装_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上的样子:

_[[email protected]]# 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'}
[[email protected]]# 
_
80
Mark McKinstry

以防万一有人像我一样在这里结束,在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'}
14
sysadmiral

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

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

11
James Antill

并深入研究$ releasever的分配方式:

function _getsysver 查询rpm数据库,如下所示:

rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3

定义了“ system-release(releasever)”值 此处 ,并且可以由yum.conf中的distroverpkg覆盖。

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

4
adrianlzt

实际上,获取$Arch的值应该与Arch="$(Arch)"Arch="$(uname --machine)"一样简单,但是如果您真的想知道$Archyum的值是什么,请尝试:

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(如果可用)显示的命令。

0
bfs

查看变量替换结果的另一种方法是执行以下操作:

yum-config-manager -c /etc/reposyncb.conf  | grep -i spacewalk

我正在修改yum变量,以控制选择哪个spacewalk客户端来构建本地存储库,并发现这对于了解如何解释变量很有用。

0
Robert B.