Redhat 或 CentOS 发行版本号
第一种方法,也是最容易想到的方法是查看 /etc/issue 和 /etc/redhat-release 这两个文件,这两个文件都差不多,都含有发行号, 但这是在文件中,很容易修改,我那个同事觉得这个不太靠谱。
第二种方法是使用命令,在RHEL 5 或 CentOS 5 中有个命令: lsb-release, 通过这个命令可以查到,不过在RHEL 6就没这么幸运了,在我的最小化系统中找不到这个命令,而我那个同事偏偏是在CentOS 6上获取发行版本号, 看来此路又不通了。
不过有一个线索, 那就是在CentOS自带的Yum源文件中使用了 $releasever , $basearch 等这些变量, 奇怪的是这些变量的值是从哪获取的呢?
Google 一下之后,说明Yum变量的说明可以在这里(5.3.3. Using Yum Variables)找到,说明如下:
5.3.3. Using Yum Variables
You can use and reference the following built-in variables in yum commands and in all Yum configuration files (that is, /etc/yum.conf and all .repo files in the /etc/yum.repos.d/ directory):
$releasever
You can use this variable to reference the release version of Red Hat Enterprise Linux. Yum obtains the value of $releasever from the distroverpkg=value line in the /etc/yum.conf configuration file. If there is no such line in /etc/yum.conf, then yum infers the correct value by deriving the version number from the redhat-release package.
$arch
You can use this variable to refer to the system’s CPU architecture as returned when calling Python’s os.uname() function. Valid values for $arch include: i586, i686 and x86_64.
$basearch
You can use $basearch to reference the base architecture of the system. For example, i686 and i586 machines both have a base architecture of i386, and AMD64 and Intel64 machines have a base architecture of x86_64.
$YUM0-9
These ten variables are each replaced with the value of any shell environment variables with the same name. If one of these variables is referenced (in /etc/yum.conf for example) and a shell environment variable with the same name does not exist, then the configuration file variable is not replaced.
To define a custom variable or to override the value of an existing one, create a file with the same name as the variable (without the “$” sign) in the /etc/yum/vars/ directory, and add the desired value on its first line.
For example, repository descriptions often include the operating system name. To define a new variable called $osname, create a new file with “Red Hat Enterprise Linux” on the first line and save it as /etc/yum/vars/osname:
~]# echo “Red Hat Enterprise Linux” > /etc/yum/vars/osname
Instead of “Red Hat Enterprise Linux 6”, you can now use the following in the .repo files:
name=$osname $releasever
文中说到$releasever的定义可以查看 /etc/yum.conf 文件的事distroverpkg=value 行,打开 /etc/yum.conf 看一下,默认文件(我的是CentOS 6)内容如下:
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
distroverpkg=centos-release 代表什么? 去哪找 centos-release 。找到这里我再一次表示困惑。
不过另一篇文章进行了我的视野: yum的$releasever真是太反动了, 关键内空如下:
在 /etc/yum.repos.d/ 目录下的软件库定义文件中,常常会在 baseurl 的路径中提到 $releasever 这个变量,表示当前发行版的大版本号,但大家知道这个变量是在哪设置的吗?我 grep 了整个 etc 目录都没找到,还是看了 yum.conf 才知道的,是在 yum.conf 文件里 distroverpkg 选项定义的。但这个选项就很有问题:
distroverpkg 和 releasever 名字不同,且看不出什么联系
distroverpkg 的值,并不是明文,而是“redhat-release”。不知道大家看到这个会有什么想法,反正我是首先想到了 /etc/redhat-release 文件,但我错了。实际上指的是 redhat-release 这个RPM包。所谓“distroverpkg=redhat-release”的意思,其实是将 $releasever 设置为 redhat-release 这个RPM包的版本号
原来如此。这发行版本号可是藏的够深的。
不过这恰好解决了我的那个同事的问题。在此谢谢 JulyClyde。
呵呵,有时去钻一下某些问题还是很有意思的。
小结:
yum中的$releasever变量是取redhat-release-server rpm包的属性值( %{version})。
[root@ldap01 ~]# rpm -q --qf %{version} redhat-release-server;echo
6Server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了