zz linux下软件安装之RPM和SRPM

摘自 《鸟哥的LINUX私房菜》



我们这里使用的是 CentOS 系统嘛!所以说:使用的软件管理机制为 RPM 机制,而用来作为在线升级的方式则为 yum !

RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!扩展名是以 ***.rpm 这种格式。顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的。 RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。他最大的特点就是将你要安装的软件先编译过, 打包成为 RPM 机制的包装档案,透过包装好的软件里头的数据库记录, 记录这个软件要安装的时候必须具备的相依属性软件,当安装在你的 Linux 主机时, RPM 会先依照软件里头的数据查询 Linux 主机的相依属性软件是否满足, 若满足则予以安装,若不满足则不予安装。通常不同的 distribution 所释出的 RPM 档案,并不能用在其他的 distributions 上。

SRPM 是 Source RPM 的意思,也就是这个 RPM 档案里面含有原始码!特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』, 他提供的是原始码喔!通常 SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原始码, 但是他仍然含有该软件所需要的相依性软件说明、以及所有 RPM 档案所提供的数据。同时,他与 RPM 不同的是,他也提供了参数配置文件 (就是 configure 与 makefile)。所以,如果我们下载的是 SRPM ,那举要安装该软件时,你就必须要
 先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 档案;
 然后将编译完成的 RPM 档案安装到 Linux 系统当中
RPM 档案必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以透过修改 SRPM 内的参数配置文件,然后重新编译产生能适合我们 Linux 环境的 RPM 档案,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!

例如 rp-pppoe-3.1-5.i386.rpm 这的档案的意思为:

由亍 RPM 是透过预先编译并打包成为 RPM 文件格式后,再加以安装的一种方式,并还能够进行数据库的记载。 所以 RPM 有以下的优点:
 RPM 内含已经编译过的程序不配置文件等数据,可以让用户免除重新编译的困扰;
 RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避克档案被错误安装;
 RPM 档案本身提供软件版本信息、相依属性软件名称、软件用途说明、软件所含档案等信息,便于了解软件;
 RPM 管理的方式使用数据库记录 RPM 档案的相关参数,便于升级、移除、查询不验证。

为了解决这种具有相关性的软件之间的问题 (就是所谓的软件相依属性),RPM 就在提供打包的软件时,同时加入一些讯息登录的功能,这些讯息包括软件的版本、 打包软件者、相依属性的其他软件、本软件的功能说明、本软件的所有档案记录等等,然后在 Linux 系统上面亦建立一个 RPM 软件数据库,如此一来,当你要安装某个以 RPM 型态提供的软件时,在安装的过程中, RPM 会去检验一下数据库里面是否已经存在相关的软件了, 如果数据库显示不存在,那举这个 RPM 档案『预设』就不能安装。

CentOS 先将释出的软件放置到 YUM 朋务器内,然后分析这些软件的相依属性问题,将软件内的记录信息写下来 (header)。 然后再将这些信息分析后记录成软件相关性的列表列表。这些列表数据不软件所在的位置可以称呼为容器 (repository)。 当客户端有软件安装的需求时,客户端主机会主动的向网络上面的 yum 服务器的容器网址下载清单列表, 然后透过列表列表的数据与本机 RPM 数据库已存在的软件数据相比较,就能够一口气安装所有需要的具有相依属性的软件了。

当客户端有升级、安装的需求时, yum 会向容器要求清单的更新,等到清单更新到本机的 /var/cache/yum 里面后, 等一下更新时就会用这个本机清单与本机的 RPM 数据库进行比较,这样就知道该下载什么软件。接下来 yum 会跑到容器服务器 (yum server) 下载所需要的软件,然后再透过 RPM 的机制开始安装软件啦!这就是整个流程!

若环境检查合格了,那举 RPM 档案就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入 /var/lib/rpm/ 目录下的数据库档案中了。 上面这个目录内的数据徆重要喔!因为未来如果我们有仸何软件升级的需求,版本之间的比较就是来自于这个数据库, 而如果妳想要查询系统已经安装的软件,也是仍这里查询的!同时,目前的 RPM 也提供数字签名信息, 这些数字签名也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了啊!

因为安装软件是 root 的工作,因此妳得要是 root 的身份才能够操作 rpm 这命令的。假设我要安装一个档名为 rp-pppoe-3.5-32.1.i386.rpm 的档案,那我可以这样:[root@www ~]# rpm -ivh rp-pppoe-3.5-32.1.i386.rpm
-i, --install                         install package(s)
-v, --verbose                        provide more detailed output
-h, --hash                            以安装信息列显示安装进度print hash marks as package installs (good with -v)
另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题, 而还是『执意』要安装这个软件时,可以使用如下的参数『强制』安装上去:

例题: 在没有网络的前提下,妳想要安装一个名为 pam-devel 的软件,妳手边只有原版光盘,该如何是好? 答: 妳可以透过挂载原版光盘来进行数据的查询不安装。请将原版光盘放入光驱,底下我们尝试将光盘挂载到 /media 当中, 以处理软件的下载啰:
 挂载光盘,使用: mount /dev/cdrom /media
 找出档案的实际路径:find /media -name 'pam-devel*'
 测试此软件是否具有相依性: rpm -ivh pam-devel... --test
 直接安装: rpm -ivh pam-devel...
 卸除光盘: umount /dev/cdrom

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

RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库档案啦!另外, RPM 也可以查询未安装的 RPM 档案内的信息喔!
[root@www ~]# rpm -qa <==已安装软件
[root@www ~]# rpm -q[licdR] 已安装的软件名称 <==已安装软件
[root@www ~]# rpm -qf 存在于系统上面的某个文件名 <==已安装软件
[root@www ~]# rpm -qp[licdR] 未安装的某个文件名 <==查阅RPM档案

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

