侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux软件安装(8)之RPM软件管理程序:rpm

zze
zze
2019-10-28 / 0 评论 / 0 点赞 / 548 阅读 / 14315 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

RPM 的使用其实不难,只要使用 rpm 这个指令即可!最喜欢的就是 rpm 指令的查询功能了,可以让我很轻易的就知道某个系统有没有安装鸟哥要的软件呢!此外,我们最好还是得要知道一下,到底 RPM 类型的文件他们是将软件的相关文件放置在哪里呢?还有,我们说的那个 RPM 的数据库又是放置在哪里呢?

事实上,下一小节要讲的 yum 就可以直接用来进行安装的动作,基本上 rpm 这个指令真的就只剩下查询与检验的功能啰~所以,查询与检验还是要学的,至于安装,使用 yum 就好了!

RPM 默认的安装路径

一般来说,RPM 类型的文件在安装的时候,会先去读取文件内记载的设定参数内容,然后将该数据用来比对 Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。例如 Openssh 这个联机软件需要依赖 Openssl 这个加密软件,所以得先安装 openssl 才能装 openssh。那你的环境如果没有 openssl ,你就无法安装 openssh 的啦。
若环境检查合格了,那么 RPM 文件就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入 /var/lib/rpm/ 目录下的数据库文件中了。.上面这个目录内的数据很重要哦!因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库,而如果你想要查询系统已经安装的软件,也是从这里查询的!同时,目前的 RPM 也提供数字签名信息,这些数字签名也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了啊!
那么软件内的文件到底是放置到哪里去啊?当然与文件系统有关对吧!之前有谈过每个目录的意义,这里再次的强调下:

路径描述
/etc一些配置文件放置的目录,例如 /etc/crontab
/usr/bin一些可执行文件
/usr/lib一些程序使用的动态函式库
/usr/share/doc一些基本的软件使用手册与说明文件
/usr/share/man一些 man page 文件

好了,下面我们就来针对每个 RPM 的相关指令来进行说明啰~

RPM 安装(install)

因为安装软件是 root 的工作,因此你得要是 root 的身份才能够操作 rpm 这指令的。用 rpm 来安
装很简单啦!假设我要安装一个档名为 rpppoe-3.11-5.el7.x86_64.rpm 的文件,那么我可以这样(假
设原版光盘已经放在 /mnt 下了):

rpm -i /mnt/Packages/rpppoe-3.11-5.el7.x86_64.rpm

不过,这样的参数其实无法显示安装的进度,先看一下 rpm 一些常用选项:

  • -i:安装,install 的意思;
  • -v:显示安装时的详细信息;
  • -h:以安装信息列显示安装进度;

所以,通常我们会这样下达安装指令:

rpm -ivh /mnt/Packages/rpppoe-3.11-5.el7.x86_64.rpm

如果要一次安装多个 rpm 包,则多个 rpm 档名以空格隔开即可。还可直接由网络上面的某个文件安装,即以网址来安装,如:

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

另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题,而还是执意要安装这个软件时,可以使用如下的参数强制安装。
rpm 安装时常用的选项与参数说明:

选项含义
--nodeps使用时机:当发生软件属性相依问题而无法安装,但你执意安装时。危险性:软件会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不考虑软件的属性相依,则可 会造成该软件的无法正常使用!
--replacefiles使用时机:如果在安装的过程当中出现了 某个文件已经被安装在你的系统上面 的信息,又或许出现版本不合的讯息(confilcting files)时,可以使用这个参数来直接覆盖文件。危险性:覆盖的动作是无法复原的!所以,你必须要很清楚的知道被覆盖的文件是真的可以被覆盖哦!否则会欲哭无泪~
--replacepkgs使用时机:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm-ivh *.rpm,但若某些软件已经安装过了,此时系统会出现 某软件已安装 的信息,导致无法继续安装。此时可使用这个选项来重复安装哦~
--force使用时机:这个参数其实就是 --replacefiles--replacepkgs 的综合体。
--test使用时机:想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。例:rpm -ivh pkgname.i386.rpm --test
--justdb使用时机:由于 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来更新软件在数据库内的相关信息。
--nosignature使用时机:想要略过数字签名的检查时,可以使用这个选项。
--prefix path使用时机:要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin/etc 等目录,就可以使用 --prefix /usr/local 来处理了。
--noscripts使用时机:不想让该软件在安装过程中自行执行某些系统指令。说明:RPM 的优点除了可以将文件放置到定位之外,还可以自动执行一些前置作业的指令,例如数据库的初始化。如果你不想要让 RPM 帮你自动执行这一类型的指令,就加上他吧!

