rpm使用

概述

RPM Red Hat PackageManager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理;在Fedora RedhatMandrivaSuSEYellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用;

RPM包里面都包含什么?里面包含可执行的二进制程序,这个程序和Windows的软件包中的.exe文件类似是可执行的;RPM包中还包括程序运行时所需要的文件,这也和Windows的软件包类似,Windows的程序的运行,除了.exe文件以外,也有其它的文件;

一个RPM 包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系;依赖关系并不是Linux特有的,Windows操作系统中也是同样存在的;比如我们在Windows系统中运行3D游戏,在安装的时候,他可能会提示,要安装Direct 9 LinuxWindows原理是差不多的。

 

 

命名格式

源代码命名格式:

name-VERSION.tar.gz

VERSIONmajor.minor.release

 

例如:

nginx-1.4.7.tar.gz

1:是主版本号

4:是次版本号

7:是发行号

 

rpm包命名格式:

name-VERSION-release.arch.rpm

VERSIONmajor.minor.release

release.archrpm包的发行号

archetecture(架构或平台):i386,x64(amd64), ppc, noarch

 

例如:

zsh-4.3.10-7.el6.x86_64.rpm

4:是主版本号

3:是次版本号

10:修订

7:是第几次发布版本

el6:适用于RHEL6或兼容Centos6

x86_64CPU架构系统平台

 

el6 enterprice linux  6   RHEL 6centos 6

el5 rhel5

 

redis-3.0.2.tar.gz -->redis-3.0.2-1.centos7.x64.rpm

 

拆包:主包和支包

主包:name-VERSION-release.arch.rpm

支包:name-function-VERSION-release.arch.rpm

functiondevel(开发), utils(工具程序), libs(库文件), ...

 

 

前端工具:自动解决依赖关系;

  • yumrhel系列系统上rpm包管理器的前端工具;

  • apt-get (apt-cache)deb包管理器的前端工具;

  • zyppersuserpm管理器前端工具;

  • dnfFedora 22+系统上rpm包管理器的前端工具;

 

程序包管理器的组成:

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

 

1、程序包的组成清单(每个程序包都单独实现);

  1. 文件清单

  2. 安装或卸载时运行的脚本

 

2、数据库(公共)

  1. 程序包的名称和版本;

  2. 依赖关系;

  3. 功能说明;

  4. 安装生成的各文件的文件路径及校验码信息;

  5. 等等等

 

rpm包的数据库文件:/var/lib/rpm/

[root@Linux_1 mysql]# cd /var/lib/rpm/

[root@Linux_1 rpm]# ls

Basenames    Dirnames      Packages        Sha1header

Conflictname Filedigests   Providename     Sigmd5

__db.001     Group         Provideversion  Triggername

__db.002     Installtid    Pubkeys

__db.003     Name          Requirename

__db.004     Obsoletename  Requireversion

获取程序包的途径:

  1. 系统发行版的光盘或官方的文件服务器(或镜像站点):

  2. a)        http://mirrors.aliyun.com,

  3. b)       http://mirrors.sohu.com,

  4. c)        http://mirrors.163.com

  5. 项目的官方站点。例如:http://www.zabbix.com/

  6. 第三方组织:

i.             EPEL

ii.             搜索引擎

  1. 1.        http://pkgs.org

  2. 2.        http://rpmfind.net

  3. 3.        http://rpm.pbone.net

iii.             (4) 自己制作rpm

 

 

建议:检查其合法性

  • 来源合法性;

  • 程序包的完整性;

 

什么是EPEL

