文章目录

  • RPM软件管理程序:rpm
  • RPM默认安装的路径
  • RPM安装(install)
  • 使用案例
  • RPM升级与更新(upgrade/freshen)
  • RPM查询(query)
  • 使用案例
  • RPM验证与数字签名
  • 使用案例
  • 数字签名
  • RPM反安装与重建数据库(erase/rebuilddb)


RPM软件管理程序:rpm

RPM是Red Hat Package Manager的缩写,是一种常用的Linux软件包管理系统,主要用于管理Red Hat系列的Linux发行版,例如Fedora、CentOS等。

RPM的格式为:

xxxxxxxx.rpm   # RPM的格式,已经经过编译且打包完成的rpm文件

例如rp-pppoe-3.11-5.el7.x86_64.rpm 这文件的意义?

rp-ppoe    -3.11-            5        .el7.x86_64      .rpm
软件名称   软件的版本信息   发布的次数    适合的硬件平台     扩展名
# 除了后面适合的硬件平台与扩展名外,主要是以【-】来隔开各个部分,这样子可以很清楚地发现该软件的名称、版本信息、打包次数与操作的硬件平台。

下面是RPM软件管理程序的详解:

RPM默认安装的路径

在Linux系统中,默认的RPM安装路径包括以下几个目录:

目录

解释

/etc

用于存放系统配置文件,如fstab、passwd等。

/usr/bin

用于存放应用程序的可执行文件,如vi、gcc等。

/usr/lib

一些程序使用的动态数据库

/usr/share/doc

一些基本的软件使用手册与说明文件

/usr/share/man

一些man page 文件

RPM安装(install)

因为安装软件是root的工作,所以你得要是root身份才能够使用rpm这个命令,用rpm来安装很简单。假设我要安装一个文件名为 rp-pppoe-3.11-5.el7.x86_64.rpm的文件,那么我可以这样:

首先将Centos 7 的安装光盘挂载到/mnt 下面

[root@localhost ~]# mount /dev/sr0 /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载

然后执行安装

[root@localhost ~]# rpm -i /mnt/Packages/rp-pppoe-3.11-7.el7.x86_64.rpm

不过这样安装其实无法显示安装进度,所以我们会这样执行安装命令

rpm -ivh  package_name
选项:
-i:install 安装的意思
-v:查看更详细的安装信息
-h:显示安装进度

使用案例

使用安装光盘安装 rp-pppoe 软件

