rpm -U 做了什么
如果RPM的命令中有一条命令好用到没朋友,那么这条命令就是RPM的软件升级命令了。毕竟,只有那些尝试过手动在linux中升级一个软件的版本的人才知道蛋蛋有多疼。有了RPM,软件升级只不过是一个命令的事:rpm -U(等同于rpm --upgrade)。这个命令执行了一下两个独立的操作:
安装软件的升级版。
卸载旧版本。
如果你天真地说rpm -U不算什么,完全可以用rpm -i和rpm -e来替换,那么,我会告诉你,你真的说对了。
也许有人会认为rpm -U只是一个鸡肋,因为它只是执行了其它命令的组合而已。事实上,rpm -U这样做自有它的机灵之处。rpm -U精心设计了安装和卸载命令的组合,使得即使升级不成功时,依然能够保护重要的文件不被删除。
单独地使用安装和卸载的命令,并不能胜任软件升级的任务,安装意味着可能会覆盖一个修改过的配置文件,同样,卸载意味着可能会删除配置文件。而使用升级命令,即使你的电脑上安装了该软件的多个版本,也能顺利升级。
配置文件的魔法
虽然rpm -i 和rpm -e各自都对配置文件的操作,但是,使用rpm -U才能真正保护好配置文件。当RPM在处理配置文件时,它至少考虑了六种可能发生的场景。
为了做出正确的决定,RPM需要获得一些信息。这些信息是什么呢,它就是配置文件的3个MD5校验码,每次配置文件的更改都会产生一个不同的MD5校验码,MD5校验码不同,则说明两个配置的内容不同。
我们特意提到是3个MD5校验码,那么这3个校验码分别是什么呢:
软件安装时的原始配置文件的MD5校验码
软件升级曾经升级过的当前配置文件的MD5校验码
新的软件升级包中的新配置文件的MD5校验码
上面三种不同的MD5校验码的组合,决定RPM在升级软件时的行为。下文中,将会使用X,Y,Z来代替MD5校验码。
原始配置文件=X,当前配置文件=X,新配置文件=X
这种场景下,一开始安装的配置文件安装后就一直没有修改过,如果RPM安装了新的配置文件,将会覆盖旧的配置文件。有时候你也许会感到奇怪,我新安装的文件它的内容和名字我都没有修改过,为什么还要覆盖呢,这是因为新版本的文件的属性可能已经修改过了,比如文件的所有者。
原始配置文件=X,当前配置文件=X,新配置文件=Y
原始配置并没有被修改过,但新的安装包中它的配置文件与当前配置文件却是不同的,这些改变可能是为了修改一个Bug,或者新添一个新功能。
在这种情况下,RPM将会安装新的配置文件,并覆盖旧的配置文件。RPM并不会为原先的配置文件保留一个备份,因为在升级软件之前,它一直都没有改动过。
原始配置文件=X,当前配置文件=Y,新配置文件=X
配置文件被修改过了,但是,新的安装包中的配置文件却和原始的配置文件是一样的。
这种情况下,RPM会认为由于新的安装包中配置文件和原始配置文件的内容是一样的,而当前配置文件虽然已被修改过,但它认为这些修改对于新的版本来说依然是合法的。于是它不会去覆盖当前的配置文件。
原始配置文件=X,当前配置文件=Y,新配置文件=Y
配置文件被修改过了,并且修改的恰恰与新的安装包中的配置文件中的修改是一样的。
这种情况下,RPM将会安装新版本,并且覆盖当前配置文件,这和第一种情况的处理方式是一样的。尽管新的配置文件和当前配置文件相比,但是文件的其他属性可能修改了,因此安装新版本配置文件。
原始配置文件=X,当前配置文件=Y,新配置文件=Z
在这里,原始配置文件已经被修改过了,并且新的配置文件和当前配置文件以及原始配置文件都是不同的。
RPM是无法通过分析配置文件中的内容来决定如何操作的。不过在这种情况下,RPM会选择一种它认为最好的方式来处理,新配置文件肯定是能兼容新的安装包的,当前配置文件,则可能兼容新的安装包,也可能不兼容。因此RPM会安装新的配置文件。
不过,当前配置文件由于被修改过,那一定是某个人有意为之的,有可能当前配置文件所做的修改对新版本的软件包依然适用,因此,RPM会保留当前配置文件的一个备份为.rpmsave,并且打印出一条警告信息。
warning: /etc/skel/.bashrc saved as /etc/skel/.bashrc.rpmsave
原始配置文件=none,当前配置文件=??,新配置文件=??
出现这种情况,是因为RPM在一开始安装软件的时候,并没有安装配置文件,因此没有MD5校验码。
因为没有原始文件的MD5,所以RPM无法决定当前配置文件是否被修改过的。因此,RPM会把当前文件保存一个备份,命名为.rpmorig,然后打印一条警告信息,然后安装新的配置文件。
正如你所看到的,大多数场景下,RPM会采取最合适的方式来做升级操作。不过,大多数情况下,已经修改过的配置文件是不值得备份的,通常都会被删掉。
升级软件包
使用rpm -U的方式如下所示:
# rpm -U eject-1.2-2.i386.rpm
rpm -U 见不得人的小秘密
假设,我们用rpm -U升级一个软件,但实际上,这个软件从来没有安装过,既然没有安装过,谈何升级呢?这个时候,rpm -U就会变成rpm -i啦,相当于安装软件,而不是升级软件。
既然rpm -U能够表现出rpm -i的行为,因此很多时候,人们直接用一个命令rpm -U来安装和升级软件。
它们只是几乎相同而已
rpm -U在特殊情况下可以代替rpm -i,因此rpm -i的绝大多数附加命令选项对于rpm -U也是适用的。下面是一些rpm -U独有的选项:
--oldpackage: 升级到旧版本
--force: 无论发生什么事,给老子升级
参考资料