程序包管理
概述
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