标签:rpm
一、程序包管理概述
1.程序包语言
(1)系统级开发:一般直接调用硬件
C/C++:httpd, vsftpd, nginx
go语言
(2)应用级开发:java/Python/perl/ruby/php:
java: hadoop, hbase, (基于jvm虚拟机)
Python:openstack, (基于pvm虚拟机)
perl: (perl解释器)
ruby: (ruby解释器)
php: (php解释器)
2.程序语言格式
(1)C/C++程序格式:
源代码:文本格式的程序代码;
编译开发环境:编译器、头文件、开发库
二进制格式:文本格式的程序代码 --> 编译器 --> 二进制格式(二进制程序、库文件、配置文件、帮助文件)
(2)java/python程序格式:
源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
开发环境:编译器、开发库
二进制
3.项目构建工具:
c/c++: make
java: maven
4.程序包管理器:要完成安装、升级、卸载、查询、校验(校验为Linux所有)功能
(1)功能
将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;
(2)组成方式
1)程序包的组成清单(每个程序包都单独实现):文件清单、 安装或卸载时运行的脚本
2)数据库(公共):/var/lib/rpm/
程序包的名称和版本、依赖关系、 功能说明、安装生成的各文件的文件路径及校验码信息...
(3)不同系列Linux所用程序包管理器:
debian:dpt, dpkg, ".deb"
redhat:redhat package manager, rpm, ".rpm"; rpm is package manager;
S.u.S.E:rpm, ".rpm",
Gentoo:ports
ArchLinux:
5.包的命名格式
(1)源代码:name-VERSION.tar.*z
VERSION:major.minor.release 主版本号.次版本号.发行号
(2)RPM包:name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:rpm包的发行号,arch 平台号
6.RHEL制作RPM包时会拆包:主包和支包,方便安装所需要组件而非全部
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function(功能):devel, utils, libs, ...
7.程序包管理器前端工具:自动解决依赖关系;
yum:rhel系列系统上rpm包管理器的前端工具;
apt-get (apt-cache):deb包管理器的前端工具;
zypper:suse的rpm管理器前端工具;
dnf:Fedora 22+系统上rpm包管理器的前端工具,yum的升级版;
8.获取程序包的途径:
(1)系统发行版的光盘或官方的文件服务器(或镜像站点):
http://mirrors.aliyun.com、http://mirrors.sohu.com、http://mirrors.163.com
(2)各个项目自己的官方站点
(3)第三方组织:
1) EPEL等可靠地开源社区组织
2) 搜索引擎:http://pkgs.org、 http://rpmfind.net 、http://rpm.pbone.net
(4)自动编译二进制代码、制作
二、RPM方式管理(CentOS 7.1为例讲解)
rpm命令:rpm [OPTIONS] [PACKAGE_FILE]
安装:-i, --install
升级:-U, --update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, --verify
数据库维护:--builddb, --initdb
前提:挂载官方镜像CentOS-7-x86_64-Everything-1503-01.iso,RPM包位置Packages目录
Last login: Mon Dec 21 06:57:01 2015 from 172.16.250.39
[root@localhost ~]# mkdir /media/cdrom #创建挂载点目录
mkdir: 无法创建目录"/media/cdrom": 文件已存在
[root@localhost ~]# mount /dev/cdrom /media/cdrom #挂载光盘
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]#
1.安装:
(1)rpm {-i|--install} [install-options] PACKAGE_FILE ...
rpm -ivh PACKAGE_FILE ...
GENERAL OPTIONS(通用选项):
-v:verbose,详细信息
-vv:更详细的输出
[install-options]:
-h:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系;不建议;
--replacepkgs:重新安装
--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;
注意:rpm可以自带脚本;
四类:--noscripts
preinstall:安装过程开始之前运行的脚本,%pre , --nopre
postinstall:安装过程完成之后运行的脚本,%post , --nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun
(2)实例演示
1)[root@localhost Packages]#rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm #安装zsh程序,显示过程
2)[root@localhost Packages]# rpm -ivh --test zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost Packages]# rpm -ql zsh
测试安装zsh,并不会真正的安装。查看zsh程序安装所生成的所有文件列表显示无程序
3)[root@localhost Packages]# rpm -ivh --nosignature zsh-5.0.2-7.el7.x86_64.rpm
安装时不检验签名信息,此处则不再显示警告信息,NOKEY
5)[root@localhost Packages]# rpm -ivh --nodigest zsh-5.0.2-7.el7.x86_64.rpm
安装时不检查安装包的完整性,直接强制安装
一般除非在十分确定自己做什么和相信此程序视乎才会使用
6)[root@localhost Packages]# rpm -ivh --test php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm
[root@localhost Packages]# rpm -ivh --nodeps php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm
#测试安装 php-mysqlnd,需要安装php-pdo(x86-64),直接安装会报错,安装不了
#--nodeps 参数会忽略安装包之间的依赖关系,但时安装后很大可能不能正常使用,痴肥依赖关系实际上用不到,如.doc的帮助文档等
2.升级:
(1)rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升级或安装 -Uvh; rpm -Uvh PACKAGE_FILE ...
-F:纯粹升级,必须存在老版本,不支持安装操作 -Fvh rpm -Fvh PACKAGE_FILE ...
--oldpackage:降级;
--force:强制升级;
注意:
1) 不要对内核做升级操作;Linux支持多内核版本并存,可直接安装新版本内核;
2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件 不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
(2)实例演示
1)[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost Packages]# rpm -U zsh-5.0.2-7.el7.x86_64.rpm
#卸载zsh程序包
#用 -F参数升级安装zsh程序细胞,查询结果显示无法安装
# -C 参数则在当不存在原有安装包的时候能够安装该程序
2)将zsh-4.3.10版本升级到zsh-5.0.2版本
[root@localhost /]# rpm -q zsh #查看当前系统上的zsh程序
未安装软件包 zsh #显示当前系统上未安装zsh相关程序
[root@localhost /]# rpm -ivh zsh-4.3.10-9.el6.x86_64.rpm #安装4.3.10版本
警告:zsh-4.3.10-9.el6.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID c105b9de: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-4.3.10-9.el6 ################################# [100%]
[root@localhost /]# rpm -q zsh #显示当前zsh版本信息
zsh-4.3.10-9.el6.x86_64
[root@localhost /]# cd /media/cdrom/Packages/ #移动到光盘镜像5.0版本位置
[root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm #升级安装更高版本
警告:zsh-5.0.2-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
[root@localhost Packages]# rpm -q zsh #显示当前zsh版本信息
zsh-5.0.2-7.el7.x86_64
3.卸载:
(1)rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式
(2)实例演示
1)[root@localhost Packages]#rpm -e --test zsh #测试卸载zsh
[root@localhost Packages]#rpm -ql zsh #查看zsh程序安装所生成的所有文件列表
结论:--test不会真的卸载程序
2)[root@localhost Packages] rpm -e zsh
#卸载程序
4.查询:
(1)rpm {-q|--query} [select-options] [query-options]
[select-options]
PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
-a, --all:查询所有已经安装过的包;
-f FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[query-options]
--changelog:查询rpm包的changlog;
-l, --list:程序安装生成的所有文件列表;
-i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片断;
用法总结:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d
(2)实例演示
1)[root@localhost Packages]# rpm -ql php-mysqlnd
#查询程序安装所以生成的所有文件列表
2)[root@localhost Packages]# rpm -qi zsh
#显示程序的相关信息
显示内容注解:
[root@localhost Packages]# rpm -qi zsh
Name : zsh #安装包名称
Version : 5.0.2 #版本号
Release : 7.el7 #发行号
Architecture: x86_64 #所编译的安装平台64位架构平台
Install Date: 2015年12月22日 星期二 09时30分50秒 #安装日期
Group : System Environment/Shells #属在组:系统环境的shell中的一种
Size : 5834441 #程序大小
License : MIT #许可证:麻省理工大学
Signature : RSA/SHA256, 2014年07月04日 星期五 13时54分12秒, Key ID 24c6a8a7f4a80eb5 #签名
Source RPM : zsh-5.0.2-7.el7.src.rpm #安装源码RPM包
Build Date : 2014年06月10日 星期二 10时47分02秒 #RPM包创建时间
Build Host : worker1.bsys.centos.org #创建的主人
Relocations : (not relocatable) #重新安置
Packager : CentOS BuildSystem <http://bugs.centos.org> #制作人
Vendor : CentOS #卖主
URL : http://zsh.sourceforge.net/ # 文件所在URL
Summary : Powerful interactive shell # 简介:强大的交互式shell
Description : #详细描述
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor. Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements. Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
3)[root@localhost Packages]# rpm -qd zsh #查看包所提供文档位置
4)[root@localhost Packages]# rpm -qc zsh #显示zsh相关的配置文件的位置
5)[root@localhost Packages]# rpm -q --changelog zsh #查询zsh的改变日志
# 从近到远显示出该程序每次改版更新的相关信息
6)[root@localhost Packages]# rpm -q --provides zsh #显示程序包所提供的功能
7)[root@localhost Packages]# rpm -qR zsh #显示安装包所要依赖的库及其他相关
8)[root@localhost Packages]# rpm -q --scripts zsh #显示程序包自带的运行脚本片段
此处有四类脚本中的三类:
#postinstall scriptlet (using /bin/sh):安装完成会后执行脚本
#preuninstall scriptlet (using /bin/sh):卸载开始之前执行脚本
#postuninstall scriptlet (using /bin/sh):卸载完成之后执行脚本
9)[root@localhost Packages]# rpm -q --whatprovides zsh
#显示zsh功能是被哪个程序包所提供
10)[root@localhost Packages]# rpm -q --whatrequires zsh
#查询功能被哪个所依赖,此处zsh未被系统上安装的包做依赖
5.校验:
(1)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 #MD5校验码是否改变
D Device major/minor number mismatch #设备的主次版本号是否错配
L readLink(2) path mismatch # readlink路径是否错配
U User ownership differs #用户本身关系
G Group ownership differs # 用户组本身关系
T mTime differs # 修改时间modify time
P caPabilities differ
(2)实例演示
测试安装的程序的校验信息
[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-23.el7_0.3.x86_64.rpm
[root@localhost Packages]# rpm -V php
# 忽略依赖关系安装php程序,此处为了测试使用
#测试程序的校验信息
6.包来源合法性验正和完整性验证:
(1) 检验方式
数字签名:用私钥加密对应程序的特征码
(2) 获取并导入信任的包制作者的密钥:
1)对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
2)对于官方光盘内秘钥导入:[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-7
此处的RPM-GPG-KEY-CentOS-7为光盘内适配当前系统的光盘所自带的验证秘钥,不同系统不同
当秘钥导入到系统之后,再次安装后会自动执行验证,此时不会警告NOKEY
(3)验证:
1) 安装此组织签名的程序时,会自动执行验证;
2) 手动验正:rpm -K PACKAGE_FILE
在导入秘钥的CentOS7.1上验证
在未导入秘钥的CentOS 6.7 系统上验证
7.数据库重建:
(1)rpm管理器数据库路径:/var/lib/rpm/
查询操作:通过此处的数据库进行;
(2)获取帮助:CentOS命令查询位置不同
CentOS 6:man rpm
CentOS 7:man rpmdb
(3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
[--dbpath DIRECTORY] :指明建立位置
(4)实例演示
1)在指定目录下/rpmdb下初始化一个rpm的数据库
注意:此时的库是没用的,所以大小和原来的库不同
2)查看/var/lib/rpm
本文出自 “许鼎的博客” 博客,转载请与作者联系!
标签:rpm
原文地址:http://xuding.blog.51cto.com/4890434/1727510