22.2 RPM 软件管理程序: rpm
22.2.1 RPM 默认安装的路径
22.2.2 RPM 安装 (install)
22.2.3 RPM 升级与更新 (upgrade/freshen)
22.2.4 RPM 查询 (query)
22.2.5 RPM 验证与数字签名 (Verify/signature)
22.2.6 RPM 反安装与重建数据库 (erase/rebuilddb)
RPM:RedHat Package Manager,是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。
特点:将要安装的软件先编译, 并打包成 RPM 机制的程序包,通过程序包里默认的数据库记录, 记录这个软件要安装的时候必须具备的相依属性软件,当安装在你的 Linux 主机时,RPM 会先依照软件里头的数据查询 Linux主机的相依属性软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装
优点:
由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);
由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与卸载
RPM软件管理机制的问题是:
软件档案安装的环境必须与打包时的环境需求一致或相当;
需要满足软件的相依属性需求;
卸载时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!
1.4 RPM 的优点
由于 RPM 是透过预先编译并打包成为 RPM 文件格式后,再加以安装的一种方式,并且还能够进行数据库的记载。 所以 RPM 有以下的优点:
RPM 内含已经编译过的程序与配置文件等数据,可以让用户免除重新编译的困扰;
RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免档案被错误安装;
RPM 档案本身提供软件版本信息、相依属性软件名称、软件用途说明、软件所含档案等信息,便于了解软件;
RPM 管理的方式使用数据库记录 RPM 档案的相关参数,便于升级、移除、查询与验证。
为什么 RPM 在使用上很方便呢?我们前面提过, RPM 这个软件管理员所处理的软件,是由软件提供者在特定的 Linux 作业平台上面将该软件编译完成并且打包好。那使用者只要拿到这个打包好的软件, 然后将里头的档案放置到应该要摆放的目录,不就完成安装啰?对啦!就是这样!
但是有没有想过,我们在前一章里面提过的,有些软件是有相关性的,例如要安装网卡驱动程序,就得要有 kernel source 与 gcc 及 make 等软件。那么我们的 RPM 软件是否一定可以安装完成呢?如果该软件安装之后,却找不到他相关的前驱软件, 那不是挺麻烦的吗?因为安装好的软件也无法使用啊!
为了解决这种具有相关性的软件之间的问题 (就是所谓的软件相依属性),RPM 就在提供打包的软件时,同时加入一些讯息登录的功能,这些讯息包括软件的版本、 打包软件者、相依属性的其他软件、本软件的功能说明、本软件的所有档案记录等等,然后在 Linux 系统上面亦建立一个 RPM 软件数据库,如此一来,当你要安装某个以 RPM 型态提供的软件时,在安装的过程中, RPM 会去检验一下数据库里面是否已经存在相关的软件了, 如果数据库显示不存在,那么这个 RPM 档案『预设』就不能安装。呵呵!没有错,这个就是 RPM 类型的档案最为人所诟病的『软件的属性相依』问题啦!
2.1 RPM 默认安装的路径 -- /var/lib/rpm/
一般来说,RPM包在安装的时候,会先去读取包记载的设定参数内容,然后将该数据用来比对 Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。安装完毕后,该软件相关的信息就会被写入 /var/lib/rpm/ 目录下的数据库档案中了。因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库, 而如果你想要查询系统已经安装的软件,也是从这里查询的!同时,目前的 RPM 也提供数字签名信息, 这些数字签名也是在这个目录内记录的呢
软件配置文件位置:
/etc 一些配置文件放置的目录,例如 /etc/crontab
/usr/bin 一些可执行文件案
/usr/lib 一些程序使用的动态函式库
/usr/share/doc 一些基本的软件使用手册与说明文件
/usr/share/man 一些 man page 档案
2.2 RPM 安装 (install) (root)
-i :install 的意思
-v :察看更细部的安装信息画面
-h :以安装信息列显示安装进度
例、一口气安装两个以上的软件时:
# rpm -ivh a.i386.rpm b.i386.rpm *.rpm# 后面直接接上许多的软件档案!
例三、直接由网络上面的某个档案安装,以网址来安装:
# rpm -ivh http://website.name/path/pkgname.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 帮你自动执行这一类型的指令,就加上他吧!
2.3 RPM 升级与更新 (upgrade/freshen)
-Uvh 后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动更新至新版;
-Fvh 如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』!大量的升级系统旧版本的软件时
2.4 RPM 查询 (query) -- /var/lib/rpm/
查询已安装软件的信息:
-q :仅查询,后面接的软件名称是否有安装;
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
-qi :列出该软件的详细信息 (information),包含开发商、版本与说明等;
-ql :列出该软件所有的档案与目录所在完整文件名 (list);
-qc :列出该软件的所有配置文件 (找出在 /etc/ 底下的檔名而已)
-qd :列出该软件的所有说明文件 (找出与 man 有关的档案而已)
-qR :列出与该软件有关的相依软件所含的档案 (Required 的意思)
-qf :由后面接存在于系统上面的某个文件名,找出该档案属于哪一个已安装的软件;
-q --scripts:列出是否含有安装后需要执行的脚本档,可用以 debug 喔!
查询未安装的软件信息
-qp[icdlR]:注意 -qp 与-q 选项相同
在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!
查询主要分为两部分, 一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 档案内容, 等于是由 RPM 档案内找出一些要写入数据库内的信息就是了,这部份就得要使用 -qp (p 是 package 的意思)。
那就来看看几个简单的范例吧!
范例二:列出上题当中,属于该软件所提供的所有目录与档案:
[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
Vendor : CentOS
URL : https://fedorahosted.org/logrotate/
Summary : Rotates, compresses, removes and mails system log files
Description : # 这个是详细的描述!
Install the logrotate package if you need a utility to deal with the
log files on your system.
# 列出该软件的 information (信息),里面的信息可多着呢,包括了软件名称、
# 版本、开发商、SRPM文件名、打包次数、简单说明信息、软件打包者、
# 安装日期等等!如果想要详细的知道该软件的数据,用这个参数来了解一下
范例五:若要成功安装 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 档案就不同了,我们必须要列出整个档案的完整档名才行~ 这一点朋友们常常会搞错。底下我们就来做几个简单的练习吧!
2.5 RPM 验证与数字签名 (Verify/signature)
验证 (Verify) 的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件档案 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的档案,或者是不小心不知道修改到某一个软件的档案内容, 就用这个简单的方法来验证一下原本的文件系统吧!好让你了解这一阵子到底是修改到哪些档案数据了!
验证的方式很简单:
# rpm -Va
# rpm -V 已安装的软件名称
# rpm -Vp 某个 RPM 档案的档名
# 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
# 瞧!因为有被更动过,所以会列出被更动过的信息类型!
好了,那么我怎么知道到底我的档案被更动过的内容是什么?例如上面的范例二。呵呵!简单的说明一下吧!
例如,我们检查一下 logrotate 这个软件:
[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
# 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)
经过验证的功能,你就可以知道那个档案被更动过。那么如果该档案的变更是『预期中的』, 那么就没有什么大问题,但是如果该档案是『非预期的』,那么是否被入侵了呢?呵呵!得注意注意啰! 一般来说,配置文件 (configure) 被更动过是很正常的,万一你的 binary program 被更动过呢? 那就得要特别特别小心啊!
Tips
鸟哥的图示 虽说家丑不可外扬,不过有件事情还是跟大家分享一下的好。鸟哥之前的主机曾经由于安装一套软件,导致被攻击成为跳板。 会发现的原因是系统中只要出现 *.patch 的扩展名时,使用 ls -l 就是显示不出来该文件名 (该档名确实存在)。 找了好久,用了好多工具都找不出问题,最终利用 rpm -Va 找出来,原来好多 binary program 被更动过,连 init 都被恶搞!此时,赶紧重新安装 Linux 并移除那套软件,之后就比较正常了。所以说,这个 rpm -Va 是个好功能喔!
数字签名 (digital signature)
软件开发商原厂所推出的软件也会有一个厂商自己的签章系统! 只是这个签章被数字化了而已。厂商可以数字签名系统产生一个专属于该软件的签章,并将该签章的公钥 (public key) 释出。
当你要安装一个 RPM 档案时:
首先你必须要先安装原厂释出的公钥档案;
实际安装原厂的 RPM 软件时, rpm 指令会去读取 RPM 档案的签章信息,与本机系统内的签章信息比对,
若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装喔。
我们 CentOS 使用的数字签名系统为 GNU 计划的 GnuPG (GNU Privacy Guard, GPG) GPG 可以透过哈希运算,算出独一无二的专属密钥系统或者是数字签名系统,有兴趣的朋友可以参考文末的延伸阅读, 去了解一下 GPG 加密的机制喔!这里我们仅简单的说明数字签名在 RPM 档案上的应用而已。 而根据上面的说明,我们也会知道首先必须要安装原厂释出的 GPG 数字签名的公钥档案啊!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)
Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) )
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.1 (NSS-3)
....(底下省略)....
重点就是最后面出现的那一串乱码啦!那可是作为数字签名非常重要的一环哩! 如果你忘记加上数字签名,很可能很多原版软件就不能让你安装啰~除非你利用 rpm 时选择略过数字签名的选项。
2.6 RPM 卸载与重建数据库 (erase/rebuilddb)
移除的选项 -e 即可移除,经常发生软件依赖性导致无法移除某些软件的问题
由于 RPM 档案常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的档案破损。
# rpm --rebuilddb <==重建数据库