RPM 验证与数字签名 (Verify/signature)
验证 (Verify) 的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件档案 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的档案,或者是不小心不知道修改到某一个软件的档案内容, 就用这个简单的方法来验证一下原本的文件系统吧!好让你了解这一阵子到底是修改到哪些档案数据了!
[root@www ~]# rpm -Va
[root@www ~]# rpm -V 已安装的软件名称
[root@www ~]# rpm -Vp 某个 RPM 档案的档名
[root@www ~]# rpm -Vf 在系统上面的某个档案

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

[root@www ~]# rpm -V logrotate
..5....T c /etc/logrotate.conf
那个 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) 档案的建立时间已被改变
文件类型有底下这几类:
 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. 若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并停止安装喔。
该数字签名码其实仅是一个随机数而已,这个随机数对于数字签名有意义而已,这个档案如何安装呢?透过底下的方式来安装即可喔!
[root@www ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
由于不同版本 GPG 密钥档案放置的位置可能不同,不过档名大多是以 GPG-KEY 来说明的, 因此你可以简单的使用 locate 或 find 来找寻:
[root@www ~]# locate GPG-KEY
[root@www ~]# find /etc -name '*GPG-KEY*'
那安装完成后,这个密钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的! 那我们先列出密钥软件名称后,再以 -qi 的方式来查询看看该软件的信息为何:
[root@www ~]# rpm -qa | grep pubkey
gpg-pubkey-e8562897-459f07a4
[root@www ~]# rpm -qi gpg-pubkey-e8562897-459f07a4

RPM 反安装与重建数据库 (erase/rebuilddb)
反安装就是将软件卸载啦!要注意的是,『解安装的过程一定要由最上层往下解除』,以 rp-pppoe 为例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!移除的选项简单,就透过 -e 即可移除。不过,经常发生软件属性相依导致无法移除某些软件的问题!
由亍 RPM 档案常常会安装/移除/升级等,某些劢作戒许可能会导致 RPM 数据库 /var/lib/rpm/ 内的档案破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一下数据库喔!

 

SRPM 的使用 : rpmbuild
假设我下载了一个 SRPM 的档案,又不想要修订这个档案内的原始码与相关的设定值, 那我可以直接编译并安装吗?当然可以!利用 rpmbuild 配合选项即可。

SRPM 使用的路径

配置文件的主要内容 (*.spec)
[root@www ~]# rpm -i rp-pppoe-3.5-32.1.src.rpm
[root@www ~]# find /usr/src/redhat/ -type f
/usr/src/redhat/SOURCES/rp-pppoe-3.5-firewall.patch <==补丁档
/usr/src/redhat/SOURCES/adsl-stop <==CentOS 提供的脚本
/usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz <==原始码啦!
/usr/src/redhat/SOURCES/rp-pppoe-3.5-buildroot.patch <==补丁档
/usr/src/redhat/SOURCES/adsl-start <==CentOS 提供的脚本
/usr/src/redhat/SOURCES/adsl-connect
/usr/src/redhat/SOURCES/adsl-setup
/usr/src/redhat/SOURCES/adsl-status
/usr/src/redhat/SOURCES/rp-pppoe-3.4-redhat.patch <==补丁档
/usr/src/redhat/SPECS/rp-pppoe.spec <==重要配置文件! 

[root@www ~]# cd /usr/src/redhat/SPECS
[root@www SPECS]# vi rp-pppoe.spec


 %description:
将你的软件做一个简短的说明!这个也是必需要的。还记得使用『 rpm -qi 软件名称 』会出现一些基础的说明吗? 上面这些东西包拪 Description 就是在显示这些重要信息的啦!所以,这里记得要详加解释喔!
 %prep:
pre 这个关键词原本就有『在...之前』的意思,因此这个项目在这里指的就是『尚未进行设定或安装之前,你要编译完成的 RPM 帮你事先做的事情』,就是 prepare 的简写啰!那举他的工作事项主要有:
1. 进行软件的补丁 (patch) 等相关工作;
2. 寻找软件所需要的目录是否已经存在?确认用的!
3. 事先建立你的软件所需要的目录,或者事先需要进行的任务;
4. 如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的档案时,那举就必需要进行备份(backup)的工作了!
在本案例中,你会发现程序会使用 patch 去进行补丁的动作啦!
 %setup:
这个项目就是在进行类似解压缩之类的工作!这个项目一定要写喔!不然你的 tarball 原始码是无法被解压缩的哩!切记切记!
 %build:
build 就是建立啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程序啰! 你会发现在此部分的程序代码方面,就是 ./configure, make 等项目哩!
 %install:
编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思啰!
 %clean:
编译不安装完毕后,必须要将一些暂存在 BuildRoot 内的数据删除才好, 因此这个时候这个 clean 的项目就重要啦!这有点像是 make clean 的感觉~保持系统的干爽嘛!
 %files:
这个软件安装的档案都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^ !此外,你也可以指定每个档案的类型,包括文件档 (%doc 后面接的) 不配置文件 (%config 后面接的) 等等。
 %changelog:
这个项目主要则是在记录这个软件曾经的更新记录啰!星号 (*) 后面应该要以时间,修改者, email 不软件版本来作为说明, 减号 (-) 后面则是你要作的详绅说明啰!

SRPM 的编译指令 (-ba/-bb)
[root@www ~]# rpmbuild -ba rp-pppoe.spec <==编译并同时产生 RPM 与 SRPM 档案
[root@www ~]# rpmbuild -bb rp-pppoe.spec <==仅编译成 RPM 档案

 

 

posted @ 2013-04-12 12:48  sillypudding  阅读(342)  评论(0编辑  收藏  举报