写在前面-本节命令总览:rpm –i[vh] [ -–test –-nodeps  --replacepkgs –nosignature –nodigest ]

rpm –[UF] [vh] [--oldpackages  --force] rpm –e[vh] [--allmatches –nodeps --test]

rpm –q[-p –a -f] [--rpovides --whatprovides  --whatrequires ] [--changelog –l –i –c –d –R--scripts]

rpm –V     rpm–initdb  --rebuilddb

 

centos之rpm

RPM包管理的优点:

可以安装、除、升和管理

可以把自己做的程序包打包成rpm包

能利用名GPG和MD5检测软件包的来源安全性和内容完整性。

性的检查,解决由于不了解依性而件安装完不能运行的棘手问题。

 

RPM的使用权限

RPM件的安装、除、更新只有root权限才能使用;查询功能任何用都可以操作;如果普通用户拥有安装目的权限,也可以行安装;

 

rpm包命名格式:

软件包的全名:name-version-release.arch.rpm

name件名字

version:件的行版本号,包括主版本号major,次版本号minor,行号release

release.arch或者release.os.arch 是指rpm包的行号。

release指rpm包的版本,os指使用操作系,arch指使用CPU类型;注意os可以省略不写。

 

以下面两个例子解:

zabbix-2.4.6-2.el7.x86_64.rpm

redis-3.0.2-2.centos7.x86_x64.rpm

name:zabbix或redis

version:2.4.6或3.0.2

release:2

os:el7或centos7

arch:x86_x64

包格式:.rpm

 

拆包:把rpm包拆分成功能比较单一的支包,下面是支包的命名格式,只是在name后面加了个function

支包命名格式:name-function-VERSION-release.arch.rpm

例:zabbix-get-2.4.6-2.el7.x86_64.rpm

 

 

取程序包的途径

(1) 统发行版的光或官方的文件服器(或像站点),如下国内几家比可靠的站点:

http://mirrors.aliyun.com,

http://mirrors.sohu.com,

http://mirrors.163.com

(2) 目的官方站点

(3) 第三方组织

(a) EPEL

(b) 用搜索引擎搜索

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

(4) 动动手做rpm包,丰衣足食

 

:安装前请务必注意以下几点,否早晚你会一次坑

1检查其合法性;

2、来源合法性;

3、程序包的完整性;

 

rpm包的依关系

程序性能更好,工程把程序包做得短小精悍,功能专业且但一。但是由于构比较简单,需要依其他程序包提供的境才能运行起来,就形成了依关系。

 

1安装:-i

rpm用法模板:rpm {-i|--install}[install-options] PACKAGE_FILE ...

 

GENERALOPTIONS:常用选项

-v:verbose,安装提供详细安装程的信息

-vv:安装提供更详细出信息

 

rpm  -ivh  PACKAGE_FILE ...

[root@yph7 ~]# rpm -ivh./zsh-5.0.2-7.el7_1.2.x86_64.rpm 
警告:./zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY
准备中...                         ################################# [100%]
正在升级/安装...
  1:zsh-5.0.2-7.el7_1.2             ################################# [100%]


install-options:安装选项

-h:hash marks安装时输度条;每个#表示2%的度;如上面例子所示。

--test测试安装,检查告依关系及冲突消息等,其并没有真正安装,可以理解安装; 

[root@yph7 ~]#rpm -ivh --test zabbix-2.4.6-1.el7.x86_64.rpm 
警告:zabbix-2.4.6-1.el7.x86_64.rpm: 头V4DSA/SHA1 Signature, 密钥ID 79ea5ed4: NOKEY
准备中...                         ################################# [100%]
[root@yph7 ~]# rpm -qi zabbix ----------虽然已经提示安装成功,但只是测试,并没有安装
未安装软件包 zabbix    
[root@yph7 ~]# rpm -ivh --testbooth-0.2.0-31.1.x86_64.rpm 
警告:booth-0.2.0-31.1.x86_64.rpm: 头V3RSA/SHA1 Signature, 密钥ID 17280ddf: NOKEY
错误:依赖检测失败:
      cluster-glue-libs>= 1.0.6 被 booth-0.2.0-31.1.x86_64 需要------有很多依赖关系
      libplumb.so.2()(64bit)被 booth-0.2.0-31.1.x86_64 需要
      libplumbgpl.so.2()(64bit)被 booth-0.2.0-31.1.x86_64 需要
      pacemaker>= 1.1.8 被 booth-0.2.0-31.1.x86_64 需要


--nodeps:安装忽略依关系;不过这样类似强制安装,即便安装成功也未必能使用,所以不建议这么做;

           [root@yph7 ~]# rpm -ivh --nodepsbooth-0.2.0-31.1.x86_64.rpm

