程序包管理
概述
API:Application Program Interface应用编程接口 ABI:Application Binary Interface应用二进制接口 Unix-like, ELF Windows exe,msi 库级别的虚拟化: linux:WinE(模拟windows) Windows:Cywin(模拟linux) 系统级开发: C/C++:httpd,vsftpd,nginx go 应用级开发: java/python/perl/ruby/php java:hadoop,hbase,(jvm(java虚拟机)) Python:openstack,(pvm(python虚拟机)) perl:(per解释器) php:(php解释器) c/c++程序格式: 源代码:文本格式的程序代码; 编译开发环境:编译器、头文件、开发库 二进制格式:文本格式的程序代码->编译器->二进制格式(二进制程序、库文件、配置文件、帮助文件) java/python程序格式: 源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式; 开发环境:编译器、开发库 二进制: 项目构建工具: c/c++:make java:maven
程序包管理器:
源代码-->目标二进制格式(二进制程序、库文件、配置文件、帮助文件)-->组织成为一个或有限几个“包”文件; 安装、升级、卸载、查询、校验 程序包管理器: debian:dpt,dpkg,".deb" redhat:redhat package manager,rpm, ".rpm";rpm is package manager; S.u.S.E:rpm,".rpm", Gentoo:ports Archlinux: 源代码:name-VERSION.tar.gz VERSION:major,minor,release
rpm包命名格式:
name-VERSION-release.arch.rpm VERSION:major.minor.release release.arch:rpm包的发型号 release.os:3.el7.i386.rpm(适用于redhat7,32为的程序包,第三次制作的程序包) archetecture(架构):i386,x64(amd64),ppc,noarch redis-3.0.2.tar.gz-->redis-3.0.2-1.centos7.x64.rpm (包命名格式) changelog 拆包:主包和支包 主包:name-VERSION-release.arch.rpm 支包:name-function(功能)-VERSION-release.arch.rpm function:devel,utils,libs,...
依赖关系:
包和包之间存在复杂的依赖关系 X,Y,Z X-->Y,Z Y-->A,B,C C-->Y 循环依赖关系
前端工具:自动解决依赖关系;
yum:rhel系列系统上rpm包管理器的前端工具; apt-get(apt-cache):deb包的管理器的前端工具; zypper:suse的rpm管理器前端工具; dnf:Fedora 22+系统上rpm包管理器的前端工具;
程序包管理器:
功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作 1、程序包的组成清单(每个程序包都单独实现); 文件清单 安装或卸载时运行的脚本 2、数据库(公共) 程序包的名称和版本; 依赖关系; 功能说明; 安装生成的各文件的文件路径及校验码信息; 等等 /var/lib/rpm/ :这个路径下所存放的是rpm包的数据库
获取程序包的途径:
(1)系统发行版的光盘或官方文件服务器(或镜像站点): htty://mirrors.allyun.com htty://mirrors.sohu.com htty://mirrors.163.com (2)项目的官方站点 (3)第三方组织: (a)EPEL: (b)搜索引擎 htty://pkgs.org htty://rpmfind.net htty://rpm.pbone.net (4)自己动手,丰衣足食 建议:检测其合法性 来源合法性: 程序包的完整性;
centos系统上rpm命令管理程序包:
安装、升级、卸载、查询和校验、数据库维护 rpm命令:rpm [options] [PACKAGE_FILE] 安装:-i,--install 升级:-U,--update,-F,--freshen 卸载:-e,--erase 查询:-q,--query 校验:-V,--verify 数据库维护:--builddb,--initdb
安装:卸载时用的是name包名
rpm {-i|--install} [install-options] PACKAGE_FILE...
GENERAL OPTIONS:通用选项
-v: verbose,详细信息
-vv:更详细的输出
安装时真正用的是:rpm -ivh PACKAGE_FILE,例如:

