RPM vs SRPM

时间:2020-12-21 06:46:17

RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的。 RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。

他最大的特点就是将你要安装的软件先编译过, 并且打包成为 RPM 机制的包装文件,透过包装好的软件里头默认的数据库记录, 记录这个软件要安装的时候必须具备的相依属性软件,当安装在你的 Linux 主机时, RPM 会先依照软件里头的数据查询 Linux 主机的相依属性软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的资讯整个写入 RPM 的数据库中,以便未来的查询、验证与反安装!这样一来的优点是:

  1. 由於已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);
  2. 由於软件的资讯都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装

但是这也造成些许的困扰。由於 RPM 文件是已经包装好的数据,也就是说, 里面的数据已经都『编译完成』了!所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。 也就是说,你的主机系统环境必须要与当初创建这个软件文件的主机环境相同才行! 举例来说,rp-pppoe 这个 ADSL 拨接软件,他必须要在 ppp 这个软件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个软件,那么很抱歉,除非你先安装 ppp 否则 rp-pppoe 就是不让你安装的 (当然你可以强制安装,但是通常都会有点问题发生就是了!)。

所以,通常不同的 distribution 所发布的 RPM 文件,并不能用在其他的 distributions 上。举例来说,Red Hat 发布的 RPM 文件,通常无法直接在 SuSE 上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 4.x 的 RPM 文件就无法直接套用在 CentOS 5.x !因此,这样可以发现这些软件管理机制的问题是:

  1. 软件文件安装的环境必须与打包时的环境需求一致或相当;
  2. 需要满足软件的相依属性需求;
  3. 反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!

那怎么办?如果我真的想要安装其他 distributions 提供的好用的 RPM 软件文件时? 呵呵!还好,还有 SRPM 这个东西!SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 文件里面含有原始码哩!特别注意的是,这个SRPM 所提供的软件内容『并没有经过编译』, 他提供的是原始码喔!

通常 SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那么为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原始码, 但是他仍然含有该软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM 不同的是,他也提供了参数配置档 (就是 configure 与 makefile)。所以,如果我们下载的是 SRPM ,那么要安装该软件时,你就必须要:

  • 先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件;
  • 然后将编译完成的 RPM 文件安装到 Linux 系统当中

怪了,怎么 SRPM 这么麻烦呐!还要重新编译一次,那么我们直接使用 RPM 来安装不就好了?通常一个软件在发布的时候,都会同时发布该软件的 RPM 与 SRPM 。我们现在知道 RPM 文件必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以透过修改 SRPM 内的参数配置档,然后重新编译产生能适合我们 Linux 环境的 RPM 文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!

文件格式 档名格式 直接安装与否 内含程序类型 可否修改参数并编译
RPM xxx.rpm 已编译 不可
SRPM xxx.src.rpm 不可 未编译之原始码

RPM软件管理程序:rpm

1:安装文件 rpm -ivh packge_name

参数

-i: install的意思

-v:查看更详细的安装信息画面

-h:以安装信息栏显示安装的进度

2: 测试某个软件是否可以被安装到用户的Linux环境当中,可找出是否有属性依赖的问题。

rpm -ivh packge_name --test

3: RPM 文件升级   rpm -Uvh packge_name  rpm -Fvh packge_name

-Uvh  后面接的软件如果没有安装,则直接安装软件,若后面的接的软件有安装过的旧版本,则系统自动更新至新版。

-Fvh  后面的接的软件如果没有安装,则不安装。      若后面的接的软件有安装过的旧版本,则系统自动更新至新版。

4:查询

RPM查询时,其实就是查询/var/lib/rpm/这个目录下的数据库文件。

rpm查询可用的选项有:

rpm -a +软件名称

                仅查询,后面接的软件名称是否有安装;

rpm -qa

列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;

rpm -q[licdR]  + 已安装的软件名称

-qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等

-ql :列出该软件所有的文件与目录所在完整档名 (list);如帮助文档的位置,可执行的文件位置信息等等

                    -qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)

rpm -qf + 存在于系统上面的某个文件名

                                 由后面接的文件名称,找出该文件属於哪一个已安装的软件;这个事文件名不是软件名称

rpm -qp[licdR] + 未安装的软件对应的RPM文件

                          查询某个 RPM 文件内含有的资讯,注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出 某个 RPM 文件内的资讯,而非已安装的                                      软件资讯!注意!

在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!查询主要分为两部分, 一个是查已安装到系统上面的的软件资讯,这部份的资讯都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 文件内容, 等於是由 RPM 文件内找出一些要写入数据库内的资讯就是了,这部份就得要使用 -qp (p 是 package 的意思)

rpm卸载和重建数据库

卸载就是用 -e即可。  rpm -e +软件名称

由于RPM文件经常会安装、删除、升级等,某些操作或许会导致RPM数据库/var/lib/rpm内的文件损坏。如何恢复呢?可使用--rebuilddb这个参数

rpm --rebuilddb