一般来说,rpm 的安装选项与参数大约就是这些了。通常建议直接使用 -ivh 就好了,如果安装的过程中发现问题,一个一个去将问题找出来,尽量不要使用暴力安装法,就是通过 --force 去强制安装!因为可能会发生很多不可预期的问题呢~除非你很清楚的知道使用上面的参数后安装的结果是你预期的!

RPM 升级与更新(upgrade/freshen)

使用 RPM 来升级真是太简单了!就以 -Uvh-Fvh 来升级即可,而 -Uvh-Fvh 可以用的选项与参数,跟 install 是一样的。不过,-U-F 的意义还是不太一样的,基本的差别是这样的:

  • -Uvh:后面接的软件即使没有安装过,则系统将予以直接安装;若后面接的软件有安装过旧版,则系统自动更新至新版;
  • -Fvh:如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有己安装至你 Linux 系统内的软件会被升级;

由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用 -Fvh 则是比较好的作法,因为没有安装的软件才不会被不小心安装进系统中。但是需要注意的是,如果你使用的是 -Fvh ,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会被安装在你的 Linux 主机上面,所以请重新以 -ivh 来安装吧~
早期没有 yum 的环境底下,同时网络带宽也很糟糕的状况下,通常有的朋友在进行整个操作系统的旧版软件修补时,喜欢这么进行:

  1. 先到各发展商的 errata 网站或者是国内的 FTP 映像站捉下来最新的 RPM 文件;
  2. 使用 -Fvh 来将你的系统内曾安装过的软件进行修补与升级!

所以,在不知道 yum 功能的情况下,你依旧可以到 CentOS 的镜像站点下载 updates 数据,然后利用上述的方法来一口气升级!当然啰, 升级也是可以利用 --nodeps/--force 等等的参数啦!不过,现在既然有 yum 的机制在,这个笨方法当然也就不再需要了~

RPM 查询(query)

RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件啦!另外,RPM 也可以查询未安装的 RPM 文件内的信息哦!那如何去查询呢?我们先来看看可用的选项有哪些?

rpm -qa
rpm -q[licdR] 已安装的软件名称
rpm -qf 存在于系统上的某个文件名
rpm -qp[licdR] 未安装的某个文件名

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

在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!查询主要分为两部分,一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 文件内容,等于是由 RPM 文件内找出-一些要写入数据库内的信息就是了,这部份就得要使用 -qpp 是 package 的意思)。那就来看看几个简单的示例吧!

【例 1】:找出你的 Linux 是否有安装 logrotate 这个软件?

[root@localhost test]# rpm -q logrotate
logrotate-3.8.6-17.el7.x86_64

可以看到,系统会去找是否有安装后面接的软件名称。注意,不必要加上版本哦!至于显示的结果,一看就知道有没有安装啦~

【例 2】:列出上题当中,属于该软件所提供的所有目录与文件。

[root@localhost test]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/rwtab.d/logrotate
...

可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。

【例 3】:列出 logrotate 这个软件的相关说明数据。

[root@localhost test]# rpm -qi logrotate
Name        : logrotate
Version     : 3.8.6
Release     : 17.el7
Architecture: x86_64
...

列出该软件的 information(信息),里面的信息可多着呢,包括了软件名称、版本、开发商、SRPM文件名、打包次数、简单说明信息、软件打包者、安装日期等等!如果想要详细的知道该软件的数据,可以用这个参数来了解。

【例 4】:分别仅找出 logrotate 的配置文件与说明档。

[root@localhost test]# rpm -qc logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/rwtab.d/logrotate
[root@localhost test]# 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

【例 5】:列出安装 logrotate 所必须依赖的软件。

