解决 RHEL 换 CentOS 源后无法取 $releasever 变量
Table of Contents
RHEL 的 yum 源换成 CentOS 源之后,/etc/yum.repos.d 下的配置文件中“$releasever”变量统统失效。解决方法:
- 用“centos”替换“$releasever”。
- 把 redhat-release 包替换为 centos-release:
a). 用 rpm -e --nodeps 命令手动删除 redhat-release 包; b). 找个源手动下载安装 centos-release; c). 修改 /etc/yum.conf,把 distroverpkg=redhat-release 改成 distroverpkg=centos-release
1. $releasever 取值原理
$releasever 的取值默认是 redhat-release,见 yum/config.py:
class StartupConf(BaseConfig): debuglevel = IntOption(2, 0, 10) errorlevel = IntOption(2, 0, 10) distroverpkg = Option('redhat-release') ...
版本是从 redhat-release/centos-release 的 RPM 包信息里获得的,见 _getsysver 函数实现:
def _getsysver(installroot, distroverpkg): ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot) ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) try: idx = ts.dbMatch('provides', distroverpkg) except TypeError, e: if sys.hexversion < 0x02050000: if hasattr(e,'message'): raise Errors.YumBaseError("Error: " + str(e.message)) else: raise Errors.YumBaseError("Error: " + str(e)) raise Errors.YumBaseError("Error: " + str(e)) except rpm.error, e: raise Errors.YumBaseError("Error: " + str(e)) if idx.count() == 0: releasever = '$releasever' else: hdr = idx.next() releasever = hdr['version'] # 这里,获得版本信息 del hdr del idx del ts return releasever
可以下载 centos-release 的 RPM 包,用 rpm -qpi 命令验证:
$ rpm -qpi centos-release-7-5.1804.el7.centos.x86_64.rpm