--replacepkgs:重新安装 -----------可以用来重新安装被除的程序包的配置文件

[root@yph7 ~]# rm -f /bin/zsh
[root@yph7 ~]# ll /bin/zsh
ls: 无法访问/bin/zsh: 没有那个文件或目录  ---------------/bin/zsh已被删除
[root@yph7 ~]# rpm -ivh --replacepkgszsh-5.0.2-7.el7_1.2.x86_64.rpm 
警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY
准备中...                         ################################# [100%]
正在升级/安装...
  1:zsh-5.0.2-7.el7_1.2             ################################# [100%]
[root@yph7 ~]# ll /bin/zsh       --------------------/bin/zsh又重新安装了回来
-rwxr-xr-x. 1 root root 711768 11月  3 21:49 /bin/zsh


--nosignature:不检查名信息,不检查来源合法性;

上个例子安装zsh提示“警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm:V3 RSA/SHA256 Signature, ID f4a80eb5: NOKEY”,指没有验证rpm包的合法性,下面取消验证直接安装

[root@yph7 ~]# rpm -iv --nosignaturezsh-5.0.2-7.el7_1.2.x86_64.rpm 
软件包准备中...           -------------这次安装没有再提示警告信息。
zsh-5.0.2-7.el7_1.2.x86_64


--nodigest:不检查包完整性信息,直接安装,但很可能安装失,或不能使用。除非自己已包的完整性。

[root@yph7~]# rpm -ivh --nodigest zsh-5.0.2-7.el7_1.2.x86_64.rpm

 

2-U  -F

rpm{-U|--upgrade} [install-options] PACKAGE_FILE ...

rpm{-F|--freshen} [install-options] PACKAGE_FILE ...

 

-U:升或安装;可以用来升rpm包,也可以用来安装rpm包。

rpm  -UvhPACKAGE_FILE ...

[root@yph7 ~]# rpm –e zsh       ---------- 先卸载zsh,下面在安装
[root@yph7 ~]# rpm -Uvzsh-5.0.2-7.el7_1.1.x86_64.rpm    用“rpm -Uv”来安装rpm包
警告:zsh-5.0.2-7.el7_1.1.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY
软件包准备中...
zsh-5.0.2-7.el7_1.1.x86_64
[root@yph7 ~]# rpm -Uvzsh-5.0.2-7.el7_1.2.x86_64.rpm  ---------用“rpm -Uv”来升级zsh
警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY
软件包准备中...
zsh-5.0.2-7.el7_1.2.x86_64   ---------把“…1.1.x86_64”升级到“1.2.x86_64”版本
zsh-5.0.2-7.el7_1.1.x86_64


-F:升,只能用来升,不能用来安装,如果程序没有安装,是不能拿“rpm -F”来升的,升方法与“rpm -U”相同

rpm  -Fvh PACKAGE_FILE ...

[root@yph7 ~]# rpm -Fv zsh-5.0.2-7.el7_1.2.x86_64.rpm
警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY
软件包准备中...
zsh-5.0.2-7.el7_1.2.x86_64  ---------从1.1版本升级到1.2版本
zsh-5.0.2-7.el7_1.1.x86_64


--oldpackage:降;如果升发现新版本令自己十分不意,可以用来回旧版本。

[root@yph7 ~]# rpm -Uvh --oldpackage zsh-5.0.2-7.el7_1.1.x86_64.rpm-----把1.2版本降级到1.1
警告:zsh-5.0.2-7.el7_1.1.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY
准备中...                         ################################# [100%]
正在升级/安装...
  1:zsh-5.0.2-7.el7_1.1             ################################# [ 50%]
正在清理/删除...
  2:zsh-5.0.2-7.el7_1.2             ################################# [100%]


--force:强制升,如果升后依关系不能足,就不能正常升,可以强制升

           [root@yph7 ~]# rpm -Uvh --forcezsh-5.0.2-7.el7_1.2.x86_64.rpm  强制从1.1版本升到1.2版本

注意:(1) 不要内核做升操作;Linux支持多内核版本并存,因此,直接安装新版本内核;

(2) 如果某原程序包的配置文件安装后曾被修改,升级时,会认为你修改的信息是很重要的,所以新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

 

3)卸载 –e

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

[root@yph7 ~]# rpm -evh zsh
准备中...                         ################################# [100%]
正在清理/删除...
  1:zsh-5.0.2-7.el7_1.2             ################################# [100%]


--allmatches:卸所有匹配指定名称的程序包的所有版本,因有的程序包可能多个版本并存,这样可以同

[root@yph7~]# rpm -evh --allmatches zsh 

--nodeps:卸载时忽略依关系,不管三七二十三,也不后果是否重,就是卸

           [root@yph7 ~]# rpm -evh --nodeps zsh

