(注:此博文源于夜归人的博客)

程序包管理,rpm、yum的使用

 

 

程序包管理的相关概念:

<<===============================================================================================>>

软件包的组成部分:

1、二进制程序:可执行文件

通常安装在 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin, /usr/local/sbin 目录之下

2、库文件:

程序的运行依赖于库文件,Linux的核心库是glibc,某些软件也会将自己的核心文件封装成库文件,

以供其他程序调用或二次开发。

Linux下的库分为静态库和动态库,静态库通常以".a"结尾,动态库通常以".so"结尾。

通常安装在 /usr/lib, /usr/lib64, /var/lib, /usr/local/lib 目录下

★库文件也是可执行程序,但不能直接执行,因为库文件没有执行入口,只能被其他文件调用执行。

调用的两种方式:

开发调用:二进制格式的库

运行调用:文本格式的头文件

函数(参数)头文件 /usr/include, /usr/local/include

#inclue stdio.h

链接程序所要查找动态格式的共享对象库时的路径:

/etc/ld.so.conf

/etc/ld.so.conf.d/*.conf

ldd:用于查看程序或者库文件所依赖的共享库列表

ldd [OPTION]... FILE...

例如:

[root@CentOS7 ~]# ldd /bin/cat

linux-vdso.so.1 => (0x00007fffa5ffe000)

libc.so.6 => /lib64/libc.so.6 (0x00007f013c418000)

/lib64/ld-linux-x86-64.so.2 (0x00007f013c7e2000)

3、配置文件:通常是纯文本文件,用来定义程序的特性。

通常存放在:/etc, /usr/etc, /usr/local/etc 或指定的路径下(配置文件一般无需额外配置)

4、帮助文档:man手册、info文件、README、INSTALL、ChangeLog

man COMMAND

到某路径下查找与命令同名的,通常以.gz结尾的压缩文件的名字

/usr/share/man/

man 的配置文件: /etc/man.config

★总结:如果是指定路径安装程序

例如:/usr/local/nginx

二进制程序:bin、sbin

库:lib

头文件:include

配置文件:etc、conf

帮助文件:man

软件包管理器的两个重要功能:

1、数据库:

软件名和版本

安装生成的各文件路径及校验码

各软件包之间的依赖关系

提供功能性说明

rpm -qi FILENAME

2、提供程序组成格式:

文件清单

安装或卸载时运行的脚本

常见的软件包管理器:

Debian系列:dpkg (DebianPackager) 管理 以.deb 结尾的软件包。

“Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等。

RedHat系列: rpm ( RPM isPackage Manager ) 管理 以.rpm 结尾的软件包。

以前是RedHat Package Manager的缩写,现在包括OpenLinux、S.u.S.E.以及TurboLinux等

Linux的分发版本都有采用该包管理器,算是公认的行业标准了。

包管理器的基本功能:

制作程序包

安装程序包

查询程序包

升级程序包

卸载程序包

校验程序包

数据库管理

应用程序的安装方式

1、使用包管理器:便捷、易用

2、包管理器的前端工具:yum

3、简单打包的二进制格式:展开到特定路径下

4、使用源代码编译:

rpm包命名格式:

源程序:PackageName-version.tar.{gz|bz2|xz}

version:major.minor.release

通常版本号(Version)有三个:major.minor.release——主版本号.次版本号.发行号

主版本号:是程序的主要功能发生了巨大的改变时才使用;

次版本号:是在程序的部分功能有重大改变时使用;

发行号:是在修复了一些bug,调整了一些属性后进行的升级。

rpm包:name-version-release.arch.rpm

RPM包的Version号和源程序的版本号需要保持一致,这里的release号通常包含rpm的制作发行号,

和源程序本身没有关系,并且这个Release号可能会标明所适用的操作系统平台。

arch指的是安装在哪种主机平台上,常见的主机平台有:

i686、x86_64、amd64、ppc(powerPC)、noarch(不依赖平台)等。

如:bash-4.3.2-6.el6.x86_64.rpm

表明这是一个bash程序包;其源程序的主版本号为4,次版本号是3,发行号2;

它是第6次修正的RPM包;这个包用在RedHat6的Enterprise版上;适用于x86_64的主机平台。

有些没有指定arch的rpm包,可能是通用版本

如:nginx.1.4.16-5.rpm

rpm包的分包:

将程序的某些功能做成独立的包,让用户选择安装

一个程序可能会有许多功能,其中不少功能是用不上的,如某些程序提供了头文件,用来供程序员

进行二次开发,而普通用户根本不需要对该程序进行二次开发,所以只需要安装该程序的配置文件

和二进制文件就即可。

RPM包可以分为主包(核心包)和分包(支包),其中主包的包名遵循RPM包的基本命名规则。

如:主包:bash-4.3.2-2.el6.x86_64.rpm

支包:bash-hello-4.3.2-2.el6.x86_64.rpm

bash-world-4.3.2-2.el6.x86_64.rpm

DNS: bind, bind-devel, bind-libs, bind-utils

程序包来源合法性验证:

源程序:通过md5或sha1验证码验证

rpm包:发行商提供的合法性是可信的

验证包完整性:校验码

验证来源合法:公钥

获取rpm包的途径:

1、发行商的光盘或站点服务器

以CentOS为例:

http://mirrors.163.com

http://mirrors.sohu.com

2、fedora-EPEL

3、项目的官方站点

4、搜索引擎:

http://rpmfind.net

http://rpm.pbone.net

http://pkgs.org

rpm包管理器的使用:

<<======================================【rpm管理:安装】======================================>>

rpm包管理:安装

rpm {-i|--install} [install-options] PACKAGE_FILE ...

-v verbose

-vv

-vvv

-h hash,以#的个数显示安装进度,一个#表示2%的进度;

--test: 仅测试,不真正执行安装过程

每个rpm包都提供一个或多个capability,安装一个程序包时可能需要依赖或被别的包所依赖

如果存在依赖:

解决依赖关系:

忽略依赖关系: --nodeps

重新安装: --replacepkgs

原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件

实例1:安装程序包

马哥-51CTO-Linux培训-0910-程序包管理_yum

实例2:测试安装程序包

马哥-51CTO-Linux培训-0910-程序包管理_rpm_02

实例3:安装程序包时忽略依赖关系

马哥-51CTO-Linux培训-0910-程序包管理_rpm_03

实例4:重新安装已安装过的程序包

马哥-51CTO-Linux培训-0910-程序包管理_rpm_04

<<====================================【rpm管理:卸载】====================================>>

rpm包管理:卸载

rpm -e或--erase

rpm -e package_name

如果卸载被其他程序所依赖的包

1、把依赖者一同卸载;

2、忽略依赖关系;

--nodeps

--noscrips: 卸载时不运行脚本

3、不再卸载

实例:卸载已安装的程序包

马哥-51CTO-Linux培训-0910-程序包管理_rpm_05

实例:卸载时忽略依赖关系

马哥-51CTO-Linux培训-0910-程序包管理_rpm_06

<<======================================【rpm管理:查询】======================================>>

rpm包管理:查询

查询所有已安装的包:rpm -qa

查询某单个包是否安装: rpm -q package_name

查询包安装之后在当前系统生成的文件列表: rpm -ql package_name

查询某文件是哪个包安装生成的: rpm -qf /PATH/TO/SOMEFILE

查询包安装后生成的帮助文档: rpm -qd package_name

查询包安装后生成的配置文件: rpm -qc package_name

查询包的描述信息:rpm -qi package_name

查询包相关的脚本: rpm -q --scripts package_name

脚本有四类:

preinstall: 安装前脚本

postinstall: 安装后脚本

preuninstall: 卸载前脚本

postuninstall: 卸载后脚本

查询尚未安装的rpm包文件:rpm -qp

查询安装后会生成的文件列表:rpm -qpl /PATH/TO/package_file

查询其简单描述信息: rpm -qpi /PATH/TO/package_file

实例1:查询 lsof-4.82-5.el6.x86_64程序包安装后生成的文件列表

马哥-51CTO-Linux培训-0910-程序包管理_rpm_07

实例2:查询/usr/share/man/man8/lsof.8.gz文件是由哪个包安装所生成的

马哥-51CTO-Linux培训-0910-程序包管理_yum_08

实例3:查询程序包安装后生成有哪些帮助文档

马哥-51CTO-Linux培训-0910-程序包管理_yum_09

实例4:查询程序包安装后生成的配置文件

马哥-51CTO-Linux培训-0910-程序包管理_yum_10

实例5:查询程序包安装完后生成的脚本

马哥-51CTO-Linux培训-0910-程序包管理_yum_11

实例6:查询bash程序包的描述信息

马哥-51CTO-Linux培训-0910-程序包管理_rpm_12

Name:软件名称

Relocations:在安装时是否可指定安装路径(重定位)

Version:版本号

Vendor:提供商

Release:rpm的发行号

BuildDate:rpm包的制作日期

InstallDate:安装时间

Build Host:在哪个系统上制作的rpm包

Group:包组

SourceRPM:源码的rpm包

Size:包大小

License:许可证

Signature:数字签名(验证来源合法性和包完整性)

Packager:包的制作者

URL:获取源码的网址

Summary:简要说明

Description:略详细的说明

<<======================================【rpm管理:升级】======================================>>

rpm包管理:升级

rpm -U: 升级或安装,如果有旧版程序包,则升级,如果没有,则安装

rpm -F: 仅升级,如果有旧版程序包,则升级,如果没有,则不安装

rpm {-Uvh|-Fvh} /PATH/TO/package_file

--nodeps: 忽略依赖关系

--oldpackage: 降级

--force: 强行安装

注意: 不要对内核执行升级操作

多版本内核可并存,因此,要执行安装操作

实例1:升级程序包,升级过程中提示有依赖关系时忽略,继续更新

马哥-51CTO-Linux培训-0910-程序包管理_yum_13

实例2:把刚升级的程序包降级为原来的版本

马哥-51CTO-Linux培训-0910-程序包管理_yum_14

<<======================================【rpm管理:校验】======================================>>

rpm包管理:校验

检查包安装后生成的文件是否被修改过

rpm -V package_name

S file Size differs

M Mode differs (includes permissions and file type)

5 digest (formerly MD5 sum) differs

D Device major/minor number mismatch

L readLink(2) path mismatch

U User ownership differs

G Group ownership differs

T mTime differs

P caPabilities differ

校验软件包来源合法性和完整性

包完整性:通过单向加加密机制(md5|sha1)

来源合法性:通过公钥加密机制(RSA)

导入制作者的公钥:CentOS发行版的公钥在iso文件中

导入命令:rpm --import /PATH/TO/gpg-key-file

检查: rpm -K /PATH/TO/package_file

rpm --checksig /PATH/TO/package_file

--nosignature: 不检查来源合法性

--nodigest:不检查完整性

实例1:分别对程序包安装后生成的文件进行改名和修改操作,然后验证

马哥-51CTO-Linux培训-0910-程序包管理_rpm_15

实例2:导入公钥验证软件包的来源合法性和完整性

马哥-51CTO-Linux培训-0910-程序包管理_rpm_16

<<================================【rpm管理:数据库重建】================================>>

rpm包管理:数据库重建

数据库:/var/lib/rpm/

重建:

rpm --initdb:初始化

如果事先不存在一个数据库,则新建

rpm --rebuilddb:重建

直接重建数据,会覆盖原有的库

程序包的依赖关系:

<<===============================================================================================>>

由于许多程序包之间存在这依赖关系,例如A依赖B,而B又依赖X、Y...

所以使用rpm管理器安装或卸载程序时会有诸多不便,很可能安装一个程序包之后由于所依赖的另外一个程序

包没有安装,造成安装失败,或是卸载程序把被其他程序包依赖的包卸载了,导致其他程序无法运行等……

因此为了解决这一问题,后来便有了程序包的前端管理器,它会自动处理程序包之间的依赖关系

前端管理器:

Debian:apt-get

RedHat:yum (Yellowdog Update Modifed)

dnf:下一代解决依赖关系的程序包前端管理器

文件服务器(共享rpm包):通过yum所支持的文件共享机制,将各rpm包通过文件服务共享

repository:仓库

1、各rpm包

2、依赖关系、程序包安装后所能生成文件列表等元数据文件

yum客户端:

1、配置文件:指定各可用的yum仓库

2、缓存元数据: yum会到各可用yum仓库获取元数据,并缓存至本地

3、分析元数据:根据具体操作请求完成元数据分析,可能包括检查依赖关系,文件列表等信息

4、执行具体操作

客户端配置文件指定对应服务器的访问方式

ftp ftp://server/path/to/repo

http http://server/path/to/repo

nfs nfs://server/nfs_path

file file:///path/to/repository

yum程序的配置文件:

<<===============================================================================================>>

要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中

/etc/yum.conf

/etc/yum.repos.d/

配置文件格式:

由两段组成,类似windows的ini配置文件

[main]:主配置段

[repo]:仓库配置段

[root@CentOS-6 ~]# cat /etc/yum.conf

[main]

cachedir=/var/cache/yum/$basearch/$releasever #缓存目录

keepcache=0 #删除缓存中已安装的rpm包

debuglevel=2 #调试级别

logfile=/var/log/yum.log #日志文件

exactarch=1 #必须跟当前主机的版本完全精确匹配才安装

obsoletes=1 #过去的,废弃的

gpgcheck=1 #是否检验其来源合法性及数据包完整性

plugins=1 #是否支持插件

installonly_limit=5 #

bugtracker_url= #追踪bug保存的位置

distroverpkg=centos-release

定义一个仓库指向(配置repo):

[repo_ID]

name=仓库描述信息

baseurl=仓库的访问路径

# mirrorlist=SCHEME://HOSTNAME/PATH/TO/MIRROR_LIST_FILE

enabled={1|0}

gpgcheck={1|0}

gpgkey=公钥文件(可以在本地,也可以是服务器端路径)

cost=定义此仓库的开销,默认为1000

例:

repo文件:

[base]

name=CentOS-6 - Base - 163.com

baseurl=http://mirrors.163.com/centos/6/os/x86_64/

gpgcheck=1

gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

yum配置文件中可用的四个宏:

$releasever: #程序的版本,对yum而言指的是redhat-release版本,只替换为主版本号,RedHat6.5,则替换为6

$arch: #系统CPU架构

$basearch: #系统基本架构,如i686,i586等的基本架构为i386

$YUM0-9: #在系统中定义的环境变量,可以在yum中使用

★宏的作用是变量替换,如:想让不同系统架构都使用同一个repo(通用版本)。

[base]

name=CentOS-$releasever -Base - 163.com

baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

<<=========================================【yum命令】=========================================>>

yum命令

格式:

yum [options] [command] [package ...]

yum的各命令:

repolist [all|enabled|disabled]: 列出所有可用yumrepo

clean [all|packages|metadata|expire-cache|rpmdb|plugins]: 清理缓存

makecache: 生成缓存

list [all|installed|available]: 列出rpm包

info package_name: 列出包的描述信息

install package_name ... : 安装指定的程序包

reinstall package_name ... : 重新安装指定的程序包

chek-update package_name: 检查可升级的程序包

downgrade package_name: 降级

update package_name: 升级指定的程序包

★直接update 程序包名,将会升级到最新的版本,

如果有多个版本,想升级到指定的版本号,要明确指定版本号

erase|remove package_name... :卸载时所依赖的包也将一并卸载

whatprovides|provides /PATH/TO/SOMEFILE: 查询指定文件由哪个包安装生成

history: yum的历史

search KEYWORD:搜索程序包

★安装本地包:

install /PATH/TO/package_file

手动禁止检查来源及完整性: --nogpgcheck

如:

yum install /tmp/finger-0.17-40.el6.x86_64 --nogpgcheck

grouplist: 列出所有包组

groupinstall "group_name": 安装指定的包组

groupremove "group_name" : 卸载指定的包组

groupinfo "package_name": 显示包组相关信息

三个跟开发相关的包组:

Desktop Platform Development :有图形程序时需安装此组

Server Platform Development :服务器平台开发包组

Developmetn tools:开发包组

★提示:

如果系统为CentOS 5,常用的开发包组为"DevelopmentTools" 和 "Development Libraries"

如果系统为CentOS 6,常用的开发包组为"DevelopmentTools" 和 "Server Platfrom Development"

实例1:查看当前系统上所有可用的yum源

马哥-51CTO-Linux培训-0910-程序包管理_yum_17

实例2:卸载指定的程序包

马哥-51CTO-Linux培训-0910-程序包管理_yum_18

实例3:检测指定的程序包是否有更新,然后更新程序包

马哥-51CTO-Linux培训-0910-程序包管理_rpm_19

实例4:对指定的程序包进行降级处理

马哥-51CTO-Linux培训-0910-程序包管理_rpm_20

降级完后查看版本:

马哥-51CTO-Linux培训-0910-程序包管理_rpm_21

<<========================================【制作yum源】========================================>>

制作yum源

yum repositories

文件服务器

ftp://hostname/PATH/TO/REPO

http://hostname//PATH/TO/REPO

/PATH/TO/REPO

repodata/

repomd.xml

使用发行版光盘当本地yum仓库:

1、先禁用当前可用的yum仓库,(可把repo配置文件改名)然后执行 yum clean all 命令清空

2、创建一个 local-media-repo 配置文件

[CentOS 6.7 ISO]

name=CentOS 6.7 x86_64 release iso file

baseurl=file:///media/

enable=1

gpgcheck=1

gpgky=file:///RPM-GPG-KEY-CentOS-6

创建本地yum仓库

crepodata是一个目录,里面包含了yum仓库索引文件和rpm包的一些信息。

创建本地yum仓库时使用createropo命令,它会自动创建repodata目录及目录内的数据库文件

createrepo /PATH/DirName

实例:

使用发行版光盘当本地yum仓库

1、先禁用当前可用的yum仓库(修改当前yum仓库配置文件后缀名)

马哥-51CTO-Linux培训-0910-程序包管理_rpm_22

2、插入光盘-->挂载-->

马哥-51CTO-Linux培训-0910-程序包管理_yum_23

3、在/etc/yum.repo.d/目录下创建repo配置文件local-media-repo,并编辑

马哥-51CTO-Linux培训-0910-程序包管理_rpm_24

4、使用yum repolist 验证,查看当前系统可用yum仓库

马哥-51CTO-Linux培训-0910-程序包管理_rpm_25