[root@localhost ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-7.el7.x86_64.rpm 
准备中...                          ################################# [100%]
        软件包 rp-pppoe-3.11-7.el7.x86_64 已经安装

一口气安装两个以上的软件

[root@localhost ~]# rpm -ivh a.rpm b.rpm *.rpm
# 后面接上多个安装文件

直接由网络上的某个文件地址来安装

rpm -ivh http://website.name/path/pkgname.rpm

另外,如果我们在安装的过程当中发现问题,或已经知道会发生的问题,而还是【执意】要安装这个软件时,可以使用如下的参数【强制】安装上去

--nodeps:忽略软件包的依赖关系,强制安装软件包。 使用时需要注意,可能会导致系统依赖出现问题。 
 --replacefiles: 在安装软件包时,如果有文件已存在于系统中,则替换该文件。使用时需要注意,可能会覆盖系统中原有的文件,导致系统出现问题。 
--replacepkgs:在安装软件包时,如果该软件包已经安装,则覆盖已有的软件包。使用时需要注意,可能会导致软件无法正常工作。
--force:强制安装软件包,覆盖系统中已有的同名文件。使用时需要谨慎操作,可能会导致系统出现问题。 
--test:测试软件包的安装,但并不实际安装软件包。这个选项可以用来检查是否有依赖关系等问题。 
--justdb : 只更新软件包的数据库信息,不实际安装软件包。这个选项可以用来更新软件包的数据库信息,但并不实际安装软件包。
--nosignature :忽略软件包的数字签名验证,强制安装软件包。使用时需要注意,可能会导致安全问题。 
--prefix 新路径 :指定软件包的安装路径。使用时需要注意,可能会导致软件无法正常工作。 
--noscripts:在安装软件包时,不执行软件包中的脚本。这个选项可以用来跳过软件包中的脚本,但可能会导致软件无法正常工作。

RPM升级与更新(upgrade/freshen)

==-Uvh==:后面接的软件即使没有安装过,则系统予以直接安装;
          若后面接的软件有安装过旧版,则系统自动更新至新版

==-Fvh==:如果后面接的软件并未安装到你的Linux系统上,
          则该软件不会被安装;就是只有已安装至你Linux系统内的软件会被【升级】

由上面的说明来看,如果你想要大量地升级系统旧版本的软件时,使用-Fvh是比较好的做法,因为没有安装的软件才不会被不小心安装进系统中。但是需要注意的是,如果你使用的是-Fvh,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会安装在你的Linux主机上面,所以请重新以 ivh 来安装

RPM查询(query)

RPM查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。另外,RPM也可以查询未安装的 RPM 文件内的信息。

rpm  -qa       # 已安装软件
rpm  -q[licdR] # 已安装软件
rpm  -qf  存在于系统上面的某个文件名  # 已安装软件
rpm  -qp[licdR] 未安装的某个文件名称 # 查看RPM文件
选项:
-q  :仅查询,后面接的软件名称是否有安装
-qa :列出已经安装在本机Linux系统上面的所有软件名称
-qi :列出该软件的详细信息,包含开发商、版本于说明等
-ql :列出该软件所有的文件于目录所在完整文件名
-qc :列出该软件的所有配置文件(找出/etc/下面的文件名而已)
-qd :列出该软件的所有说明文件(找出与man有关的文件而已)
-qR :列出该软件有关的依赖文件所含的文件
-qf :由后面接的文件名,找出该文件属于哪一个已安装的软件
-q  --scripts :列出是否含有安装后需要执行的脚本文件,可以用debug查询某个RPM文件内含有的信息
-qp[icdlR] : 注意 -qp 后面接的所有参数以上面的说明一致,但用途仅在于某个RPM文件内的信息,而非已安装的软件信息。

在查询的部分,所有的参数之前都需要加上-q 才是所谓的查询。查询主要分为两部分:一个查找已安装到系统上面的软件信息,另一个则是查找某个rpm文件内容。

使用案例

找出你的Linux是否安装logrotate这个软件

[root@localhost ~]# rpm -q logrotate
logrotate-3.8.6-19.el7.x86_64
[root@localhost ~]# rpm -q logrotating
未安装软件包 logrotating 
# 系统回去找是否有安装后面接的软件,注意,不必要加上版本,至于显示结果,一看就知道有没有安装

列出上题当中,属于该软件所提供的所有目录与文件

[root@localhost ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
.....
.....
# 可以看出该软件到底提供了多少的文件与目录,也可以查找软件的数据

列出 logrotate 这个软件的相关说明信息

[root@localhost ~]# rpm -qi logrotate
Name        : logrotate                        # 软件名称
Version     : 3.8.6                            # 软件的版本
Release     : 19.el7                           # 发布的版本
Architecture: x86_64                           # 编译时所针对的硬件结构
Install Date: 2023年04月05日 星期三 20时08分11秒 # 这个软件安装到本系统的时间
Group       : System Environment/Base          # 软件放在哪个软件群组中
Size        : 107068                           # 软件的大小
License     : GPL+                             # 发布的授权方式
Signature   : RSA/SHA256, 2020年04月04日 星期六 05时01分10秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : logrotate-3.8.6-19.el7.src.rpm   # SPRM的文件名
Build Date  : 2020年04月01日 星期三 11时26分19秒 # 软件编译打包的时间
Build Host  : x86-02.bsys.centos.org           # 在哪台主机上编译的
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : https://github.com/logrotate/logrotate
Summary     : Rotates, compresses, removes and mails system log files
Description :                                  # 这个是详细秒数
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files.  Logrotate
allows for the automatic rotation compression, removal and mailing of
log files.  Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size.  Normally,
logrotate runs as a daily cron job.

Install the logrotate package if you need a utility to deal with the
log files on your system.

分别仅找出 logrotate 的配置文件与说明文件

[root@localhost ~]# rpm -qc logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/rwtab.d/logrotate
[root@localhost ~]# rpm -qd logrotate
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz

若成功安装logrotate,它还需要什么文件

[root@localhost ~]# rpm -qR logrotate
/bin/sh
/bin/sh
config(logrotate) = 3.8.6-19.el7
coreutils >= 5.92
......
......
......
# 看起来,还是需要很多文件的支持才行

由上面的范例,找出 /bin/sh 是哪个软件提供的

[root@localhost ~]# rpm -qf /bin/sh
bash-4.2.46-34.el7.x86_64
# 这个参数后面接的可是【文件】,不像前面都是接的软件,这个功能在查寻系统的某个文件属于哪一个软件所有

假设我有下载一个RPM文件,想要知道该文件的还依赖哪些文件

[root@localhost ~]# rpm -qpR filename.rpm
# 加上-qpR 找出该文件依赖的文件信息

例题

  1. 我想要知道我的系统当中,以c开头的软件有几个,如何查?
[root@localhost ~]# rpm -qa |grep ^c |wc  -l
  1. 我的WWW服务器为Apache,我知道它使用的RPM文件为httpd。现在,我想要知道这个软件的所有配置文件放置在何处,如何做?
[root@localhost ~]# rpm -qc httpd
  1. 承上题,如果查出来的配置文件已被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件,该如何操作?

假设该软件的网址为: 【http://cccc/path/httpd-xxx.i386.rpm】

[root@localhost ~]# rpm -ivh http://cccc/path/httpd-xxx.i386.rpm
  1. 如果我误删除了某个重要文件,例如 /etc/crontab,偏偏不晓得它属于哪个软件,该怎么办?
[root@localhost ~]# rpm -qf /etc/crontab

RPM验证与数字签名

验证的功能可以帮助系统管理员管理系统中的安装文件。它的作用是通过比对系统中已安装软件的文件和/var/lib/rpm数据库中的记录,来检查文件是否被误删除或修改。如果出现问题,管理员就可以及时了解到哪些文件被修改或删除,以便及时进行修复。这个功能就像是一个保险箱,可以帮助管理员保障系统的安全和稳定。

rpm   -Va
rpm   -V  已安装的软件名称
rpm   -Vp 某个RPM文件的文件名
rpm   -Vf 在系统上面的某个文件
选项:
-V  :后面跟软件名,若该软件所含的文件被修改过才会显示
-Va :列出目前系统上面所有可能被修改过的文件
-Vp :后面跟文件名,列出该软件内可能被修改过的文件
-Vf :显示某个文件是否被修改过

使用案例

列出你的Linux内的logrotate这个软件是否被修改过

[root@localhost ~]# rpm -V logrotate
# 如果没用出现任何信息,那么该软件所提供的文件没用被修改过。

查询一下,你的 /etc/crontab是否有被修改过

[root@localhost ~]# rpm -Vf /etc/crontab
S.5....T.  c /etc/crontab
# 看因为有被修改过,所以会显示被修改过的信息类型

你会发现在文件名之前有个 c,然后就是一堆奇怪的内容了。这个c代表的是 configuration,就是配置文件的以上。至于最前面的几个信息是:

  • 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 differ)功能已经被改变

所以,如果当一个配置我呢见所有的信息都被修改过,那么它的显示就会是:

SM5DLUGTP c filename

这个c代表的则是【config file】的意思,也就是文件的类型,其有下面这几类:

  • c:配置文件(config file)
  • d:数据文件(documentation)
  • g:幽灵文件(ghost file),通常是该文件不被某个软件所包含,较少发生
  • l:许可证文件(license file)
  • r:自述文件(read me)

数字签名

验证功能只能检查已安装软件的文件是否被修改,而无法检查软件本身是否存在问题。如果软件本身就存在问题,那么使用验证功能也无法解决这个问题。为了解决这个问题,我们可以使用md5检验值来验证软件的完整性。通过比对软件提供的md5检验值和我们计算出的md5检验值,来确认软件的完整性。但是,即使md5检验值也可能被篡改。为了更加保险,我们可以通过数字签名来验证软件的来源。数字签名是由软件开发者或发布者提供的签名,可以保证软件来源的真实性和完整性。因此,我们可以通过数字签名来验证软件的来源,以确保软件的安全和可信度。

就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的签名系统,只是这个签名被数字化了而已。厂商可以以数字签名系统产生一个专属于该软件的签名,并将该签名的公钥发布。当你要按照一个RPM文件时

  1. 首先你必须要先安装原厂发布的公钥文件
  2. 实际安装 RPM 软件时,rpm命令会读取 RPM 文件的签名信息并于本机系统内的签名信息比对
  3. 若签名相投则予以安装,若找不到相关的签名信息时,则给予警告并且停止安装

CentOS使用的数字签名系统是GnuPG,它可以通过哈希运算生成独一无二的密钥或数字签名。在RPM文件上,数字签名可以用来确认软件的来源和完整性。为了使用数字签名,我们需要先安装原厂发布的GPG数字签名的公钥文件。在CentOS中,数字签名的公钥文件位于:

[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 
-rw-r--r--. 1 root root 1690 10月 23 2020 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)
mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
.....
......

从上面的输出。你会知道该数字签名值其实仅是一个随机数而已,这个随机数对于数字签名有意义而已,我们看不懂。那么这个软件如何安装呢?通过如下方式

rpm --import命令可以用来安装数字签名的公钥文件。具体来说,rpm --import命令可以将一个或多个数字签名的公钥文件导入到系统中,以便后续验证软件的来源和完整性。该命令的语法为:

rpm --import <公钥文件>

其中,<公钥文件>是数字签名的公钥文件的路径。通过指定该路径,我们可以将该公钥文件导入到系统中。

由于不同版本GPG密钥文件放置的位置可能不同,不过文件名大多是包含 GPG-KEY 字样,因此你可以简单地使用 locate 或 find 来查找

不过 locate 需要安装,centos 默认没有这个命令

[root@localhost ~]# yum install -y mlocate
[root@localhost ~]# updatedb  # 加载数据库
[root@localhost ~]# locate GPG-KEY
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

find命令

[root@localhost ~]# find / -name '*GPG-KEY*'
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

安装完密钥后,通常会以 pubKey 作为软件的名称。你可以使用 -qi 命令来查询这个软件的信息,包括软件的具体名称和其他相关信息。

[root@localhost ~]# rpm -qa |grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-352c64e5-52ae6884
[root@localhost ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name        : gpg-pubkey
Version     : f4a80eb5
Release     : 53a7ff4b
Architecture: (none)
Install Date: 2023年05月26日 星期五 11时53分24秒
Group       : Public Keys
Size        : 0
License     : pubkey
Signature   : (none)
Source RPM  : (none)
Build Date  : 2014年06月23日 星期一 18时19分55秒
Build Host  : localhost
Relocations : (not relocatable)
Packager    : CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>
Summary     : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.3 (NSS-3)
.....
.....
.....

在rpm安装软件的过程中,会有一个很重要的数字签名,它通常以一段难以理解的乱码形式呈现。如果你忘记加上这个数字签名,很可能无法安装很多原版软件,除非你选择忽略数字签名检查。这个数字签名是非常重要的,可以确保软件的安全性和可信度。

RPM反安装与重建数据库(erase/rebuilddb)

反安装就是卸载软件。但是要注意,卸载安装的过程一定要按照从最上层往下解除的顺序进行。举个例子,rp-ppoe这个软件是根据ppp这个软件来安装的。因此,当你要卸载ppp的时候,必须先卸载rp-pppoe才可以,否则可能会出现结构上的问题。这个可以用建筑物来类比,如果你要拆除五、六楼,那么当然要从六楼开始拆,否则先拆五楼,那么上面的楼层就会悬空。

删除的选项很简单,就是通过 -e 即可删除。不过,经常发生软件属性依赖导致无法删除某些软件的问题。如下例子

# 1. 找出与pam有关的软件名称,并尝试删除pam这个软件
[root@localhost ~]# rpm -qa |grep pam
pam-1.1.8-23.el7.x86_64
[root@localhost ~]# rpm -e pam
错误:依赖检测失败:
        libpam.so.0()(64bit) 被 (已安裝) libpwquality-1.2.3-5.el7.x86_64 需要
        libpam.so.0()(64bit) 被 (已安裝) libuser-0.60-9.el7.x86_64 需要
        libpam.so.0()(64bit) 被 (已安裝) util-linux-2.23.2-65.el7.x86_64 需要
        libpam.so.0()(64bit) 被 (已安裝) systemd-libs-219-78.el7.x86_64 需要
        libpam.so.0()(64bit) 被 (已安裝) systemd-219-78.el7.x86_64 需要
............
..........
.........
# 2. 若仅删除 pam-devel 这个之前安装的软件
[root@localhost ~]# rpm -e pam-devel   # 不会提示任何信息
[root@localhost ~]# rpm -q pam-devel
未安装软件包 pam-devel

从上面的例子中,我们可以知道pam是提供给很多其他软件使用的函数库,因此你不能轻易删除它,除非你也删除了所有依赖于它的软件。当然,你也可以使用–nodeps选项来强制删除它,但这样一来,所有依赖于pam函数库的软件都将无法正常运行。

有时,RPM文件的安装、删除、升级等操作可能会导致RPM数据库(存储软件包信息的地方)中的文件损坏。如果真的发生了这种情况,该怎么办呢?别担心,我们可以使用–rebuilddb选项来重建数据库。具体操作方法如下:

[root@localhost ~]#  rpm --rebuilddb   <== 重建数据库