Linux学习-RPM 软件管理程序: rpm

时间:2024-12-15 15:06:01

RPM 默认安装的路径

一般来说,RPM 类型的文件在安装的时候,会先去读取文件内记载的设定参数内容,然后将该数据用来比对 Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。

若环境检查合格了,那么 RPM 文件就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关 的信息就会被写入 /var/lib/rpm/ 目录下的数据库文件中了。

RPM 安装 (install)

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

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

不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样下达安装指令:

[root@study ~]# rpm -ivh package_name
-i :install 的意思
-v :察看更细部的安装信息画面
-h :以安装信息列显示安装进度 范例一:安装原版光盘上的 rp-pppoe 软件
[root@study ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:rp-pppoe-3.11-5.el7 ################################# [100%] 范例二、一口气安装两个以上的软件时:
[root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
# 后面直接接上许多的软件文件! 范例三、直接由网络上面的某个文件安装,以网址来安装:
[root@study ~]# 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 新路径 使用时机:要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 --prefix /usr/local 』来处理了。
--noscripts 使用时机:不想让该软件在安装过程中自行执行某些系统指令。
说明:RPM 的优点除了可以将文件放置到定位之外,还可以自动执行一些前置作业的指令, 例如数据库的初始化。 如果你不想要让 RPM 帮你自动执行这一类型的指令,就加上他吧!

RPM 升级与更新 (upgrade/freshen)

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

|--|--|

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

|-Fvh|如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统 内的软件会被『升级』!|

RPM 查询 (query)

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

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

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

范例一:找出你的 Linux 是否有安装 logrotate 这个软件?
[root@study ~]# rpm -q logrotate
logrotate-3.8.6-4.el7.x86_64
[root@study ~]# rpm -q logrotating
package logrotating is not installed
# 注意到,系统会去找是否有安装后面接的软件名称。注意,不必要加上版本喔!
# 至于显示的结果,一看就知道有没有安装啦! 范例二:列出上题当中,属于该软件所提供的所有目录与文件:
[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
....(以下省略)....
# 可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。 范例三:列出 logrotate 这个软件的相关说明数据:
[root@study ~]# rpm -qi logrotate
Name : logrotate # 软件名称
Version : 3.8.6 # 软件的版本
Release : 4.el7 # 释出的版本
Architecture: x86_64 # 编译时所针对的硬件等级
Install Date: Mon 04 May 2015 05:52:36 PM CST # 这个软件安装到本系统的时间
Group : System Environment/Base # 软件是放在那一个软件群组中
Size : 102451 # 软件的大小
License : GPL+ # 释出的授权方式
Signature : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : logrotate-3.8.6-4.el7.src.rpm # 这就是 SRPM 的檔名
Build Date : Tue 10 Jun 2014 05:58:02 AM CST # 软件编译打包的时间
Build Host : worker1.bsys.centos.org # 在哪一部主机上面编译的
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : https://fedorahosted.org/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.
# 列出该软件的 information (信息),里面的信息可多着呢,包括了软件名称、
# 版本、开发商、SRPM 文件名、打包次数、简单说明信息、软件打包者、
# 安装日期等等!如果想要详细的知道该软件的数据,用这个参数来了解一下 范例四:分别仅找出 logrotate 的配置文件与说明档
[root@study ~]# rpm -qc logrotate
[root@study ~]# rpm -qd logrotate 范例五:若要成功安装 logrotate ,他还需要什么文件的帮忙?
[root@study ~]# rpm -qR logrotate
/bin/sh
config(logrotate) = 3.8.6-4.el7
coreutils >= 5.92
....(以下省略)....
# 由这里看起来,呵呵~还需要很多文件的支持才行喔! 范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的?
[root@study ~]# rpm -qf /bin/sh
bash-4.2.46-12.el7.x86_64
# 这个参数后面接的可是『文件』吶!不像前面都是接软件喔!
# 这个功能在查询系统的某个文件属于哪一个软件所有的。 范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何?
[root@study ~]# rpm -qpR filename.i386.rpm
# 加上 -qpR ,找出该文件需求的数据!

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

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

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

[root@study ~]# rpm -Va
[root@study ~]# rpm -V 已安装的软件名称
[root@study ~]# rpm -Vp 某个 RPM 文件的档名
[root@study ~]# rpm -Vf 在系统上面的某个文件
选项与参数:
-V :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
-Va :列出目前系统上面所有可能被更动过的文件;
-Vp :后面加的是文件名,列出该软件内可能被更动过的文件;
-Vf :列出某个文件是否被更动过~ 范例一:列出你的 Linux 内的 logrotate 这个软件是否被更动过?
[root@study ~]# rpm -V logrotate
# 如果没有出现任何讯息,恭喜你,该软件所提供的文件没有被更动过。
# 如果有出现任何讯息,才是有出现状况啊! 范例二:查询一下,你的 /etc/crontab 是否有被更动过?
[root@study ~]# rpm -Vf /etc/crontab
.......T. c /etc/crontab
# 瞧!因为有被更动过,所以会列出被更动过的信息类型!
[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/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.status
# 呵呵!共有 10 个文件啊!请修改 /etc/logrotate.conf 内的 rotate 变成 5 [root@study ~]# 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 代表的是『 Config file 』的意思,也就是文件的类型,文件类型有底下这几类:

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

  • 数字签名 (digital signature)

验证只能验证软件内的信息与 /var/lib/rpm/ 里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的 手段也无法确定该软件的正确性。在 Tarball 与文件的验证方面,我们可以使用 前一章谈到的 md5 指纹码来检查, 不过,连指纹码也可能会被窜改的嘛!那怎办?没关系,我们 可以透过数字签名来检验软件的来源的!

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

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

CentOS 的数字签名位于:

[root@study ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1690 Apr 1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@study ~]# 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
....(中间省略)....
-----END PGP PUBLIC KEY BLOCK-----

那么这个文件如何安装呢?透过底下的方式来安装即可喔!

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

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

[root@study ~]# locate GPG-KEY
[root@study ~]# find /etc -name '*GPG-KEY*'

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


[root@study ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
[root@study ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name : gpg-pubkey
Version : f4a80eb5
Release : 53a7ff4b
Architecture: (none)
Install Date: Fri 04 Sep 2015 11:30:46 AM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Mon 23 Jun 2014 06:19:55 PM CST
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.1 (NSS-3)
....(以下省略)...

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

反安装就是将软件卸载啦!要注意的是,『解安装的过程一定要由最上层往下解除』,以 rp-pppoe 为 例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!

移除的选项很简单,就透过 -e 即可移除。不过,很常发生软件属性相依导致无法移除某些软件的问 题! 我们以底下的例子来说明:

# 1. 找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:
[root@study ~]# rpm -qa | grep pam
fprintd-pam-0.5.0-4.0.el7_0.x86_64
pam-1.1.8-12.el7.x86_64
gnome-keyring-pam-3.8.2-10.el7.x86_64
pam-devel-1.1.8-12.el7.x86_64
pam_krb5-2.4.8-4.el7.x86_64
[root@study ~]# rpm -e pam
error: Failed dependencies: <==這裡提到的是相依性的問題
libpam.so.0()(64bit) is needed by (installed) systemd-libs-208-20.el7.x86_64
libpam.so.0()(64bit) is needed by (installed) libpwquality-1.2.3-4.el7.x86_64
....(以下省略).... # 2. 若仅移除 pam-devel 这个之前范例安装上的软件呢?
[root@study ~]# rpm -e pam-devel <==不会出现任何讯息!
[root@study ~]# rpm -q pam-devel
package pam-devel is not installed

由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的 文件破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一 下数据库喔! 作法如下:

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