开场白
1、软件的安装卸载是很平常的事情,但是在linux上面却也这么的不简单。Linux的其中一个哲学思想就是 一个程序只做一件事,并且做好。 组合小程序来完成复杂任务。这样做有很多好处。但世界上的东西总是两面的,有得必有失。各个小程序之间往往会存在着复杂的依赖关系。
2、再往前走一步。软件最初的安装方式只有一种,那就是源代码编译安装,这种方式安装的软件更贴近本机的系统运行环境,但也更复杂。不仅要解决软件之间的依赖关系(所依赖的软件还要再编译安装),还要配置开发编译环境(可能会抓狂的),一切都完成了以后还要指定各种的编译参数,而且编译所耗费的时间也比较长。在问题出现的时候,总是有些人或组织来为我们解决问题。所以这时就有了包管理器,如redhat系的rpm,debian系的dpt,dpkg。
3、包管理器为我们解决了编译的问题,使用起来非常的快捷。但就像我们第一段所说的,依赖关系还是存在的,虽然简单了很多,但还是会发生几个小时过去还没有安装上软件的情况发生。那么包管理器的前端工具就又出现了,它会为我们自动解决依赖关系,从此安装软件变的简单多了。
4、虽说前端工具貌似可以解决所有问题,但在我们使用系统的过程中,它也是有局限性的。源代码安装也是很常用到的,但前端工具可以很简单的解决开发环境和依赖关系的问题。
目录:
一、rpm包管理器
1、程序包简介。
2、rpm包管理器。
3、rpm命令的使用。
二、yum使用
三、源代码安装软件
实验环境:
系统:CentOS_7.1
rpm版本:RPM version 4.11.1
yum版本:3.4.3
一、rpm包管理器。
1、程序包简介。
rpm 是redhat的软件包管理器。全称为:redhat package manager。成为工业标准以后的全称为:rpm is package manager。它的软件包后缀也为.rpm。
debian 的软件包管理工具为dpt,dpkg, 软件包后缀为.deb。
S.u.S.E的软件包管理器也是使用的redhat的rpm。只不过因为打包路径的不同,所以并不通用。
程序包管理器分为两个部分:包管理工具和打包的文件。管理工具后面再说,我们先来看一下程序包所包含的东西:
编译好的二进制程序文件。
配置文件。
帮助文档。
编译好的二进制库文件。
程序包还有一种拆包的概念:
源代码安装时可以指定功能,但程序包都是别人或组织以大众需求进行编译而成的,为了避免安装一堆用不到的功能,所以常常是不同功能的文件打包在不同的包内。以主包为基准包含主要的功能,后面就是各种不同的支包(开发包,库包,工具包等等)。
如以bind为例:
bind 主包;bind-devel 开发包;bind-libs 库包;bind-utils 工具包。
rpm包命名方式:
源代码: name-version.tar.{gz|bz2|xz} 注意是源代码包的命名方式。
VERSION: major.minor,release
major主版本 重大的版本分支
minor 次版本 其中的一个功能有了重大变化,而不是所有的变化
release 发行号。 修正了某个BUG,修正了某一段代码。
RPM格式:
name-VERSION-relese.arch.rpm
version: 这是源代码的版本。就是上面的majob,minor,release。
release.arch:打包版本号。rpm的发行号。
arch(archetecture)是硬件架构或系统的平台类型。
如: bash-4.3.2-2.e16.x86_64.rpm
4.3.2是程序版本号 ,2.el6是release(2是rpm的打包版本,el6是软件平台),后面的x86_64是硬件平台。
硬件架构平台常用到的。
x86_64
i386, i586, i686, 都是x86系列的,新点或旧点。一般都彼此兼容。
ppc
noarch 代表通用硬件平台,如解释型语言写的程序。
获取程序包的途径:
(1) 系统发行版的光盘或官方的文件服务器(或镜像站点):
http://mirrors.aliyun.com,
http://mirrors.sohu.com,
http://mirrors.163.com
(2) 项目的官方站点
(3) 第三方组织:
(a) EPEL
(b) 搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
(4) 自已动手制作。
来源合法性验正:
不能随意安装来路不明的软件包。 源码包也一样。
源程序: 通过md5或sha1校验码验证;
rpm包: 发行商提供的合法性一定要是可信的
验正包完整性: 校验码
验正来源合法: 公钥验证来源是正确的。
一定要找合法的来源渠道, 不要在google上随便找一个就用。
验正方法,我们下面会说到。
2、程序包管理器
功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;
1、程序包的组成清单(每个程序包都单独实现);
文件清单
安装或卸载时运行的脚本
2、数据库(公共)
程序包的名称和版本;
依赖关系;
功能说明;
安装生成的各文件的文件路径及校验码信息;
等等等
包管理基本功能:打包、安装、查询、升级、卸载、校验、数据库管理
rpm的所有管理功能都是建立在数据库上面的,所以rpm数据库是非常重要的。 如果不小心给弄没了,可以找台软件包安装相近的机器,复制一份。rpm自带的生成数据库的命令不一定有用。
Centos上的rpm数据库位置/var/lib/rpm/
3、rpm命令的使用:
rpm [OPTIONS] [PACKAGE_FILE]
安装:-i, --install
升级:-U, --update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, --verify
数据库维护:--builddb, --initdb
rpm在man文档各个功能都是不同的部分,我们这里也按不同的部分分开来说,文档中的GENERAL OPTIONS是穿插在所有功能中的。
1、安装
rpm {-i|--install} [install-options] PACKAGE_FILE ...
最常用到的组合: rpm -ivh PACKGE_FILE
常用到的选项:
[GENERAL OPTIONS]:
-v:verbose,详细信息
-vv:更详细的输出
[install-options]:
-h:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系;不建议;
--replacepkgs:重新安装
--noscripts 安装或卸载时不运行rpm包自带的以下四种脚本。
--nopre 不运行安装过程之前要运行的脚本。
--nopost 不运行安装过程完成之后要运行的脚本。
--nopreun 不运行卸载过程开始之前要运行的脚本。
--nopostun 不运行卸载过程完成之后要运行的脚本。
注意:rpm可以自带脚本;
四类:--noscripts
preinstall:安装过程开始之前运行的脚本,%pre , --nopre
postinstall:安装过程完成之后运行的脚本,%post , --nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun
可以把src的rpm包解开以后,查看它的sepc文件,其中一部分以%pre,%post之类开头的脚本段。
--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;
最常用到的恐怕就是ivh了。安装,显示详细信息,以#号显示过程。
[root@localhost ~]# rpm -ivh zsh-5.0.2-7.el7_1.2.x86_64.rpm warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-7.el7_1.2 ################################# [100%] [root@localhost ~]#
--test只是用来测试安装,不会真的安装。用来检测依赖关系或其它问题。只执行到上面的例子中的Preparing阶段。
--nodeps 忽略依赖关系,如果依赖的仅仅是一些文档类的包,倒也可以用。
--replacepkgs 重新安装,不会覆盖已有的配置文件。如果想完全的重新安装,最好是先卸载再安装。
脚本的作用,如安装之前创建要用到的用户和目录,安装之后设置权限,卸载之前保证环境,卸载之后清理文件等等。
包的签名信息和合法性,是基于包自带的签名和制做者的公钥来实现的。在没有导入制作者公钥之前就会报上面例子中第一行的错误。我们加上—nosignature试一下:
[root@localhost ~]# rpm -ivh --nosignature zsh-5.0.2-7.el7_1.2.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-7.el7_1.2 ################################# [100%] [root@localhost ~]#
注意只加--nodigest是没有效果的,因为包完整性是基于软件包的指纹信息,而没有公钥之前是得不到指纹信息的。所以还是会报没有KEY的错误。
大家都知道非对称密钥吧,以一种算法计算得出私钥,然后再从私钥中得出公钥。 以私钥加密的文件只能用公钥解密,而以公钥加密的文件则只能用私钥解密。
这里解释一下rpm包是如何做到这种验证的。
首先软件包在刚开始,会以单向加密计算出软件包的校验吗。校验吗就相当于一个文件或一些数据的指纹信息,基本上可以完全做到唯一的标示一个文件,只要程序包发生一丁点的变化,加密得出的校验码就是完全不同的。
然后制作者会以一些算法(如RSA)生成自己的私钥和公钥,再以自己的私钥把特征码加密,也就形成了签名信息。只有制作者的公钥可以解密此签名信息。
而因为一对的公钥和私钥只能相互解密,所以只要拿到制作者的公钥,可以对签名解密,也就证明了软件包的来源合法性。 因为如果是另外的人加密的,用这个公钥是无法解开的。
把签名解开以后也就得到了程序包的特征吗。 此时就可以用相同的单相加密计算出程序包的特征码。只要与从签名解开的特征码一样,也就证明了程序包的完整性。
大体上就是从能否解开签名信息而知道程序包是否正确。 从特证码知道程序包是否缺损。
所有的操作都依赖与公钥是正确的,这也就是CA的功能了,不过我们的程序包还用不到用CA来保证公钥的正确性。
导入制作者公钥:
获取并导入信任的包制作者的密钥:
对于CentOS发行版来说,安装完系统以后 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,或是光盘根目录里面的RPM-GPG-KEY-CentOS-7。centos6也一样,只不过7是6而已。
验正:
(1) 安装此组织签名的程序时,会自动执行验正;
(2) 手动验正:rpm -K PACKAGE_FILE
使用:rpm --import 公钥文件 来导入公钥。
在CentOS7上面还可以用rpmkeys --import命令,而且man文档中就是rpmkeys命令。
rpmkeys --import PUBKEY ...
rpmkeys {-K|--checksig} PACKAGE_FILE ...
[root@localhost cdrom]# rpmkeys --import RPM-GPG-KEY-CentOS-7 [root@localhost cdrom]# rpm -ivh Packages/zsh-5.0.2-7.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-7.el7 ################################# [100%] [root@localhost cdrom]#
可以看到现在没有报任何错误。
[root@localhost ~]# rpm -K zsh-5.0.2-7.el7_1.2.x86_64.rpm zsh-5.0.2-7.el7_1.2.x86_64.rpm: rsa sha1 (md5) pgp md5 OK [root@localhost ~]# 单独的验证程序包文件也可以。
2、升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升级或安装;如果原本就没有安装此软件,则安装。
-F:升级,如果没有安装些软件,则不升级。
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降级;
--force:强制升级;有时候低版本的程序可能被其它程序所依赖,这时升级会报错。如果强制升级很可能会导致一些程序不能使用。这也是还要使用源代码安装软件的一个原因。
注意:(1) 不要对内核做升级操作; 4.0之前的内核必须要重启才能使用,可能会发生重启以后发现系统起不来了。可以直接安装新版本内核。Linux支持多内核版本并存,可以直接安装新版本内核;
(2)只要新升级安装的包的配置文件与老版本的配置文件不同,新的配置文件会重命名为*.rpmsave或*.rpmnew之类的名称。 是根据校验码之类的进行的比较。
[root@localhost ~]# rpm -Uvh zsh-5.0.2-7.el7_1.2.x86_64.rpm warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-7.el7_1.2 ################################# [ 50%] Cleaning up / removing... 2:zsh-5.0.2-7.el7 ################################# [100%] [root@localhost ~]#
3、卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式
[root@localhost ~]# rpm -evh zsh Preparing... ################################# [100%] Cleaning up / removing... 1:zsh-5.0.2-7.el7_1.2 ################################# [100%] [root@localhost ~]#
4、查询:
rpm {-q|--query} [select-options] [query-options]
-q是基本,可以组合以下各选项。
[select-options]
PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
-a, --all:查询所有已经安装过的包;
-f FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
CAPABILITY表示的是一种能力,如生成的可执行程序,提供的web服务,提拱的shell功能等等。
[query-options]
--changelog:查询rpm包的changlog;修改日志,这里只是rpm包的修改日志,而不是源码的changelog.
-l, --list:程序安装生成的所有文件列表;
-i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片断;
常用到的组合:
-qi PACKAGE:查询已安装程序的详细信息。
-qf FILE:查询某个文件是由哪个程序包所提供的
-qc PACKAGE:查询已安装程序的配置文件。
-ql PACKAGE:查询已安装程序所生成的文件。
-qd PACKAGE:查询已安装程序包所提供的文档。
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE: 这些与上面都一样,只不过不是查询已安装程序的,而是查询还没有安装的程序包文件。
[root@localhost ~]# rpm -qf /etc/fstab setup-2.8.71-5.el7.noarch [root@localhost ~]# [root@localhost ~]# rpm -qc zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc [root@localhost ~]# [root@localhost ~]# rpm -qa | grep zs.* zsh-5.0.2-7.el7_1.2.x86_64 [root@localhost ~]# [root@localhost ~]# rpm -qpc zsh-5.0.2-7.el7_1.2.x86_64.rpm warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc [root@localhost ~]#
最后一个例子是直接提供的程序包文件,而不是程序名称。倒数第二个用来在不知道某个程序具体的名称的时候很有用。
5、校验:
rpm {-V|--verify} [select-options] [verify-options]
有没有怀疑过你的程序文件被改了,并且植入了后门。那么来校验一下吧。用来校验已安装的程序有没有被修改过,程序的所有文件。
有可能会报的错误:
S file Size differs 大小变化
M Mode differs (includes permissions and file type) 权限变化
5 digest (formerly MD5 sum) differs 校验码变化,rpm数据库中记录了所有程序的校验吗。
D Device major/minor number mismatch 设备主次号变化。
L readLink(2) path mismatch (readlink)路径变化。
U User ownership differs 属主变化。
G Group ownership differs 属组变化。
T mTime differs 修改时间变化
P caPabilities differ CAPABILITY变化。
[root@localhost ~]# rpm -V zsh [root@localhost ~]# 没有消息就是最好的消息。
[root@localhost ~]# chmod o-x /usr/bin/zsh [root@localhost ~]# rpm -V zsh .M....... /bin/zsh [root@localhost ~]# [root@localhost ~]# touch /usr/bin/zsh [root@localhost ~]# rpm -V zsh .M.....T. /bin/zsh [root@localhost ~]# [root@localhost ~]# rpm -V -a S.5....T. c /etc/issue S.5....T. c /etc/yum.repos.d/CentOS-Base.repo S.5....T. c /etc/sudoers .......T. c /root/.bash_logout S.5....T. c /root/.bash_profile S.5....T. c /root/.bashrc .....
修改权限的,修改时间的,最下面这个可以看到配置文件修改也是会报出来,也是程序的组合部分。
6、数据库重建:
rpm管理器数据库路径:/var/lib/rpm/
无论是升级、查询、删除操作还有yum安装都是需要rpm的数据库的。所以数据库是非常重要的。
获取帮助:
CentOS 6:man rpm
CentOS 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
但我自己在测试中发现,一点用也没有,虽然出现一堆文件,但却没有任何软件安装的数据。不知道是不是我的虚拟机问题。朋友们如果可以重新生成数据库一定要告诉我一下啊。
谢谢浏览,如果朋友们有问题,尽管提出,大家一起学习。如果发现错误,也还请帮忙指出,谢谢了。
本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1728040
原文地址:http://fanqie.blog.51cto.com/9382669/1728040