Linux基础知识之软件包管理(一)

软件包管理
1.软件运行环境
	运维工作的任务:
		系统管理、库调用管理(开发接触的多,运维接触的少),安装配置某些程序包,让程序包运行并提供相应类型的服务
	程序执行的过程:
	    程序源代码-->预处理-->编译-->汇编-->链接
		    预处理:将代码中的注释信息删除
			静态库:.a结尾的文件
			动态库:.so结尾的文件
			使用动态库的软件在打包的时候不会将动态我呢间编译打包进二进制,静态库反之
	ABI与API 
	    API:应用编程接口(用汇编语言编程)
		API:应用二进制接口
		模拟运行其实调用的就是ABI接口
		    linux    WINE
			windows  Cywin
2.包管理器
	二进制应用程序的组成部分:
		二进制文件、库文件、配置文件、帮助文件
	程序包管理器:
		debian:deb文件,dpkg包管理器
		redhat:rpm文件,rpm包管理器 (RedHat Package Manager (RPM Package Manager))
3.包命名
	源代码:name-VERSION.tar.gz|bz2|xz
		VERSION: major.minor.release
			major:主版本号,代表有重大的版本分支的出现
			minor:此版本号,分支中有某些版本的改变
			release:发行号,代表修正了某些出现的BUG的版本号
	rpm包命名方式:
		name-VERSION-release.arch.rpm
		例:bash-4.2.46-19.el7.x86_64.rpm
			VERSION: major.minor.release
			release:release.OS
			常见的arch:
				x86: i386, i486, i586, i686 (32位系统)
				x86_64: x64, x86_64, amd64  (64位系统)
				powerpc: ppc
				跟平台无关:noarch
4.包命名和工具
	包:分类和拆包
		Application-VERSION-ARCH.rpm:  主包
		Application-devel-VERSION-ARCH.rpm  开发子包(开发包)
		Application-utils-VERSION-ARHC.rpm  其它子包(工具类)
		Application-libs-VERSION-ARHC.rpm  其它子包(库函数)
		包之间:可能存在依赖关系,甚至循环依赖
 	rpm包安装时,直接显示接下来依赖的包,而不是全部的依赖关系。
        a--bc--def :a安装时只显示依赖于bc不显示依赖于def包
	解决依赖包管理工具:
		yum:rpm包管理器的前端工具
		apt-get:deb包管理器前端工具
		zypper:suse上的rpm前端管理工具
		dnf:Fedora 18+ rpm包管理器前端管理工具
5.程序包管理器:
	(1)程序包的组成清单(每个程序包都单独实现)包括程序包安装位置
		文件清单(程序包安装时需要的清单)
		安装或卸载时运行的脚本
	(2)数据库(定义系统中已经安装的程序,程序包安装生成的文件,包与包安装之间的依赖关系,安装生成的各文件的文件路径以及校验码信息)
		数据库存放的位置 /var/lib/rpm(CentOS系列)
		获得程序包的途径:
			a.系统发行版及光盘或者官方文件服务器(镜像站点)
				http://mirrors.aliyun.com 以阿里云为例 (还包括163 sohu源)
			b.项目的官方站点:
			    httpd.apache.org (httpd服务,apache的官方网站)
				www.zabbix.com    zabbix的官方站点
			c.第三方的组织
			    EPEL社区(红帽官方的站点)国内以阿里云为参考 http://mirrors.aliyum.com/epel
				搜索引擎:http://pkgs.org http://rpm.pbone.net http://rpmfind.net
			d.手动编译安装rpm包
			    建议使用完整性校验:来源合法性和程序包的完整性
6.rpm常用的命令:
	rpm [OPTIONS][PACKAGE_FILE]
		安装:-i --install (-v -vv 输出详细信息)
		升级:-U --update,-F --freshen
		卸载:-e --erase(擦除)
		查询:-q --query
		校验:-V 
		rpm数据库的维护:--builddb --initdb
