来看这篇文章的人,大都应该同意《Unix编程艺术》中提到的那些观点吧。今天就给大家看一个反例:yum 的 $releasever 变量

在 /etc/yum.repos.d/ 目录下的软件库定义文件中,常常会在 baseurl 的路径中提到 $releasever 这个变量,表示当前发行版的大版本号,但大家知道这个变量是在哪设置的吗?我 grep 了整个 etc 目录都没找到,还是看了 yum.conf 才知道的,是在 yum.conf 文件里 distroverpkg 选项定义的。但这个选项就很有问题:

  1. distroverpkg 和 releasever 名字不同,且看不出什么联系
  2. distroverpkg 的值,并不是明文,而是“redhat-release”。不知道大家看到这个会有什么想法,反正我是首先想到了 /etc/redhat-release 文件,但我错了。实际上指的是 redhat-release 这个RPM包。所谓“distroverpkg=redhat-release”的意思,其实是将 $releasever 设置为 redhat-release 这个RPM包的版本号

够变态吧?别人都是直接赋值,或者 include 一个各种变量定义的文件进来,而yum竟然用某个包的属性作为值,违反了“everything is file”的原则。烂!用属性实现,则相关软件必须能读取属性。这个功能对于yum来说无所谓,但是对于别的软件呢?还得特地加入rpm相关的代码才能实现,加入了平台相关特性,降低了可移植性,麻烦。正确的方法是以文件内容作为表示形式。当然了,这样的话用属性就没意义了,yum还能减点肥。

另外,如果/etc/redhat-release 文件和 redhat-release 包标示的信息不同,又该以哪个为准呢?redhat犯过不止一次这样的错误了,比如ifcfg-eth0里可以写DEVICE=eth1之类的。一个信息到处存放,则必将面临各处副本不一致的危险。

有人为心爱的 RedHat 分辩说是为了升级 redhat-release 包之后可以自动升级整个系统,但事实证明 RedHat 的选择一向都是很傻的。为什么不在软件库定义文件中 include 一个表示版本号的头文件,每次大升级的时候更改这个文件呢?

再举个例子:

Debian系里面,内核包的版本维护是利用一个虚拟的某个风格的内核包,比如 linux-image-generic 包,而该包又依赖于 linux-image-2.6.28-15-generic,后者就是真正的内核包,其版本号直接写在包名里,同时也表现在包属性里。系统升级的时候,由于 linux-image 和 linux-image-generic 的依赖关系变动,会依赖于新的 linux-image-2.6.xx-yy-generic 包,自然会装上。而新的 linux-image-2.6.xx-yy-generic 和旧的根本不是一个名字,因此旧的内核包不会“被升级”掉。apt后加入的删除无用包的功能可以指定不删除 linux-image 开头的所有包。

反观 RedHat系 的做法:各个内核包,只有若干个 kernel-<flavor> 的风格包名,版本号作为 RPM 的属性来实现,但是内核这么重大的包又不能轻易用新的代替旧的,于是再给 yum 新增一个 installonlyn 插件(没错,后面还有个n字母,表示数量)来抑制新的高版本 kernel 代替同名旧 kernel 包的动作。

[root@iZ2834y8cmdZ yum.repos.d]# cat ../yum.conf
[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=aliyun-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
#exclude=*.i?86 kernel kernel-xen kernel-debug

# Note: yum-RHN-plugin doesn't honor this.
metadata_expire=1h

# Default.
# installonly_limit = 3

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]# cat /etc/aliyun-release
Aliyun Linux release 5.7
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]#
[root@iZ2834y8cmdZ yum.repos.d]#

(转)yum的$releasever真是太反动了的更多相关文章

  1. yum-config-manager YUM安装遭遇: [Errno 256] No more mirrors to try CentOS yum之$releasever和$basearch

    YUM安装遭遇: [Errno 256] No more mirrors to try createrepo 有问题. CentOS yum之$releasever和$basearch分类: 操作系统 ...

  2. yum中$releasever、 $basearch等变量含义

    [root@kickstart ~]# rpm -qf /etc/redhat-release centos-release--4.1708.el7.centos.x86_64 yum中的$relea ...

  3. CentOS下Yum的$releasever和$basearch的取值

    CentOS下Yum源配置文件中如CentOS-Base.repo的$releasever和$basearch的取值 $releasever的值,这个表示当前系统的发行版本,可以通过如下命令查看: r ...

  4. (转载)linux下Yum的$releasever和$basearch的取值

    https://blog.csdn.net/whatday/article/details/51097456

  5. Using Yum Variables

    You can use and reference the following built-in variables in yum commands and in all Yum configurat ...

  6. 本地yum仓库搭建及rpm软件包定制

    环境内核信息: [root@zabbix-01 ~]# uname -a Linux lodboyedu-01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:2 ...

  7. 搭建自己的YUM源HTTP服务器

    createrepo是linux下的创建仓库的软件包.create是创建的意思,repo是repository的缩写,是仓库的意思.yum(Yellowdog Updater,Modified)主要的 ...

  8. CentOS 7上的程序管理:rpm、yum和源码编译安装

    简介 在Linux的早期时代(也许吧?我猜的.也可能是Unix.),想要在系统上安装一款应用程序,是比较复杂的.需要专业的人员自行获取程序的源代码,并且编译安装,这是非常的复杂且需要一定的专业功底的, ...

  9. centos8 安装 mongodb 4.2 (使用yum)

    1.制作 repo 文件 参考 mongodb 官方的安装文档,使用下面的脚本制作Yum库安装mongodb4.2,但安装过程提示 "Failed to synchronize cache ...

随机推荐

  1. 在父组件中,直接获取子组件数据-vue

    1.通过 $ref 获取 主父组件中: <x-test ref="ch"></x-test> import XTest from '@/components ...

  2. LeetCode--049--字母异位词分组(java)

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  3. asp.net开发微信公众平台----目录汇总-持续更新

    1.[c#]asp.net微信公众平台开发(1)数据库设计 2.[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现 3.[c#]asp.net微信公众平台开发(3)微信消息封装及反 ...

  4. (1)消灭初级程序员常用的多层if-else嵌套--------------【表驱动法】

    表驱动法 1.相信很多刚从事工作的程序员或一些初级程序员在写代码的时候会出现对一些逻辑判断写成多层if-else嵌套的经历,这种方式在一些简单的层次中运用起来确实可行,但对于一些大型项目逻辑判断比较多 ...

  5. [CSS]CSS浮动塌陷及解决办法

    一. CSS浮动 先看一个例子 <html !DOCTYPE> <head> <title>HTML2</title> <style> .d ...

  6. 理解json和jsonp的定义和区别以及如何实际使用

    (一)什么是跨域请求? 首先要理解什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景. 常见 ...

  7. SqlServer 2012 AlwaysOn

    第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnblogs.com/lyhabc/p/4682028.html第三篇htt ...

  8. 【HANA系列】SAP HANA的特点总结

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的特点总结   ...

  9. Unity3D架构之PureMVC

    之前了解过UI实现框架大多是用MVC架构的,才听说有这么一个基于MVC的跨平台开源框架叫PureMVC,前几天用到了做了一下,写一写分析总结官网位置:http://puremvc.org/ PureM ...

  10. 2019Hdu多校第三场:1007 Find the answer(multiset 解法)

    原题链接: Find the answer c++中,multiset是库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数 ...