程序包管理rpm和yum

Linux程序包管理:
	
	API:Application Programming Interface源码包
		POSIX:Portable OS

		程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接 
			静态编译:
			共享编译:.so

	ABI:Application Binary Interface二进制包
		Windows与Linux不兼容
		库级别的虚拟化:
			Linux: WINE
				ELF
			Windows: Cywin
				exe,msl

	系统级开发 : 性能要求高
		C/C++/go : httpd,vsftpd,nginx
	应用级开发 : 
		java/Python/php/perl/ruby : hadoop,hbase(JVM),openstack(PVM)

	二进制应用程序的组成部分:
		二进制文件、库文件、配置文件、帮助文件

		程序包管理器:
			debian:deb, dpt
			redhat: rpm, rpm
				rpm: Redhat Package Manager
					RPM is Package Manager

			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:release.OS

		如:	zlib-1.2.7-13.el7.i686.rpm
			redis-3.0.2-1.centos7.x64.rmp

			常见的arch:
				x86: i386, i486, i586, i686
				x86_64: x64, x86_64, amd64
				powerpc: ppc
				跟平台无关:noarch

		testapp: 拆包
			testapp-VERSION-ARCH.rpm: 主包
			testapp-devel-VERSION-ARCH.rpm:支包
			testapp-testing-VERSION-ARHC.rpm: 

		包之间:存在依赖关系
			X, Y, Z
				x-->a,b,c
					a-->y

		前段工具:自动决绝依赖关系
			yum:rhel系列系统上rpm包管理器的前端工具;
			apt-get:deb包管理器前端工具;
			zypper: suse上的rpm前端管理工具;
			dnf: Fedora 22+系统上的 rpm包管理器前端管理工具;

	查看二进制程序所依赖的库文件:
		ldd /PATH/TO/BINARY_FILE

	管理及查看本机装载的库文件:
		ldconfig 
			/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系;

			配置文件为:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
			缓存文件:/etc/ld.so.cache

	程序包管理:
		功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作;

		1、程序的组成组成清单 (每个包独有)
			文件清单
			安装或卸载时运行的脚本
		2、数据库(公共)
			程序包名称及版本
			依赖关系;
			功能说明;
			安装生成的各文件的文件路径及校验码信息;
			等等等

			/var/lib/rpm

	管理程序包的方式:
		使用包管理器:rpm
		使用前端工具:yum, dnf

	获取程序包的途径:
		(1) 系统发版的光盘或官方的服务器;
			CentOS镜像:
				http://mirrors.aliyun.com
				http://mirrors.sohu.com
				http://mirrors.163.com
				http://mirror.hust.edu.cn
		(2) 项目官方站点
			http://zabbix.com
		(3) 第三方组织:
			Fedora-EPEL
			搜索引擎:
				http://pkgs.org
				http://rpmfind.net
				http://rpm.pbone.net
		(4) 自己制作

	建议:  检查其合法性
			来源合法性;
			程序包的完整性;


CentOS系统上rpm命令管理程序包:
	安装、卸载、升级、查询、校验、数据库维护
		-i:安装
		-U:升级
		-e:卸载
		-q:查询
		-V:校检
		--builddb,--initdb:数据库维护
	安装:INSTALL  OPTIONS

		rpm {-i|--install} [install-options] PACKAGE_FILE ...
			-v: verbose,详细详细
			-vv: 更为详细的输出
			-h: 以#显示程序包管理执行进度;每个#表示2%的进度

			rpm -ivh PACKAGE_FILE ...

				[install-options]
					--test: 测试安装,但不真正执行安装过程;dry run模式;
					--nodeps:忽略依赖关系;
					--replacepkgs: 重新安装;

					--nosignature: 不检查来源合法性;即密钥;
					--nodigest:不检查包完整性;

					--noscipts:不执行程序包脚本片断;
						%pre: 安装前脚本; --nopre
						%post: 安装后脚本; --nopost
						%preun: 卸载前脚本; --nopreun
						%postun: 卸载后脚本;  --nopostun

	升级: UPGRADE OPTIONS

		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)后保留;

	查询: QUERY OPTIONS

		rpm {-q|--query} [select-options] [query-options]
		PACKAGE SELECTION OPTIONS:
		[select-options]
			-a: 所有包
				[root@study_centos6 ~]# rpm -qa | grep "^zsh"
				zsh-4.3.11-9.el6_10.x86_64

			-f: 查看指定的文件由哪个程序包安装生成
				[root@study_centos6 ~]# rpm -qf /etc/fstab
				setup-2.8.14-23.el6.noarch

			-p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;

			--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
			--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
		PACKAGE QUERY OPTIONS:
		[query-options]
			--changelog:查询rpm包的changlog
				# rpm -q --changelog bash
			-c: 查询程序的配置文件
			-d: 查询程序的文档
			-i: information
			-l: 查看指定的程序包安装后生成的所有文件;
				rpm -ql bash
			--scripts:程序包自带的脚本片断
			-R: 查询指定的程序包所依赖的CAPABILITY;
			--provides: 列出指定程序包所提供的CAPABILITY;

		用法:
			-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
			-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
			-qa

	卸载:ERASE OPTIONS

		rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts][--notriggers] [--test] PACKAGE_NAME ...

			--allmatch: 卸载所有匹配指定名称的程序包的个版本
			--nodeps:
			--test:测试卸载;

    校验:VERIFY OPTIONS
    	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
	       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

	包来源合法性验正及完整性验正:
		完整性验正:SHA256
		来源合法性验正:RSA

		公钥加密:
			对称加密:加密、解密使用同一密钥;
			非对称加密:密钥是成对儿的;
				public key: 公钥,公开所有人
				secret key: 私钥, 不能公开


		导入所需要公钥:
			rpm --import /PATH/FROM/GPG-PUBKEY-FILE

			CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
				[root@study_centos6 ~]# ls /etc/pki/rpm-gpg/
				RPM-GPG-KEY-CentOS-6  RPM-GPG-KEY-CentOS-Debug-6  RPM-GPG-KEY-CentOS-Security-6  RPM-GPG-KEY-CentOS-Testing-6
		验正:
			(1)安装此组织签名的程序时,会自动执行验正;
			(2)手动验正:rpm -K package_file

	数据库重建:
		centos6: man rpm
		centos7: man rpmdb 

		rpm {--initdb|--rebuilddb}
			initdb: 初始化
				如果事先不存在数据库,则新建之;否则,不执行任何操作;

			rebuilddb:重建
				无论当前存在与否,直接重新创建数据库;