[root@localhost test]# rpm -qR logrotate
/bin/sh
/bin/sh
config(logrotate) = 3.8.6-17.el7
coreutils >= 5.92
libacl.so.1()(64bit)
...

【例 6】:找出 /bin/sh 是那个软件提供的。

[root@localhost test]# rpm -qf /bin/sh
bash-4.2.46-31.el7.x86_64

这个参数后面接的可是文件哦!不像前面都是接软件,这个功能在查询系统的某个文件属于哪一个软件所有的。

【例 7】:假设下载了一个 RPM 文件,想要知道该文件的依赖文件,该如何?

rpm -qpR filename.i386.rpm

常见的查询就是这些了!要特别说明的是,在查询本机上面的 RPM 软件相关信息时,不需要加上版本的名称,只要加上软件名称即可,因为他会由 /var/lib/rpm 这个数据库里面去查询,所以我们可以不需要加上版本名称。但是查询某个 RPM 文件就不同了,我们必须要列出整个文件的完整档名才行~这一点朋友们常常会搞错。

【例 8】:显示出系统中以 c 开头的软件个数。

rpm -qa | grep ^c | wc -l

【例 9】:我的 WWW 服务器为 Apache ,我知道他使用的 RPM 软件文件名为 httpd。现在,我想要知道这个软件的所有配置文件放置在何处,怎么做?

rpm -qc httpd

【例 10】:承上题,如果查出来的配置文件案已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件, 该如何做?
假设该软件在网络上的网址为: http://website.name/path/httpd-x.x.xx.i386.rpm,则我可以这样做:

rpm -ivh http://website.name/path/httpd-x.x.xx.i386.rpm --replacepkgs

【例 11】:如果我误砍了某个重要文件,例如 /etc/crontab, 偏偏不晓得他属于哪一个软件,该怎么办?
虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接执行:

rpm -qf /etc/crontab

就可以知道是那个软件啰!重新安装一次该软件即可!

RPM 验证与数字签名(Verify/signature)

验证(Verify)的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是使用 /var/lib/rpm 下面的数据库内容来比对目前 Linux 系统的环境下的所有软件文件。也就是说,当你有数据不小心遗失,或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容,就用这个简单的方法来验证一下原本的文件系统吧!好让你了解这一阵子到底是修改到哪些文件数据了!
验证的方式很简单:

rpm -Va
rpm -V 已安装的软件名称
rpm -Vp 某个 RPM 文件的档名
rpm -Vf 在系统上面的某个文件

选项与参数:
    -V:后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
    -Va:列出目前系统上面所有可能被更动过的文件;
    -Vp:后面加的是文件名,列出该软件内可能被更动过的文件;
    -Vf:列出某个文件是否被更动过;

【例 1】:列出你的 Linux 内的l ogrotate 这个软件是否被更动过?

[root@localhost test]# rpm -V logrotate

如果没有出现任何讯息,恭喜你,该软件所提供的文件没有被更动过。如果有出现任何讯息,才是有出现状况啊!

【例 2】:查询一下你的 /etc/crontab 是否有被更动过?

[root@localhost test]# rpm -Vf /etc/crontab

好了,那么我怎么知道到底我的文件被更动过的内容是什么?例如上面的【例 2】。呵呵~简单的说明一下吧!例如,我们检查一下logrotate 这个软件:

[root@localhost test]# 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
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status

修改 /etc/logrotate.conf 内的 rotate5,执行下面命令:

[root@localhost test]# rpm -V logrotate
..5....T.  c /etc/logrotate.conf

你会发现在档名之前有个 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 代表的是 Configfile 的意思,也就是文件的类型,文件类型有底下这几类:

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

经过验证的功能,你就可以知道那个文件被更动过。那么如果该文件的变更是预期中的,那么就没有什么大问题,但是如果该文件是非预期的,那么是否被入侵了呢?此时就得注意注意啰~
一般来说,配置文件(configure) 被更动过是很正常的,万一你的 binary program 被更动过呢?那就得要特别特别小心啊!

数字签名(digital signature)

