RPM与SRPM

RPM vs SRPM

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

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

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

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

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

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

那怎么办?如果我真的想要安装其他distributions提供的好用的RPM软件文件时?呵呵!还好,还有SRPM这个东西!SRPM是什么呢?顾名思义,他是SourceRPM的意思,也就是这个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 不可 未编译的原始码

SRPM

利用rpmbuild命令可以直接使用SRPM包安装软件,也可以先将SRPM包编译成RPM包,再使用RPM包安装软件:

bash 复制代码
rpmbuild [选项] 包全名
参数
-rebuild:编译 SRPM 包生成 RPM 二进制包;
-recompile:编译 SRPM 包,同时安装。

安装rpmbuild及其依赖:

bash 复制代码
yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed libtool zlib zlib-devel pcre pcre-devel patch
yum -y install rpm-build  gcc  make  redhat-lsb-core   libuuid-devel 

RPM

1:安装文件

bash 复制代码
rpm -ivh packge_name
参数
-i: install的意思
-v:查看更详细的安装信息画面
-h:以安装信息栏显示安装的进度

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

bash 复制代码
rpm -ivh packge_name --test

3: RPM 文件升级

bash 复制代码
rpm -Uvh packge_name  rpm -Fvh packge_name
-Uvh  后面接的软件如果没有安装,则直接安装软件,若后面的接的软件有安装过的旧版本,则系统自动更新至新版。
-Fvh  后面的接的软件如果没有安装,则不安装。      若后面的接的软件有安装过的旧版本,则系统自动更新至新版。

4:查询

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

rpm查询可用的选项有:

bash 复制代码
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 的意思)

5.rpm卸载和重建数据库

卸载就是用 -e即可。

bash 复制代码
rpm -e +软件名称

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

bash 复制代码
 rpm --rebuilddb    
相关推荐
城南云小白5 分钟前
Linux网络服务只iptables防火墙工具
linux·服务器·网络
从心归零6 分钟前
sshj使用代理连接服务器
java·服务器·sshj
咩咩大主教7 分钟前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
isNotNullX8 分钟前
一文解读OLAP的工具和应用软件
大数据·数据库·etl
羌俊恩12 分钟前
视频服务器:GB28181网络视频协议
服务器·网络·音视频
Flying_Fish_roe34 分钟前
linux-网络管理-网络配置
linux·网络·php
运维小白。。36 分钟前
Nginx 反向代理
运维·服务器·nginx·http
科技互联人生43 分钟前
中国数据中心服务器CPU行业发展概述
服务器·硬件架构
小诸葛的博客2 小时前
pg入门1——使用容器启动一个pg
数据库