[install-options]: -h:hash marks输出进度条;每个#表示2%的进度; --test:测试安装,检测并报告依赖关系及冲突消息等; --nodeps:忽略依赖关系;不建议,即使装上也没法用; --replacepkgs:重新安装,例如先把/etc/zshrc里的文件改掉,但我不知道修改哪里且无法复原,我就需要重新安装一下包来恢复。 但是,这里的修改系统会认为是认为故意的,所有不会恢复。这时候要删除整个/etc/zshrc,再重新安装包

注意:rpm可以自带脚本; 四类:--noscripts都不执行 preinstall:安装过程开始之前运行的脚本,%pre, --nopre不执行 postinstall:安装过程完成之后运行的脚本,%post, --nopost不执行 preuninstall:卸载过程真正开始执行之前运行的脚本,%preum,--nopreun不执行 postuninstall:卸载过程完成之后运行的脚本,%postun,--nopostun不执行 --nosignature:不检查包签名信息,不检查来源合法性; --nodigest:不检查包完整性信息;
升级:用的是file,包的路径
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)不要对内核做升级操作;linux支持多内核版本并存,因此,可以直接安装新版本内核;
(2)如果某原程序包的配置文件安装后被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
卸载:卸载时用的是name包名,不需要路径
rpm{-e|--erase}[--allmatches][--nodeps][--noscripts][--test] PACKAGE_NAME...
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式
查询(非常重要):查询时用的是name包名,不需要路径
rpm {-q|--query}[select-options][query-options]
[select-options]
PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;

-a,--all:查询所有已经安装过的包,这里可以用正则表达式

-f FILE(路径) :查询指定的文件由哪个程序包安装生成;非常有用

-p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作; --whatprovides CAPABILITY:查询指定CAPABILITY由哪个程序包提供; --whatequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖; [query-options] --changelog:查询rpm包的changlog; -l,--list:程序安装生成的所有文件列表;

-i,--info:程序包相关的信息,版本号、大小、所属的包组,等;

-c,--configfiles:查询指定的程序包提供的配置文件;

-d,--docfiles:查询指定的程序包提供的文档; --provides:列出指定的程序包提供的所有的CAPABILITY

-R,--requires:查询指定的程序包的依赖关系

--scripts:查看程序包自带的脚本片段

用法: -qi PACKAGE(查询information),-qf FILE(指定文件由哪个包安装生成),-qc PACKAGE(配置文件),-ql PACKAGE(程序包安装生成的文件列表),-qd PACKAGE(程序包安装生成的文档) -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc PACKAGE_FILE.....查询未安装的程序包的相关信息
校验:
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数据指纹信息,文件的di5码发送改变
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 capabilities改了
可以指明检测哪些信息,也可以指明不检查哪些信息
包来源合法性验证和完整性验证:
来源合法性验证:印签,数字签名 完整性验证: 制作者制作一个rpm包,第一步要先使用单向加密算法去提取出包的特征码来,特征码是定长的。 第二部,制作者会用自己的私钥去加密这段特征码,然后附加在文件后面。 使用者拿到这个包后,第一步验证来源合法性,拿到制作者的公钥,解密这段特征码。 同样的用单向加密算法对包做计算,算出特征码,只要数据没改变,和以前的特征码一定是一样的。二者一样,包的完整性就得到了验证。 如何获得合法的公钥,通过第三方加密机构获得,要通过可靠手段来拿到 获取并导入信任的包制作者的密钥: 对于centos发行版来说:rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7