谈完了软件的验证后,不知道你有没有发现一个问题,那就是,验证只能验证软件内的信息与 /var/lib/rpm/ 里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的手段也无法确定该软件的正确性啊!那如何解决呢?在 Tarball 与文件的验证方面,我们可以使用前一章谈到的 md5 指纹码来检查,不过,连指纹码也可能会被窜改的嘛!那怎么搞?没关系,我们
可以通过数字签名来检验软件的来源的。
就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的签章系统,只是这个签章被数字化了而已。厂商可以数字签名系统产生一个专属于该软件的签章,并将该签章的公钥(public key)释出。当你要安装一个 RPM 文件时:

  1. 首先你必须要先安装原厂释出的公钥文件;
  2. 实际安装原厂的 RPM 软件时,rpm 指令会去读取 RPM 文件的签章信息,与本机系统内的签章信息比对;
  3. 若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装喔;

我们 CentOS 使用的数字签名系统为 GNU 计划的 GnuPG (GNU Privacy Guard, GPG)。GPG 可以透过哈希运算,算出独一无二的专属密钥系统或者是数字签名系统,这里我们仅简单的说明数字签名在 RPM 文件上的应用而已。而根据上面的说明,我们也会知道首先必须要安装原厂释出的 GPG 数字签名的公钥文件啊!CentOS 的数字签名位于:

[root@localhost test]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 
-rw-r--r--. 1 root root 1690 11月 23 2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost test]# 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
...

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

[root@localhost test]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

由于不同版本 GPG 密钥文件放置的位置可能不同,不过档名大多是以 GPG-KEY 来说明的,因此你可以简单的使用 locatefind 来找寻,如以下的方式来搜寻即可:

locate GPG-KEY
find /etc -name '*GPG-KEY*'

那安装完成之后,这个密钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的!那我们先列出密钥软件名称后,再以 -qi 的方式来查询看看该软件的信息:

[root@localhost test]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
[root@localhost test]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name        : gpg-pubkey
Version     : f4a80eb5
Release     : 53a7ff4b
Architecture: (none)
...

重点就是最后面出现的那一串乱码啦!那可是作为数字签名非常重要的一环呢!如果你忘记加上数字签名,很可能很多原版软件就不能让你安装啰,除非你使用 rpm 时选择略过数字签名的选项。

首先要知道,由私钥加密出来的指纹只能由对应的公钥解密,同样,由公钥加密出来的指纹只能由对应私钥进行解密,下面大致看下 GPG-KEY 验证流程:

  1. 发布者发布前先计算出 rpm 包的特征码,然后使用私钥加密特征码生成指纹,并生成该指纹对应的公钥;
  2. 在 rpm 包尾部附加上生成的指纹并发布,并公布对应公钥;
  3. 客户端使用公钥解密 rpm 包指纹得到特征码,如果解密失败,则说明软件被篡改了;
  4. 如果解密得到了特征码,但是特征码与此时 rpm 包计算出来的特征码不相同,也说明软件被篡改了;

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

反安装就是将软件卸载啦!要注意的是,解安装的过程一定要由最上层往下解除,以 rp-pppoe 为例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明,如果你要拆除五、六楼,那么当然要由六楼拆起,否则先拆的是第五楼时,那么上面的楼层难道会悬空?
移除的选项很简单,就通过 -e 即可移除。不过,很常发生软件属性相依导致无法移除某些软件的问题!我们以下面的例子来说明:
例:找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:

[root@localhost test]# rpm -qa | grep pam
pam-1.1.8-22.el7.x86_64
[root@localhost test]# rpm -e pam
错误:依赖检测失败:
	libpam.so.0()(64bit) 被 (已安裝) libpwquality-1.2.3-5.el7.x86_64 需要
...

从上面示例我们知道 pam 所提供的函式库是让非常多其他软件使用的,因此你不能移除 pam,除非将其他相依软件一口气也全部移除!你当然也能加 --nodeps 来强制移除,不过,如此一来所有会用到 pam 函式库的软件,都将成为无法运作的程序,我想,你的主机也只好准备停机休假了吧!
由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的文件破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一下数据库喔!做法如下:

rpm --rebuilddb
0

评论区