7.rpm常用命令详解:	
	a.安装
		-i --install 安装rpm包,正常使用 rpm -ivh PACKAGE_FILE安装所需要的rpm包
		-v:verbose显示详细信息 -vv显示更加详细的信息 
		-h:hash marks 输出进度条#分割,每个#代表2%的进度
		-ivh --test PACKAGE_FILE:不真正安装,测试安装软件包,遇到安装包的依赖关系就会指出,用于检测并报告依赖关系以及冲突消息
		-ivh --replacepkgs PACKAGE_FILE:重新安装软件包(当配置文件被修改过们重新安装不会修复配置文件的损坏,系统认为该损坏是用户操作的,要想获得安装时的源文件,需将配置文件删除之后,重新安装即可)
		--noscripts:rpm安装包里面可以自带脚本执行(了解即可,用的比较少)
			--nopre:preinstall  安装之前执行的脚本 %pre
			--nopost:postinstall 安装过程之后运行的脚本 %Ppost
			--preun:preuninstall 卸载过程真正执行之前运行的脚本 %preun
			--nopostun:postuninstall 卸载过程完成之后执行的脚本 %postun
		--nosignature:不检查包签名信息,不检查包来源的合法性
		--nodigest:不检查包完整性信息(对比文件的MD5值)	
	b.升级
	    -U:升级或安装(当存在旧版本的时候就升级,当不存在旧版本的时候就安装)
			rpm -Uvh PACKAGE_FILE:升级安装,显示详细信息,显示具体的执行过程以#显示每个#代表2%
		-F:升级(当旧版存在时就升级,不存在的时候就退出升级)
		    rpm -Fvh PACKAGE_FILE:用法和意思相同于-Uvh
		--test --noscripts --nodeps的用法和安装 -i的意思相同
		--oldpackage:降级操作(安装),当新版本出现于系统不兼容,不稳定的时候,需要将新版本降级成老版本
		--force:强制升级,有时用于老版本的回滚
			注意:
				(1)不要对于系统内核做升级操作(4.0之前的版本,要想使用新内核就必须重启系统,万一内核与系统不兼容或因为一些原因报错,就会导致系统无法启动,无法进入系统)
				Linux系统支持多内核版本并存,因此可以直接安装新版本,不是覆盖安装,重启之后就可以选择内核操作,万一内核不兼容,直接重启系统,以原来稳定的内核进入系统即可。
				(2)如果某源程序包的配置文件,在安装之后曾被修改过,升级时新的版本会提供的同一个配置文件,不会覆盖的版本的配置文件,而是将新版本的配置文件重命名为FILENAME.rpmnew后提供服务
	c.卸载
		rpm -e PACKAGE_NAME;卸载某个包,后面跟包名即可
			rpm命令会根据后天的rpm数据库区查询我们将要卸载的包
		--allmatches:卸载所有匹配指定名称的程序包名的各版本
		--nodeps:忽略依赖关系
		--test:测试卸载,dry run模式
	d.查询
	    rpm {-q|--query} [select-options][query-options]:
			后续的[select-options]和[query--options]都需要跟上之前的-q,--query进行使用和查询
		[select-options];
		    PACKAGE_NAME:查询指定的程序包是否已经安装,及其安装的版本信息
			-a,--all:查询所有已经安装过的包,后面可以跟grep命令使用正则表达式通配查询
			-f FILE:查询指定文件是由哪个程序包安装生成的
			-g,--group GROUP:查询指定包组中提供了包含了那些安装包
			-p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
			--whatprovide CAPABILITY:查询指定的CAPABILITY是由哪个程序包提供的;
			--whatrequires CAPABILITY:查询执行的CAPABILITY被哪个包所依赖;
		[query-options]:
           	--changelog:查询rpm的changelog,查询rpm的所有版本的改变的版本,是程序包的修订版本信息,而不是源码包的修改信息;
			-l,--list:程序安装生成的所有文件列表
			-i,--info:查询程序包相关的信息,安装时间,版本号,大小,所属的包组等等
			-c,--configfiles:查询指定的程序提供配置文件,总体的配置文件,不是单用户的配置文件
			-d,--docfiles:查询相关安装包提供的文档,包括文件的帮助文档
			--provides:列出查询的程序提供的所有的CAPABILITY
			-R,--requires:查询指定的程序包的包的依赖关系
			--scripts:查看程序包自带的执行的脚本片段
		用法:
		    -qi PACKAGE:查询安装包的相关信息
			-qf FILE:查询指定文件是由哪个包安装生成的
			-qc PACKAGE:查询安装包的配置文件的位置
			-ql PACKAGE:查询安装包所生成的文件列表
			-qd PACKAGE:查询安装包所提供的技术文档,包括帮助文档等
			-qp{i,c,l,d} PACKAGE_FILE:查询未安装的程序包的安装之后的位置,生成的文件信息,生成的配置文件信息等
	
    e.校验	
		rpm {-V|--verify} [select-options] [verify-options]
		用于校验已经安装的包的信息有没有被修改过。后面跟选项可以对下面的信息选择哪些检查,哪些不去检查
		[root@www Packages]# rpm -V zsh
		S.5....T.    /usr/share/zsh/5.0.2/functions/zfget
		S.5....T.:每一位代表的含义:
			S file Size differs:文件大小有没有被修改
			M Mode differs (includes permissions and file type):文件的模式(包括文件的权限和类型)有无修改
			5 digest (formerly MD5 sum) differs:文件的加密的MD5有没有被修改,代表文件的完整性是否被修改过
			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:caPabilities是否改变
	f.包来源合法性和完整性校验:
	    当一个文件的来源合法性无法验证时,文件的完整性就不用去验证了,因为无法证明来源的合法性,就无法证明文件的完整性;        来源合法性验证:
            数字签名:加密程序包的校验码,		
			来源合法性和完整性校验
				获取并导入信任的包制作的密钥:
				    密钥的获取方式:(以CentOS7为例)
					    安装系统之后在系统的文件里面:/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
						在安装的光盘之中:(例光盘挂载到/media/cdrom下面) /media/cdrom/RPM-GPG-KEY-CentOS-7
						利用可信的网络镜像站点的密钥:http://mirrors.aliyun.com/centos/7.2.1511/os/x86_64/RPM-GPG-KEY-CentOS-7(以阿里云的镜像站点为例)
				验证:
				    安装此组织签名程序时,会自动验证;
					手动验证:rpm -K PACKAGE_FILE		
		文件的加密过程:
			制作者使用单项加密算法提取出该文件包的特征码(特征码定长)
			制作者利用私钥去加密文件的特征码,特征码加密之后附加在文件的最后面
			使用者的公钥的获取:
			使用者,利用制作者的公钥去解密这段特征码,若能解密,文件的来源合法性就可以保证
			使用者用自己的公钥去加密这段特征码,得出的特征码和制作者加密的特征码相同时,就可以保证文件的完整性
		光盘中有系统rpm包的公钥,将rpm公钥添加到系统之中:
            rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-7(光盘下面的RPM-GPG-KEY-CentOS-7)			
			rpm -K PACKAGE_FILE:检查安装包的来源合法性 最后显示OK即表示PACKAGE_FILE的来源合法
	g.数据库的重建:(非特殊要求,不要轻易的对于数据库做任何的操作)
	    rpm的数据库存放的位置:/var/lib/rpm
		安装rpm包之后的操作,而非对于rpm包进行的操作。通过数据库来进行查询,包括rpm包之后的卸载,都需要对于数据库文件的读取进行操作	
		rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
			--initdb:初始化数据库,当前无任何数据库在/var/lib/rpm时,就会创建一个新的数据库,若系统上面存在数据库,该命令不会执行任何操作。
			--rebuilddb:重新构建数据库,通过读取当前系统已经安装的程序宝包进行重新创建
			--dbpath=/path/to/somefile :指明数据库存档的位置

原创文章,作者:sjsir,如若转载,请注明出处:http://www.178linux.com/38858

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code