--test测试,dry run模式,只是模拟测试,并没有正真卸

[root@yph7 ~]# rpm -e --test zsh 
[root@yph7 ~]# rpm -ql zsh-------------并没有真正卸载
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin


 

(4)查询:-q

rpm {-q|--query}[select-options] [query-options]

 

select-options选择选项

rpm  -q  PACKAGE_NAME查询指定的程序包是否已安装,及其版本;

      [root@yph7 ~]# rpm -q zsh

zsh-5.0.2-7.el7_1.2.x86_64

-a,--all查询所有已安装的包;

      [root@yph7 ~]# rpm –qa ----------能列出电脑上所有安装的包,太多了我就不列出了

[root@yph7 ~]# rpm -qa | grep "^z"  ----列出已经安装的并且以z开头的程序包
zip-3.0-10.el7.x86_64
zenity-3.8.0-4.el7.x86_64
zlib-1.2.7-13.el7.x86_64


-f FILE查询指定的文件由哪个程序包安装生成;

[root@yph7 ~]# rpm -q -f /usr/share/zsh/5.0.2/scripts

zsh-5.0.2-7.el7_1.2.x86_64

-p,--package PACKAGE_FILE:用于实现对未安装的程序包查询操作;具体查询什么后面会详细演示。

[root@yph7 ~]# rpm -q -p zabbix-2.4.6-1.el7.x86_64.rpm 
警告:zabbix-2.4.6-1.el7.x86_64.rpm: 头V4DSA/SHA1 Signature, 密钥ID 79ea5ed4: NOKEY
zabbix-2.4.6-1.el7.x86_64


 

query-options查询选项

--changelog查询rpm包的changlog;

[root@yph7 ~]# rpm -q --changelog zsh
* 一 10月 262015 Kamil Dudka <kdudka@redhat.com> - 5.0.2-7.el7_1.2
- fix SIGSEGV of the syntax check in ksh emulationmode (#1222867)
………………………………………………………..还有很多,不一一列举


-l,--list:程序安装生成的所有文件列表;

[root@yph7 ~]# rpm -ql bash | wc -l

109            -----------------------------可以看到bash程序包一共生成109个文件

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

[root@yph7 ~]# rpm -q -i zsh
Name        :zsh
Version     :5.0.2
Release     :7.el7_1.2
Architecture: x86_64
………………………………..


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

[root@yph7 ~]# rpm -q -c zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout -----------------------还有很多,不一一列举


-d,--docfiles查询指定的程序包提供的文档;

[root@yph7 ~]# rpm -q -d zsh
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS-----------------------还有很多,不一一列举


--provides:列出指定的程序包提供的所有的CAPABILITY;

[root@yph7 ~]# rpm -q --provides zsh
config(zsh) = 5.0.2-7.el7_1.2
zsh = 5.0.2-7.el7_1.2
zsh(x86-64) = 5.0.2-7.el7_1.2


--whatprovidesCAPABILITY查询指定的CAPABILITY由哪个程序包提供;

[root@yph7 ~]#rpm -q --whatprovides 'config(zsh)'
zsh-5.0.2-7.el7_1.2.x86_64
[root@yph7 ~]#rpm -q --whatprovides config\(zsh\)
zsh-5.0.2-7.el7_1.2.x86_64


--whatrequiresCAPABILITY查询指定的CAPABILITY被哪个包所依

[root@yph7 ~]# rpm -q --whatrequires bash | wc -l

9                 -------------一共有9个依bash功能

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

[root@yph7~]# rpm -q -R zsh

--scripts看程序包自的脚本片断;

[root@yph7~]# rpm -q --scripts zsh

查询未安装包的信息

-qpi PACKAGE_FILE,查询未安装的程序包的版本,大小,包等信息

[root@yph7 ~]# rpm -qpi zabbix-2.4.6-1.el7.x86_64.rpm
Name        :zabbix
Version     :2.4.6
Release     :1.el7
Architecture: x86_64
Install Date: (not installed)


 -qpl PACKAGE_FILE, 查询未安装包能够生成的文件列表

[root@yph7 ~]# rpm -qpl zabbix-2.4.6-1.el7.x86_64.rpm
警告:zabbix-2.4.6-1.el7.x86_64.rpm: 头V4DSA/SHA1 Signature, 密钥ID 79ea5ed4: NOKEY
/etc/zabbix
/usr/lib/tmpfiles.d/zabbix.conf


-qpcPACKAGE_FILE, ... 查询未安装包能够生成的配置文件

[root@yph7 ~]#rpm -qpc booth-0.2.0-31.1.x86_64.rpm

警告:booth-0.2.0-31.1.x86_64.rpm:V3 RSA/SHA1 Signature, ID 17280ddf: NOKEY

/etc/booth/booth.conf.example

 

 

5)校验:-V