回顾:Linux程序包管理的实现、rpm包管理器

	rpm命令实现程序管理:
		安装:-ivh, --nodeps, --replacepkgs
		卸载:-e, --nodeps
		升级:-Uvh, -Fvh, --nodeps, --oldpackage
		查询:-q, -qa, -qf, -qi, -qd, -qc, -q --scripts, -q --changlog, -q --provides, -q --requires
		校验:-V

		导入GPG密钥:--import, -K, --nodigest, --nosignature
		数据库重建:--initdb, --rebuilddb
  
Linux程序包管理(2)

	CentOS: yum, dnf

	YUM: yellow dog, Yellowdog Update Modifier

	yum repository: yum repo
		存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata);

		文件服务器:
			ftp://
			http://
			nfs://
			file:///

	yum客户端:
		配置文件:
			/etc/yum.conf:为所有仓库提供公共配置
			/etc/yum.repos.d/*.repo:为仓库的指向提供配置

		仓库指向的定义:
		[repositoryID]
		name=Some name for this repository
		baseurl=url://path/to/repository/
		enabled={1|0}
		gpgcheck={1|0}
		gpgkey=URL
		enablegroups={1|0}
		failovermethod={roundrobin|priority}
			默认为:roundrobin,意为随机挑选;
		cost=
			默认为1000


		教室里的yum源:http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-x86_64/
		CentOS 6.6 X84_64 epel: http://172.16.0.1/fedora-epel/6/x86_64/

	yum命令的用法:
		yum [options] [command] [package ...]

       command is one of:
        * install package1 [package2] [...]
        * update [package1] [package2] [...]
        * update-to [package1] [package2] [...]
        * check-update
        * upgrade [package1] [package2] [...]
        * upgrade-to [package1] [package2] [...]
        * distribution-synchronization [package1] [package2] [...]
        * remove | erase package1 [package2] [...]
        * list [...]
        * info [...]
        * provides | whatprovides feature1 [feature2] [...]
        * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
        * makecache
        * groupinstall group1 [group2] [...]
        * groupupdate group1 [group2] [...]
        * grouplist [hidden] [groupwildcard] [...]
        * groupremove group1 [group2] [...]
        * groupinfo group1 [...]
        * search string1 [string2] [...]
        * shell [filename]
        * resolvedep dep1 [dep2] [...]
        * 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]
        * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
        * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
        * check
        * help [command]

    显示仓库列表:
    	repolist [all|enabled|disabled]

    显示程序包:
    	list
    		# yum list [all | glob_exp1] [glob_exp2] [...]
    		# yum list {available|installed|updates} [glob_exp1] [...]

    安装程序包:
    	install package1 [package2] [...]

    	reinstall package1 [package2] [...]  (重新安装)

    升级程序包:
    	update [package1] [package2] [...]

    	downgrade package1 [package2] [...] (降级)

    检查可用升级:
    	check-update

    卸载程序包:
    	remove | erase package1 [package2] [...]

    查看程序包information:
    	info [...]

    查看指定的特性(可以是某文件)是由哪个程序包所提供:
    	provides | whatprovides feature1 [feature2] [...]

    清理本地缓存:
    	clean [ packages | metadata | 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 [...]

    如何使用光盘当作本地yum仓库:
    	(1) 挂载光盘至某目录,例如/media/cdrom
    		# mount -r -t iso9660 /dev/cdrom /media/cdrom
    	(2) 创建配置文件
    	[CentOS7]
    	name=
    	baseurl=
    	gpgcheck=
    	enabled=

    yum的命令行选项:
    	--nogpgcheck:禁止进行gpg check;
    	-y: 自动回答为“yes”;
    	-q:静默模式;
    	--disablerepo=repoidglob:临时禁用此处指定的repo;
    	--enablerepo=repoidglob:临时启用此处指定的repo;
    	--noplugins:禁用所有插件;

    yum的repo配置文件中可用的变量:
    	$releasever: 当前OS的发行版的主版本号;
    	$arch: 平台;
    	$basearch:基础平台;
    	$YUM0-$YUM9:自定义变量

    	http://mirrors.magedu.com/centos/$releasever/$basearch/os

    创建yum仓库:
    	createrepo [options] <directory>

  

posted @ 2018-11-22 12:42  找工作好爽啊哈哈哈呜  阅读(218)  评论(0编辑  收藏  举报