验证:
(1)安装此组织签名的程序时,会自动执行验证;
(2)手动验证:rpm-K PACKAGE_FILE
数据库重建:
rpm管理器数据库路径:/var/lib/rpm/
查询操作:通过此处的数据库进行;
获取帮助:
centos 6:man rpm
centos 7:man rpmdb
rpm{--initdb|--rebuildbd}[--dbpath DIRECTORY][--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实施化创建一个新的;当前有时不执行任何操作;
如果实现不存在数据库,则新建之;否则,不执行任何操作
--rebuiddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
无论当前存在与否,直接重新创建数据库
回顾
linux程序包管理的实现、rpm包管理器
rpm命令实现程序管理 安装:-ivh,--nodeps,--replacepkgs 卸载:-e,--nodeps 升级:-Uvh,-Fvh,--nodeps,--oldpackage 查询:-q,-qa,-qf,-qi,-qd,-qc,--scripts,-q --changlog(查询更新日志),-q --provides,-q --provides,-q --requires 校验:-V 导入GPG密钥:--import,-K,--nodigest,--nosignature 数据库重建:--initdb,--rebuilddb
linux程序包管理(2)
Centos:yum,dnf ftp://172.16.0.1/pub/
yum是用来解决依赖关系的,自动解决依赖关系,完成包的安装
yum是cs架构的工具,工作前提要求本地客户端可达的网络上,首先,这可以是一个文件服务器,可以提供很大的存储空间,在这个空间上放置所有对我们有用的rpm包。这个目录文件共享的方式输出到外部主机,让主机能够访问。可以有linux主机,可以支持yum工具的使用,当用户需要安装程序包的时候,可以不用rpm命令,而使用yum,接到命令后会根据本地所指向的提供服务的访问地址(URL),互联网提供共享服务的服务器有很多。
yum需要一个配置文件指明要访问网络中的哪一个服务器。yum在接收到安装程序包的指定后,会尝试通过文件中 的配置指定去找远程的服务器。服务器会提供一个程序包仓库,会有一个元数据信息,指明仓库中存放的包名,版本等。yum安装程序包时去找仓库的时候,yum会首先请求服务器把元数据文件发过来,先放置在本地的缓存区域中(cache),yum就开始分区这个cache,看有没有用户想要的程序包的包名,如果有就开始尝试读取这个包。每一个包和程序包之间可能会存在依赖关系,还会去尝试根据元数据文件取分析依赖关系。接下来去查询本地以安装的程序包,分析完后把剩余的尚未安装的包给列出来,和我们要安装的程序包给列出来,最后把自己扮演为文件客户端的角色,去尝试连线对应的文件服务器,开始去下载对应的程序包文件。
下载完先缓存在本地,在本地执行类似于rpm的安装操作,安装时会自动先安装被依赖的程序包,安装完成开始返回告诉客户端安装完成,安装完会把缓存中的文件删除。安装完成后会自动删除程序包,但元数据文件不会删除。因为下次再安装程序包时,直接分享本地的元数据就可以了。如果远程服务器中的包,依赖关系之类的发送改变,元数据文件也会发生改变。
yum每次都会远程到服务器去请求元数据。在仓库上,元数据文件不止一个,服务器中还有一个特殊文件,这个文件记录了没一个元数据文件的校验码,本地缓存的文件也有校验码,每一次yum到服务器客户端请求元数据时会先请求校验码,先拿到校验码和本地对比是不是发生改变,只有文件没变校验码一定不变。检测完一样,本地缓存继续有效,否则还是请求重新下载元数据文件。可以大大节约网络带宽,还能保证本地缓存文件是最新版本的。
查询本地程序包,发现分析本地元数据文件时,但远程服务器连不上。这是看自己是否要用未知的文件。
yum不是rpm的取代者,只是rpm的前端管理工具,yum是依赖rpm才能存在的。yum解决安装问题,rpm在后台完成查询等各种管理操作,对后期应用很有用。
本地进行yum操作,需要自行去配置一台服务器主机,配置成文件服务器。一般yum所支持的文件服务器有两种:1、ftp 2、http。把这些文件创建出元数据文件。有一个命令去生成,元数据文件是通过分析每一个程序包的元数据,再从中抽取出来给罗列在元数据文件中实现的。工具creatrepo
creatrepo用来创建高级程序包时比较困难
YUM:yellow dog,Yellowdog Update Modifier yum repository:yum repo 存储了众多rpm包,以及包的相关的元数据文件(放置于特定的目录下:repodata): 安装过程也会用到依赖关系分析,用到仓库,默认仓储都是本地光盘当仓库来使用,操作系统的安装镜像光盘,本身就是一个仓库。repodata目录所在的位置就是仓库应该指向的路径,并不是rpm包所在的目录是仓库,而是repodata这个目录所在的位置应该是仓库所指向的路径。 文件服务器: ftp:// http:// nfs:// file:/// 本地仓库,把镜像光盘当仓库 yum客户端所指定的文件

配置文件: /etc/yum.conf:为所有仓库提供公共配置(主配置文件通常只提供各yum仓库指向的公共配置) /etc/yum.repos.d/*.repo:为仓库的指向提供配置(可以配置一个或多个仓库指向)
主配置文件

定义yum的特性
仓库的定义:
[reposotoryID]
name-Some name for this repository
baseur1-ur1://path/to/repository/
enabled={1|0}默认为1,仓库是否可以用
gpgcheck={1|0}:安装前是否坚持完整性或来源合法性
gpgkey=URL:密钥文件
enablegroups={1|0}是否支持在此仓库上使用组
failovermethod={roundrobin|prority}故障转移方法,默认为roundrobin意为随机挑选
cost=1000 :开销数字,默认为1000
仓库id

每一个中括号当中定义了一个配置段,可能只对某一段生效
教室的yum



repodata上一级目录,就是目前这一级
配置yum仓库


配置好以后查看yum仓库

这样就可以使用了
yum命令的用法:
yum [options] [command] [package...]
command is one of:
* install package1 [package2] [...]
* update [package1] [package2] [...]
* update-to [package1] [package2] [...]
* update-minimal [package1] [package2] [...]
* check-update
* upgrade [package1] [package2] [...]
* upgrade-to [package1] [package2] [...]
* distribution-synchronization [package1] [package2] [...]
* remove | erase package1 [package2] [...]
* autoremove [package1] [...]
* list [...]
* info [...]
* provides | whatprovides feature1 [feature2] [...]
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
* makecache [fast]
* groups [...]
* search string1 [string2] [...]
* shell [filename]
* resolvedep dep1 [dep2] [...](maintained for legacy reasons only - use repoquery or yum provides)
* localinstall rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use update)
* reinstall package1 [package2] [...]
* downgrade package1 [package2] [...]
* deplist package1 [package2] [...]
* repolist [all|enabled|disabled]
* repoinfo [all|enabled|disabled]
* repository-packages <enabled-repoid> <install|remove|remove-or-rein‐stall|remove-or-distribution-synchronization> [package2] [...]
* version [ all | installed | available | group-* | nogroups* | grou‐plist | groupinfo ]
* history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
* load-transaction [txfile]
* updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates| exclude-all | check-running-kernel]
* fssnapshot [summary | list | have-space | create | delete]
* fs [filters | refilter | refilter-cleanup | du]
* check
* help [command]
常用:
显示仓库列表:
repolist [all|enabled|disabled]
显示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] [..]
# yum list {available|installed|updates}[glob_exp1][..]
安装程序包:
install package [package2] [...]
reinstall package1 [package2] [..] (重新安装)
升级程序包:
update package1 [package2] [...]
downgrade package1 [package2] [...] (降级)
检测可用升级:
check-update
卸载程序包:
remove | erase package1 [package2] [..]
查看程序包information
info [..]
查看指定的特性(可以是某文件)是由哪个程序包提供:
provides | whatprovides features [features] [..]
清理本地缓存:
clean [ pakages|metdata|expire-cache|rpmdb|plugins|all]
构建缓存:
makecache
搜索:
search string1 [string2] [..]
以指定的关键字搜索程序包名及summary信息;
查看指定包所依赖的capabilities:
deplist package1 [package2] [...]
查看yum事务历史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
安装及升级本地程序包:
* localinstall rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use update)
包组管理的相关命令:
groupinstall group1 [group2] [..]
groupupdate group1 [group2] [..]
grouplist [hidden] [groupwildcard] [..]
groupremove group1 [group2] [..]
groupinfo group1 [..]
原创文章,作者:15152188070,如若转载,请注明出处:http://www.178linux.com/38248