rpm {-V|--verify}[select-options] [verify-options]

 

[root@yph7 ~]#rpm -V zsh
[root@yph7~]#          -------------------没有消息,说明没有不安全的信息
 
[root@yph7 ~]#file /usr/share/zsh/5.0.2/functions/zfget---- 查看一下zsh的一个文件,发现是text类型
/usr/share/zsh/5.0.2/functions/zfget:ASCII text
[root@yph7 ~]#vim /usr/share/zsh/5.0.2/functions/zfget ------就拿vim 修改一下里面内容
[root@yph7 ~]#rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zfget  --------再次检测就检测出问题了


S明大小改   5:md5特征码变化  T: Tmtime改

具体检测结果表示的信息:

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   最近一次修改时间mtime

P: caPabilities differ   能力

 

--nofiles 。Don't verify any attributes of package files.不检查文件的参数

 [root@yph7 ~]# rpm -V --nofiles zsh 

[root@yph7 ~]#    -------才我修改的那个文件就没有示出来

--nodigest   Don't verify package or header digests whenreading.检测完整性

--nodeps   Don't verify dependencies of packages.检测关系

--nosignature  检测签名信息,即来源合法性

 

包来源合法性正和完整性

来源合法性正:

者用向加密提取程序包的特征,然后用称加密方式来加密程序包特征。开者私加密特征,用可以拿与之配的公,配成功个特征是原版的,个文件也就是原版的。

完整性正:

验证来源合法性成功后,再来验证内容完整性。用拿与开者相同的向加密算法提取程序包的特征,然后比自己算出的特征与用公解密出的特征是否相同,如果相同明程序包内容是完整的。如果程序包内容被改,特征必定会改这样一来,就能个包是被人修改的。

 

 

取并入信任的包制作者的

的位置:以centos7例,一般装完系后,在下面目下有密

[root@yph7 ~]# ls/etc/pki/rpm-gpg/

RPM-GPG-KEY-CentOS-7

 

于CentOS行版来入公的方法如下:

[root@yph7 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

入公后再安装程序就不会再警告了

[root@yph7 ~]#rpm -ivh zsh-5.0.2-7.el7_1.1.x86_64.rpm 
准备中...                          #################################[100%]
正在升级/安装...
   1:zsh-5.0.2-7.el7_1.1              #################################[100%]


入公后手动验正rpm包的合法性和完整性:

[root@yph7 ~]#rpm -K zsh-5.0.2-7.el7_1.2.x86_64.rpm

zsh-5.0.2-7.el7_1.2.x86_64.rpm:rsa sha1 (md5) pgp md5 确定

pgp来源合法性没问题;md5确定完整性也没问题

 

6数据重建

rpm管理器数据路径:/var/lib/rpm/几乎所有的查询操作,都是通的数据库进行。

例如卸某程序个数据记录着要卸的文件在哪个路径下。

 

若要取相关帮助,用下列方法:

CentOS 6:man rpm

CentOS 7:man rpmdb

 

rpm{--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

--initdb:初始化数据,当前无任何数据始化建一个新的;当前有行任何操作;

[root@yph7 rpm]# cd /var/lib/rpm 
[root@yph7 rpm]# rpm –initdb
[root@yph7 rpm]# ls
Basenames    __db.001  __db.003  Group      Name          Packages     Requirename  Sigmd5
Conflictname __db.002  Dirnames  Installtid Obsoletename  Providename  Sha1header  Triggername


--rebuilddb:重新构建,通过读取当前系上所有已安装的程序包行重新建;

[root@yph7 rpm]# rpm --rebuilddb
[root@yph7 rpm]# ls  ----------------发现少了一些文件
Basenames    Dirnames  Installtid  Obsoletename Providename  Sha1header  Triggername
Conflictname Group     Name        Packages      Requirename  Sigmd5


[root@yph7 rpm]# rpm --initdb
[root@yph7 rpm]# ls           -----------------少的文件又回来了
Basenames    __db.001  __db.003  Group      Name          Packages     Requirename  Sigmd5
Conflictname __db.002  Dirnames  Installtid Obsoletename  Providename  Sha1header  Triggername


 

 

rpm可以自脚本

preinstall:安装程开始之前运行的脚本,%pre , 不行此脚本用--nopre

postinstall:安装程完成之后运行的脚本,%post , 不行此脚本用--nopost

preuninstall:卸载过程真正开始行之前运行的脚本,%preun, 不行此脚本用--nopreun

postuninstall:卸载过程完成之后运行的脚本,%postun , 不行此脚本用--nopostun

四类脚本都不行:用--noscripts