Linux的自由软件非常多,为了方便软件的管理,目前有两大主流软件管理工具:
dpkg
和RPM
。本文主要介绍RPM
的相关信息。
RPM
是RedHat Package Manager
的简称,是一种软件管理机制,起初是有RedHad
公司发展出来的。RPM
是以一种数据库记录的方式来将我们所需的软件安装到Linux系统中。RPM
软件包制作时,会将安装软件源码进行编译,并将安装该软件时所需的关联软件记录到软件包的数据库中,。当开始安装软件时,RPM
会通过软件包里的数据库数据检查安装环境中是否已安装关联软件,若关联软件已安装则开始安装该软件,若关联软件未安装则不予安装。安装时,RPM
会将软件信息写入相关的数据库,以便未来的查询、验证和删除。通过RMP
的这些机制,我们可以发现其有以下优点:
RPM
内含已经编译过的程序与配置文件等数据,可以让用户免除重新编译的困扰RPM
在被安装前,会先检查系统的硬盘容量、操作系统版本等,避免文件被错误安装RPM
文件本身提供软件版本信息、关联软件名称、软件用途说明、软件所含文件等信息,便于了解软件RPM
使用数据库记录文件的相关参数,便于软件升级、移除、查询、验证但由于RPM
的这个机制,其在软件管理时也有以下问题:
为了解决以上问题,SRPM
出现了。SRPM
是Source RPM
的意思,RPM
软件包里含有软件的原始码,SPRM
软件包提供的软件内容并没有经过编译,提供的是原始码。通常SRPM
的扩展名是以*.src.rpm
的格式命名。虽然SRPM
和Tarball
一样只提供原始码,但是SRPM
里面还含有软件所需的关联软件说明以及所有RPM文件所提供的数据。SRPM
和RPM
不同的是软件包提供了参数配置文件configure
、makefile
。当我们使用SRPM
软件包安装软件时,我们要执行以下步骤:
RPM
管理的方式编译,将SRPM
编译成RPM
文件RPM
文件安装到Linux系统中下面是RPM
和SRPM
的简单比较。
软件包 | 文件格式 | 直接安装 | 程序类型 | 可否修改参数并编译 |
---|---|---|---|---|
RPM | xxx.rpm | 是 | 已编译 | 不可 |
SRPM | xxx.src.rpm | 否 | 原始码,未编译 | 可 |
一般情况下,一个RPM
软件包的名称包含了软件名称、版本信息、编译次数、硬件操作平台这些信息。以软件包rp-pppoe-3.11-7.el7.x86_64.rpm
为例。
rp-pppoe
3
,次版本为11
。次版本就是在主版本的架构下改动部分原始码的内容CPU
,由于RPM
可以适用在不同的操作平台上,但不同的平台CPU设定的参数还是有所差异性。开发者可以根据不同的CPU设定不同的参数,从而充分利用CPU,让软件性能更好。以下是软件包中常见的一些名称。平台名称 | 适合平台说明 |
---|---|
i386 | 几乎适用于所有的 x86 平台,不论是旧的 pentum 还是新的 Intel Core 2 与 K8 系列的 CPU 等等,都可以正常工作。i 是 Intel 兼容的 CPU 的意思,386 是CPU 的等级 |
i586 | 针对586 等级的计算机进行优化编译,586 等级的CPU 有:pentum 第一代 MMX CPU 、AMD 的 K5/K6 系列等 |
i686 | 在 pentum II 以后的 Intel 系列 CPU ,及 K7 以后等级的CPU 。目前市场上几乎仅剩 P-II 以后的CPU |
x86_64 | 针对64 位的CPU 进行优化编译设定,包括 Intel 的 Core 2 以上等级 CPU ,以及 AMD 的 Athlon64 以后等级的 CPU |
noarth | 没有硬件等级限制,一般这种类型的 RPM 文件中没有 binary program 存在,较常用于 shell script 方面的软件 |
RPM
安装软件时,软件文件存放位置如下表。
目录名称 | 存放文件 |
---|---|
/etc | 配置文件 |
/usr/bin | 可执行文件 |
/usr/lib | 程序使用的动态函数库 |
/usr/share/doc | 基本的软件使用手册与说明文件 |
/usr/share/man | man page 文件 |
以下是RPM
安装软件时的基本语法。
# RPM安装
rpm -ivh package_name [options]
选项与参数:
-i
:install 的意思-v
:查看详细的安装过程-h
:安装时显示安装进度options
:安装时的一些选项,以下是RPM
安装时常用的一些选项选项 | 用途 |
---|---|
–nodeps | 强制安装,当软件因关联软件未安装而无法安装时, 使用该选项可以安装软件,但安装的软件可能会因为缺少关联软件而无法正常使用 |
–replacefiles | 覆盖文件,当软件安装过程中出现 某个文件已被安装在系统上 或版本不和(confilcting files) 的信息时,可以使用该选项来直接覆盖文件,但覆盖之前需要考虑清楚,因为覆盖后无法复原 |
–replacepkgs | 重新安装已经安装过的软件,当系统提示某软件已安装 的信息,无法继续安装时,可以使用该选项来重新安装相应的软件 |
–force | --replacefiles 与--replacepkgs 的综合 |
–test | 想要测试某软件是否可以被安装到使用者的Linux环境中,可通过该选项来进行测试,找出软件关联问题,如:rpm -ivh pkgname.i386.rpm --test |
–justdb | 由于RPM 数据库破损或其他缘故产生错误时,可使用这个选项来更新软件在数据库内的相关信息 |
–nosignature | 想要忽略数字签名的检查时,可以使用该选项 |
–prefix new_path | 要将软件安装到非正规目录时,可以使用该选项。如某软件要安装到/usr/local 中,而不是正规的/usr/bin 、/etc 等目录中,就可以通过--prefix /usr/local 来处理 |
–noscripts | 不想让某软件在安装时自动执行一些系统指令时,可以使用该选项。RPM 除了可以将文件放置到指定位置外,还可以自动执行一些前置作业的指令,如数据库的初始化 |
RPM
可以通过-Uvh
或-Fvh
来进行升级,而选项(options)的使用则和安装时一样。
# RPM升级
rpm -Uvh package_name [options]
或
rpm -Fvh package_name [options]
-Uvh
与-Fvh
是有一定的区别的。
指令 | 用途 |
---|---|
-Uvh | 后面接的软件没有安装过,系统会予以直接安装;后面接的软件有安装的旧版,系统自动更新至新版 |
-Fvh | 后面接的软件并未安装,系统不会安装该软件;后面接的软件有安装,软件会被升级 |
RPM
查询的时候,实际查询的是/var/lib/rpm
这个目录下的数据库文件。此外,RPM
可以查询未安装的软件信息。
rpm -qa # 查询所有已安装软件
rpm -q[licdR] 已安装软件名称 # 查询某一已安装软件
rpm -qf 存在于系统上面的某个文件名 # 查询已安装软件的配置文件
rpm -qp[licdR] 未安装的某个文件名 # 查阅RPM文件
下面是选项与参数介绍。
查询已安装软件的信息:
-q
:仅查询后面接的软件名称是否有安装-qa
:列出所有已安装在本机Linux系统上的所有软件名称-qi
(information):列出该软件的详细信息,包含开发商、版权与说明等-ql
(list):列出该软件所有的文件与目录所在完整文件名-qc
(configure):列出该软件的所有配置文件,即找出在/etc
下的相关文件-qd
(document):列出该软件的所有说明文件,找出与man
有关的文件-qR
(Required):找出与该软件有关的关联软件所含的文件-qf
(filename):由后面接的文件名,找出该文件属于哪一个已安装的软件-q --scripts
:列出是否含有安装后需要执行的脚本文件查询某个 RPM 文件内含有的信息:
qp[icdlR]
:-qp
后面接的所有参数与上面的含义一致,但是用于找出某个RPM
文件内的信息,而不是已安装的软件信息验证的机制就是使用/var/lib/rpm
底下的数据库内容来比对目前Linux系统环境下的所有软件。这可以给系统管理员提供一个有效的管理机制。当数据不小心遗失,或误删了某个软件文件,或忘记修改了哪一个软件文件内容时,就可以用这个方法来验证比对原本的文件系统,从而找出那个文件。验证语法如下:
rpm -Va
rpm -V 已安装的软件名称
rpm -Vp 某个RPM 文件的名称
rpm -Vf 在系统上面的的某个文件
选项与参数
-V
:后面接软件名称,若该软件所含的文件被更改过,才会被列出来-Va
:列出目前系统上面所有可能被改动过的文件-Vp
:后面接的是文件名,列出该软件内可能被改动过的文件-Vf
:判断某个文件是否被改动过,有被改动过则被列出来验证文件/etc/passwd
如下:
[root@instance-d619ad0f ~]# rpm -Vf /etc/passwd
S.5....T. c /etc/hosts.deny
S.5....T. c /etc/profile
.M....... g /var/log/lastlog
可以看到文件名称前面有两段字符,第一段字符有S
、M
、5
、T
,这个是对文件的一个描述,从左到右的顺序如下:
S(file Size differs)
:文件大小是否被改变M(Mode differs)
:文件类型或文件属性(rwx)是否被改变5(MD5 sum differs)
:MD5加密内容已经不同D(Device major/minor number mis-match)
:装置的主/次代码已经改变L(readLink(2) path mis-match)
:Link路径已经改变U(User ownership differs)
:文件的所属人已被改变G(Group ownership differs)
:文件的所属群组已被改变T(mTime differs)
:文件的建立时间已被改变P(caPabilities differs)
:功能已被改变第二段有c
、g
这些字符,代表的是文件类型。文件类型有以下这些:
c(config file)
:配置文件d(documentation)
:文件数据文件g(ghost file)
:鬼文件,通常是该文件不被某个软件所包含,较少发生l(license file)
:许可证文件r(read me)
:字数文件RPM验证是一个非常实用的工具,但它只能验证软件内的信息与/var/lib/rpm
里的数据库信息,如果软件文件所提供的数据本身就有问题,使用验证是无法确定软件的正确性的。在使用Tarball
安装软件时,我们可以使用md5指纹码来检查,但是md5指纹码也有可能会被窜改的。此时,我们可以通过数字签名来检验软件的来源。
软件开发商原厂推出的软件会有一个厂商自己的签名系统,这个签名会被数字化。厂商可以用数字签名系统产生一个专属于该软件的签名,并将该签名的公钥(public key)释出。当要安装一个RPM文件时,会有以下的步骤:
rpm
指令会读取RPM文件的签名信息,与本机系统内的签名信息比对CentOS
使用的数字签名系统是GNU计划的GnuPG(GNU Privacy Guard, GPG)
。在CentOS
中,原厂释出的GPG数字签名公钥文件位于/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
,则安装如下:
[root@instance-d619ad0f ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
安装完之后,就可以通过数字签名来查询验证软件了。
# 列出软件的密钥名称
[root@instance-d619vf0h ~]# rpm -qa | grep pubkey
gpg-pubkey-b6792c39-53c4fbdd
gpg-pubkey-8fae34bd-538f1e51
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-352c64e5-52ae6884
# 查询软件相关信息
[root@instance-d619vf0h ~]# rpm -qi gpg-pubkey-b6792c39-53c4fbdd
Name : gpg-pubkey
Version : b6792c39
Release : 53c4fbdd
Architecture: (none)
Install Date: Mon 04 Jun 2018 07:39:40 PM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Tue 15 Jul 2014 06:01:01 PM CST
Build Host : localhost
Relocations : (not relocatable)
Packager : CentOS-7 Debug (CentOS-7 Debuginfo RPMS) <[email protected]>
Summary : gpg(CentOS-7 Debug (CentOS-7 Debuginfo RPMS) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
省略...
-----END PGP PUBLIC KEY BLOCK-----
软件卸载的过程一定要由最上层到最下层的顺序移除,否则会因为软件关联问题导致某些软件无法移除。
# 语法
rpm -e 软件名称
RPM操作时肯能会导致RPM数据库/var/lib/rpm
内的文件破损,此时可以用--rebuilddb
这个选项来重建数据库。
# 语法
rpm --rebuilddb