如果既想获得 RHEL 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux)正好适合你。EPEL(http://fedoraproject.org/wiki/EPEL)是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOSScientific Linux 等提供高质量软件包的项目。

 

rpm命令:

rpm [OPTIONS]  [PACKAGE_FILE]

  • 安装:-i, --install

  • 升级:-U, --update, -F, --freshen

  • 卸载:-e, --erase

  • 查询:-q, --query

  • 校验:-V, --verify

  • 数据库维护:--builddb, --initdb

 

提示:

-Fvh是升级RPM包的命令,它表示如果后面的软件包没有安装在系统上,则这个软件包不会安装。也就是说只有安装到系统上的软件包才会被升级。

 

安装:

rpm {-i|--install} [install-options]PACKAGE_FILE ...

 

GENERAL OPTIONS

  • -vverbose,详细信息

  • -vv:更详细的输出

 

[install-options]

  • -hhash marks输出进度条;每个#表示2%的进度;

  • --test:测试安装,检查并报告依赖关系及冲突消息等;

  • --nodeps:忽略依赖关系;不建议;

  • --replacepkgs:重新安装(如果文件被修改错了,重新安装并不会覆盖这些文件,需要将这些文件删除之后再重新安装才能够覆盖还原。)

  • --justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。

  • --prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin,/etc 等目录, 就可以使用『 --prefix /usr/local 』来处理了。

  • --replacefiles 使用时机: 如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。

  • 危险性: 覆盖的动作是无法复原的!所以,你必须要很清楚的知道被覆盖的文件是真的可以被覆盖喔!否则会欲哭无泪!

 

示例:安装rpm

[root@Linux_11 mnt]# rpm -ivhPackages/zsh

error: open of Packages/zsh failed: 没有那个文件或目录

[root@Linux_11 mnt]# rpm -ivhPackages/zsh-4.3.10-7.el6.i686.rpm

Preparing...               ########################################### [100%]

提示

"  安装包的时候使用的是PACKAGE_FILE,指定安装软件包的完整路径和完整名称。

 

 

示例:重新安装

 

 

注意:rpm可以自带脚本;

四类:

  • preinstall:安装过程开始之前运行的脚本,%pre --nopre

  • postinstall:安装过程完成之后运行的脚本,%post , --nopost

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

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

 

  • --noscripts:不运行脚本

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

  • --nodigest:不检查包完整性信息;

依赖于制作者的公钥

 

升级与降级:

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

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

 

  • -U:升级或安装,如果事先安装了老版本包则升级,没有安装老版本包则安装此包

  • -F:升级,如果事先没有安装老版本的包则不升级

  • --oldpackage:降级;

  • --force:强制升级;

 

 

 

注意:

  • 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;

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

卸载:

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

 

  • -e:卸载包

  • --allmatches:卸载所有匹配指定名称的程序包的各版本;

  • --nodeps:忽略依赖关系

  • --test:测试卸载,dry run模式

 

查询:

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

 

[select-options]

  • -a, --all:查询所有已经安装过的包;

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

  • -p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;

  • --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;查询提供了 CAPABILITY 功能的软件包。

  • --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;查询所有需要 CAPABILITY 功能才能运行的软件包。

 

[query-options]

  • --changelog:查询rpm包的历史变更信息changlog

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

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

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

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

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

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

  • --scripts:查看程序包自带的脚本片断;

 

 

示例:查看所有已经安装的软件包

[root@Linux_1 Packages]# rpm �Cqa  #查看所有已经安装的rpm

setuptool-1.19.9-4.el6.i686

giflib-4.1.6-3.1.el6.i686

pidgin-2.7.9-11.el6.i686

libgsf-devel-1.14.15-5.el6.i686

libhangul-0.0.10-1.el6.i686

pyxdg-0.18-1.el6.noarch

keyutils-1.4-4.el6.i686

cheese-2.28.1-8.el6.i686

……

 

 

示例:查询某个软件包是否安装

[root@Linux_1 Packages]# rpm -q bash  #仅查询bash包安装了没有,安装了就显示出包名

bash-4.1.2-15.el6_4.i686

 

 

示例:查询某一文件属于哪个软件包

[root@Linux_1 Packages]# rpm -qf /usr/bin/crontab

cronie-1.4.4-12.el6.i686

 

 

示例:查询一个已经安装的软件包包含哪些文件

[root@Linux_1 Packages]# rpm -ql rpcbind

/etc/rc.d/init.d/rpcbind

/sbin/rpcbind

/usr/sbin/rpcinfo

/usr/share/doc/rpcbind-0.2.0

/usr/share/doc/rpcbind-0.2.0/AUTHORS

/usr/share/doc/rpcbind-0.2.0/ChangeLog

/usr/share/doc/rpcbind-0.2.0/README

/usr/share/man/man8/rpcbind.8.gz

/usr/share/man/man8/rpcinfo.8.gz

/var/cache/rpcbind

 

 

示例:查询一个已经安装的软件包的详细信息

[root@Linux_1 Packages]# rpm -qi bash

Name        : bash                         Relocations: (notrelocatable)

Version     : 4.1.2                             Vendor: CentOS

Release     : 15.el6_4                      Build Date: 20130718星期四 211724

Install Date: 20151114 星期六 235134      Build Host: c6b10.bsys.dev.centos.org

Group       : SystemEnvironment/Shells     Source RPM:bash-4.1.2-15.el6_4.src.rpm

Size        : 3104719                          License: GPLv3+

Signature   : RSA/SHA1, 20130718星期四 214609, Key ID 0946fca2c105b9de

Packager    : CentOSBuildSystem <http://bugs.centos.org>

URL         :http://www.gnu.org/software/bash

Summary     : The GNU BourneAgain shell

Description :

The GNU Bourne Again shell (Bash) is a shell or command language

interpreter that is compatible with the Bourne shell (sh). Bash

incorporates useful features from the Korn shell (ksh) and the Cshell

(csh). Most sh scripts can be run by bash without modification.

 

 

示例:查看某一个已经安装的软件包的配置文件有哪些

[root@Linux_1 Packages]# rpm -qc vsftpd

/etc/logrotate.d/vsftpd

/etc/pam.d/vsftpd

/etc/vsftpd/ftpusers

/etc/vsftpd/user_list

/etc/vsftpd/vsftpd.conf

 

 

 

示例:查看一个已经安装的包自带的说明说明文档

[root@Linux_1 Packages]# rpm -qdnfs-utils

/usr/share/doc/nfs-utils-1.2.3/ChangeLog

/usr/share/doc/nfs-utils-1.2.3/INSTALL

/usr/share/doc/nfs-utils-1.2.3/KNOWNBUGS

/usr/share/doc/nfs-utils-1.2.3/Makefile

/usr/share/doc/nfs-utils-1.2.3/Makefile.am

/usr/share/doc/nfs-utils-1.2.3/Makefile.in

/usr/share/doc/nfs-utils-1.2.3/NEW

/usr/share/doc/nfs-utils-1.2.3/README

/usr/share/doc/nfs-utils-1.2.3/THANKS

 

 

示例:查询一个已经安装的软件包依赖于什么软件包

[root@Linux_1 Packages]# rpm -qR bash

/bin/sh 

/bin/sh 

config(bash) = 4.1.2-15.el6_4

libc.so.6 

libc.so.6(GLIBC_2.0) 

libc.so.6(GLIBC_2.1) 

libc.so.6(GLIBC_2.11) 

libc.so.6(GLIBC_2.2) 

libc.so.6(GLIBC_2.3) 

libc.so.6(GLIBC_2.3.4) 

libc.so.6(GLIBC_2.4) 

libdl.so.2 

libdl.so.2(GLIBC_2.0) 

libdl.so.2(GLIBC_2.1) 

libtinfo.so.5 

ncurses-libs 

rpmlib(BuiltinLuaScripts) <= 4.2.2-1

rpmlib(CompressedFileNames) <= 3.0.4-1

rpmlib(FileDigests) <= 4.6.0-1

rpmlib(PayloadFilesHavePrefix) <= 4.0-1

rtld(GNU_HASH) 

rpmlib(PayloadIsXz) <= 5.2-1

 

 

示例:查询一个软件包中的脚本片段

[root@Linux_1 Packages]# rpm -q--scripts bash

postinstall scriptlet (using <lua>):

bashfound = false;

shfound = false;

 

f = io.open("/etc/shells", "r");

if f == nil

then

  f =io.open("/etc/shells", "w");

else

  repeat

    t = f:read();

    if t =="/bin/bash"

    then

      bashfound = true;

    end

    if t =="/bin/sh"

    then

      shfound = true;

    end

  until t == nil;

end

f:close()

 

f = io.open("/etc/shells", "a");

if not bashfound

then

 f:write("/bin/bash\n")

end

if not shfound

then

 f:write("/bin/sh\n")

end

f:close()

postuninstall scriptlet (using /bin/sh):

if [ "$1" = 0 ]; then

    /bin/grep -v '^/bin/bash$'< /etc/shells | \

      /bin/grep -v '^/bin/sh$'> /etc/shells.new

    /bin/mv /etc/shells.new/etc/shells

fi

校验:

 

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

 

  • -V:后面接软件名称,若该软件所含的文件被改动过才会列出来

  • -Va:列出目前系统上面所有可能被改动过的文件

  • -Vp:后面加的是文件名称,列出该软件内可能被改动过的文件

  • -Vf:列出某个文件是否被改动过

 

  • S file Size differs:文件的容量大小是否被改变

  • M Mode differs (includespermissions and file type):文件的类型或文件的属性(rwx)是否被改变

  • 5 digest (formerly MD5 sum)differsMD5这一种指纹码的内容已经不同

  • D Device major/minor numbermismatch:设备的主/次代码已经改变

  • L readLink(2) path mismatchLink路径已被改变

  • U User ownership differs:文件的所有者已被改变

  • G Group ownership differs:文件的所有属用户组已被改变

  • T mTime differs:文件的创建时间已被改变

  • P capabilities differcapabilities已经改变

 

提示:当一个软件包的文件被被动过,那么它的显示就会是:

SM5DLUGTP c filename

c表示文件的类型

 

  • cconfig file:设置文件

  • ddocumentation:文档文件

  • gghost file:“鬼”文件,通常是该文件不被某个软件所包含,较少发生

  • llinense file:授权文件

  • rread line:自述文件

 

 

示例:查看某个已经安装的软件包中的哪些文件被改动过

[root@Linux_1 ~]# rpm -V vsftpd  #查看vsftpd软件包中的哪些文件被改动过

S.5....T. c /etc/vsftpd/user_list

 

 

示例:列出系统上所有的rpm包中的文件中被改动的文件有哪些(针对所有rpm包中的所有文件查询)

[root@Linux_1 ~]# rpm -Va

prelink: /usr/lib/libgweather.so.1.5.2: at least one of file'sdependencies has changed since prelinking

S.?......   /usr/lib/libgweather.so.1.5.2

prelink: /usr/bin/gtkhtml-editor-test: at least one of file'sdependencies has changed since prelinking

S.?......   /usr/bin/gtkhtml-editor-test

prelink: /usr/lib/libgtkhtml-3.14.so.19.1.1: at least one of file'sdependencies has changed since prelinking

S.?......   /usr/lib/libgtkhtml-3.14.so.19.1.1

 

 

示例:查看某个文件是否被改动过(这个文件一定要属于某个rpm包才行)

[root@Linux_1 ~]# rpm -Vf /etc/zshrc

S.5....T. c /etc/zshrc

 

提示:列出的是这个文件被改动的类型

 

 

示例:根据完整的软件包名查看包内文件是否被动过

[root@Linux_1 Packages]# rpm -Vp ./zsh-4.3.10-7.el6.i686.rpm

S.5....T.  c /etc/zshrc

 

 

包来源合法性验正和完整性验正:

p    来源合法性验正:

p    文件完整性验正:

 

获取并导入信任的包制作者的密钥:

对于CentOS发行版来说:rpm--import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

验正:

(1) 安装此组织签名的程序时,会自动执行验正;

(2) 手动验正:rpm -K PACKAGE_FILE

[root@Linux_1 Packages]# rpm -Kzsh-4.3.10-7.el6.i686.rpm

zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgpmd5 OK

 

 

rpm包数据库重建:

rpm管理器数据库路径:/var/lib/rpm/

查询操作就是通过此处的数据库进行;

 

获取帮助:

CentOS 6man rpm

CentOS 7man rpmdb

 

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

  • --initdb:初始化数据库,当前无任何数据库,可初始化创建一个新的;当前有时不执行任何操作;

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

  • --dbpath:指明要创建数据库的目录

说明:

如果rpm数据库系统损坏可以使用此命令重建

[root@Linux_1 tmp]# mkdir -p /tmp/rpm  #创建用于放置数据库的目录

[root@Linux_1 tmp]# rpm --initdb--dbpath /tmp/rpm/  #初始化数据库

[root@Linux_1 tmp]# ls /tmp/rpm/

__db.001 __db.002  __db.003  __db.004 Packages

[root@Linux_1 tmp]# rpm --rebuilddb--dbpath /tmp/rpm/  #重新构建数据库

[root@Linux_1 tmp]# ls /tmp/rpm/

Packages

 

 

 

提问:

1、  如果把/var/lib/rpm目录下的所有内容删除了,那么怎么办?

答:如果将此目录删除了,那么使用rpm �Cinitdbrpm �Crebuilddb是不能够重建的。因为此目录下的文件不光有数据文件,还有其它的相关文件,--initdb―rebuilddb只能够重建数据库,而不能重建其它的文件,可以这种方法是无效的。


你可能感兴趣的:(rpm)