RPM软件包管理

Linux应用程序的组成

安装完一个软件包以后,可能会向系统中复制大量的数据文件,并进行相关设置。在Linux系统中,典型的应用程序通常由以下几部分组成。

普通的可执行程序文件一般保存在“/usr/bin”目录中,普通用户即可执行。

服务器程序、管理程序文件一般保存在”/usr/sbin“目录中,只有管理员能执行。

配置文件一般保存在”/etc“目录中,配置文件较多时会建立相应的子目录。

日志文件一般保存在”/var/log“目录中。

关于应用程序的参考文档等数据一般保存在”/usr/share/doc”目录中。

执行文件及配置文件的man手册页一般保存在”/usr/share/man“目录中。

 

软件包的封装类型

对于各种应用程序的软件包,在封装时可以采用各种不同的类型,不同类型的软件包安装方法也各不相同。常见软件包封装类型如下

RPM软件包这种软件包的扩展名为”.rpm“只能在使用RPM(RPM Package Manager,RPM软件包管理器)机制的Linux操作系统中安装,如RHEL 5、Fedora 9、Suse 10等。RPM软件包一般针对特定版本的系统量身定制因此依懒性较强安装RPM包需要使用Linux系统中的rpm命令。

DEB软件包:这种软件包文件的扩展名为“.deb”,只能DPKG(Debian PackageDebian包管理器)机制的Linux操作系统中进行安装如Debian 8.0Ubuntu 11.04。安装DEB软件包需要使用Linux系统中的dpkg命令

源代码软件包这种软件包是程序员开发完成的原始代码,一般被制作成“.tar.gz”“.tar.bz2”格式的压缩包文件,因多数使用tar命令打包而成所以经常被称为“TarBall”安装源码软件包需要使用相应的编译工具,如Linux中的C语言编译器gcc。由于大部分Linux系统中都安装有基本的编译环境,因此使用源码软件包要更加灵活。

附带安装程序的软件这种软件包的扩展名不一,但仍以TarBall格式的居多软件包会提供用于安装的可执行程序或脚本文件,如install.sh、setup等,有时候会以”.bin”格式的单个安装文件形式出现。只需运行安装文件就可以根据向导程序的提示完成安装操作。

开发源代码的自由软件绝大多数选择TarBall的形式发布,而RPM包、DEB包等则使用了二进制的文件格式,代码相对比较封闭。

 

RPM概述

RPM包是各种Linux发行版本中应用最广泛的软件包之一。RPM包以其强大的功能和广泛的兼容性而得到多数Linux发行版本的支持和广大Linux使用者的拥护。

RPM软件包管理机制最早由Red Hat公司提出,后来随着版本的升级逐渐融入了更多的优秀特性,成为众多Linux发行版中公认的软件包管理标准。在其官方站点http://www.rpm.org中,可以了解到关于RPM包管理机制的详细资料。

RPM包管理器通过建立统一的文件数据库,对在Linux系统中安装、卸载、升级的各种.rpm软件包进行详细的记录,并能够自动分析软件包之间的依赖关系,保持各应用程序在一个协调、有序的整体环境中运行。

 

程序包管理器

    二进制应用程序的组成部分:

二进制文件、库文件、配置文件、帮助文件

    程序包管理器:

debian:deb文件, dpkg包管理器

redhatrpm文件, rpm包管理器

rpm Redhat Package Manager

RPM Package Manager

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

  1、包文件组成 (每个包独有)

RPM包内的文件

RPM的元数据,如名称,版本,依赖性,描述等

安装或卸载时运行的脚本

  2、数据库(公共)

程序包名称及版本

依赖关系

功能说明

包安装后生成的各文件路径及校验码信息

 

程序包的来源

管理程序包的方式:

使用包管理器: rpm

使用前端工具: yum, dnf

获取程序包的途径:

(1) 系统发版的光盘或官方的服务器;

CentOS镜像:

https://www.centos.org/download/

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

(2) 项目官方站点

(3) 第三方组织:

Fedora-EPEL:

Extra Packages for Enterprise Linux

Rpmforge:RHEL推荐,包很全

搜索引擎:

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

https://sourceforge.net/

(4) 自己制作

v 注意:检查其合法性: 来源合法性,程序包的完整性

 

包命名

 软件名-软件版本-发布次数.操作系统类型.硬件架构类型.rpm

    源代码:name-VERSION.tar.gz|bz2|xz

VERSION: major.minor.release

    rpm包命名方式:

name-VERSION-release.arch.rpm

例: bash-4.2.46-19.el7.x86_64.rpm

VERSION: major.minor.release

release: release.OS

常见的arch:

x86i386, i486, i586, i686

x86_64x64, x86_64, amd64

powerpc: ppc

跟平台无关: noarch

 

包命名和工具

  包:分类和拆包

Application-VERSION-ARCH.rpm: 主包

Application-devel-VERSION-ARCH.rpm 开发子包

Application-utils-VERSION-ARHC.rpm 其它子包

Application-libs-VERSION-ARHC.rpm 其它子包

  包之间:可能存在依赖关系,甚至循环依赖

  解决依赖包管理工具:

yum:rpm包管理器的前端工具

apt-get:deb包管理器前端工具

zyppersuse上的rpm前端管理工具

dnfFedora 18+ rpm包管理器前端管理工具

 

库文件

  查看二进制程序所依赖的库文件:

同一个库文件可能会被多个软件包所依赖

ldd /PATH/TO/BINARY_FILE

[root@localhost ~]# ldd /bin/ls
linux-vdso.so.1 =>  (0x00007ffee85f4000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb4be74f000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fb4be54a000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fb4be340000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb4bdf7f000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb4bdd1e000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fb4bdaf8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb4bd8f4000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb4be987000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fb4bd6ef000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb4bd4d2000)
[root@localhost ld.so.conf.d]# ldd /bin/bash
linux-vdso.so.1 =>  (0x00007ffc505fe000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fcb04ad4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fcb048d0000)
libc.so.6 => /lib64/libc.so.6 (0x00007fcb0450e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb04d11000)

 

  管理及查看本机装载的库文件:

ldconfig

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

配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

缓存文件: /etc/ld.so.cache

 

[root@localhost ld.so.conf.d]# /sbin/ldconfig -p
920 libs found in cache `/etc/ld.so.cache'
p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so
libzapojit-0.0.so.0(libc6,x86-64)=> /lib64/libzapojit-0.0.so.0
libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
libyelp.so.0 (libc6,x86-64) => /lib64/libyelp.so.0
libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2
libxtables.so.10 (libc6,x86-64) => /lib64/libxtables.so.10
libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so.
..

 

操作系统自身的库文件

[root@localhost ld.so.conf.d]# ls /lib64/    
alsa-lib                  libkeyutils.so.1
ao                        libkeyutils.so.1.5
audit                     libkkc
avahi                     libkkc.so.2
bluetooth                 libkkc.so.2.0.0
brltty                    libkmod.so.2
cifs-utils                libkmod.so.2.2.10
colord-plugins            libkms.so.1
...

[root@localhost ~]# cd /etc/ld.so.conf.d/
[root@localhost ld.so.conf.d]# ls
dyninst-x86_64.conf                libiscsi-x86_64.conf
kernel-3.10.0-327.el7.x86_64.conf  mariadb-x86_64.conf

以上为某些软件自己的库

 

[root@localhost ld.so.conf.d]# cat mariadb-x86_64.conf
/usr/lib64/mysql        #mysql相关的库路径
[root@localhost ld.so.conf.d]# ls /usr/lib64/mysql/
libmysqlclient.so.18  libmysqlclient.so.18.0.0

使用RPM包管理命令——RPM

rpm命令实现RPM软件包管理的主要工具

rpm命令的格式

使用rpm命令能够实现几乎所有对RPM软件包的管理功能,执行“man rpm”命令可以获得关于rpm命令的详细帮助信息。rpm命令的手册页信息中可以看出,rpm命令具有相当复杂的命令格式,结合不同的命令选项及子选项主要可以实现以下三类功能。

查询、验证RPM软件包的相关信息

安装、升级、卸载RPM软件包。

维护RPM数据库信息等综合管理操作。

查询RPM软件包信息

使用rpm命令查询功能可以检查某个软件包是否已经安装,了解软件的用途软件包复制到系统中的文件等各种相关信息,以便更好地管理Linux系统的应用程序。

rpm命令的查询功能主要通过“-q”选项实现,主要针对当前系统中已经安装的软件;通过“-qp”选项可以针对尚未安装的RPM包文件进行查询。根据所需查询的具体项目不同,还可以为这两个选项指定相关的字选项。

不带子选项的“-q”选项可用于查询已知名称的软件包是否已经安装,需要使用准确的软件名作为参数(可以有多个)结合不同的子选项使用时,可以实现更具体的查询。

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

  [select-options]

-a: 所有包

-f: 查看指定的文件由哪个程序包安装生成

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

–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供

–whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

  rpm2cpio 包文件|cpio –itv 预览包内文件

  rpm2cpio 包文件|cpio –id “ *.conf” 释放包内文件

 

  [query-options]

–changelog:查询rpm包的changelog

-c: 查询程序的配置文件

-d: 查询程序的文档

-i: information

-l: 查看指定的程序包安装后生成的所有文件;

–scripts:程序包自带的脚本片断

-R: 查询指定的程序包所依赖的CAPABILITY;

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

 

-qa:显示当前系统中以RPM方式安装的所有软件列表。

qi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息(--info)。

ql:显示指定的软件包在当前系统中安装的所有目录、文件列表(-list)

qf:查看指定的文件或目录是由哪个软件包所安装的(-file)

qc:显示指定软件包安装的配置文件。

-qd:显示指定软件包安装的文档文件。

 

直接执行“rpm -q”命令,将列出当前系统中以RPM方式安装的所有软件包清单,每行记录一个软件包的名称、版本等信息。结合管道操作和“wc -l”命令,可以统计出系统中已经安装的RPM软件的个数。

 

查看Linux主机所有已安装的软件包

[root@localhost ~]# rpm -qa | more
libsss_nss_idmap-1.13.0-40.el7.x86_64
pygobject2-2.28.6-11.el7.x86_64
seavgabios-bin-1.7.5-11.el7.noarch
libreport-centos-2.1.11-32.el7.centos.x86_64
xkeyboard-config-2.14-1.el7.noarch
jansson-2.4-6.el7.x86_64
...

统计系统中所有软件包安装的个数

[root@localhost ~]# rpm -qa | wc -l
1249

查看指定的软件包是否安装

[root@localhost ~]# rpm -qa tree
tree-1.6.0-10.el7.x86_64

查询指定的文件由哪个软件生成

[root@localhost bin]# rpm -qf /etc/issue
centos-release-7-2.1511.el7.centos.2.10.x86_64
[root@localhost bin]# rpm -qf /root/bin/for_num4.sh
file /root/bin/for_num4.sh is not owned by any package

 

查询安装完的软件包生成了哪些文件

[root@localhost function]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz

 

当软件还没安装时,查看软件包安装后会生成哪些文件

[root@localhost ~]# rpm -qpl /media/Packages/tree-1.6.0-10.el7.x86_64.rpm     
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz

 

如果并不知道准确的软件包名称,还可以对全部查询结果进行过滤,使用软件包的一部分名称进行模糊查询(查询时不区分大小写),根据查询结果进行判断。

[root@localhost ~]# rpm -qa | grep -i samba
samba-client-libs-4.2.3-10.el7.x86_64
samba-common-4.2.3-10.el7.noarch
samba-common-tools-4.2.3-10.el7.x86_64
samba-common-libs-4.2.3-10.el7.x86_64
samba-libs-4.2.3-10.el7.x86_64

对于系统中已经安装的各种软件程序,如果不知道其中某个软件的用途,同样可以通过rpm工具进行查询。

查看tree软件包的详细信息

[root@localhost ~]# rpm -qi tree
Name        : tree
Version     : 1.6.0
Release     : 10.el7
Architecture: x86_64
Install Date: Thu 18 Aug 2016 06:08:41 PM CST
Group       : Applications/File
Size        : 89505
License     : GPLv2+
...

查询rpm包的changelog

[root@CentOS6 ~]# rpm -q --changelog bash
* Tue Dec 22 2015 Ondrej Oprala <ooprala@redhat.com> - 4.1.2-40
- Bash shouldn't ignore bash --debugger without a dbger installed
  Related: #1260568
 
* Wed Nov 25 2015 Ondrej Oprala <ooprala@redhat.com> - 4.1.2-39
- Wrong parsing inside for loop and brackets
  Resolves: #1207803
...

需要查看某个软件包安装的目录和文件清单时,可以使用“-ql”选项

[root@localhost ~]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz

需要知道系统中的某个文件是由哪一个软件包生成的时候,可以使用“-qf”选项

[root@localhost ~]# which wim
/usr/bin/which: no wim in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/testdir/script:)
[root@localhost ~]# rpm -qf /usr/bin/vim
vim-enhanced-7.4.160-1.el7.x86_64

只看指定软件包的配置文件

[root@CentOS6 ~]# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

只看指定软件包的文档

[root@CentOS6 ~]# rpm -qd bash
/usr/share/doc/bash-4.1.2/COPYING
/usr/share/info/bash.info.gz
/usr/share/man/man1/..1.gz
/usr/share/man/man1/:.1.gz
/usr/share/man/man1/[.1.gz
/usr/share/man/man1/alias.1.gz
...

使用rpm命令只能查询通过RPM方式安装的软件包信息,对通过其他途径安装(例如源码编译、手动复制等方式)系统中的软件包,rpm命令将无法获取相关信息。

 

查询RPM包文件中的相关信息

使用“-qp”选项时,必须以RPM包文件的路径作为参数(可以有多个)而不是软件包名称。其相关的子选项于使用“-q”查询时类型,常用的两个查询选项如下所述。

-qpi查看指定软件包的名称、版本、许可协议、用途描述等详细信息

qpl查看该软件准备要安装的所有目标目录、文件列表。

已知光盘目录中有一个RPM安装包文件ethtool-6-4.el5.i386.rpm,若要在安装之前了解该软件的用途,可以执行以下操作。

[root@localhost ~]# rpm -qpi /media/Packages/ethtool-3.15-2.el7.x86_64.rpm
Name        : ethtool
Epoch       : 2
Version     : 3.15
Release     : 2.el7
Architecture: x86_64
Install Date: (not installed)
Group       : Applications/System
Size        : 313775
License     : GPLv2
Signature   : RSA/SHA256, Sat 14 Mar 2015 03:46:39 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : ethtool-3.15-2.el7.src.rpm
...

 

希望进一步了解该软件包中包含哪些文件(安装后将复制到系统中)可以执行以下操作。

[root@localhost ~]# rpm -qpl /media/Packages/ethtool-3.15-2.el7.x86_64.rpm
/usr/sbin/ethtool
/usr/share/doc/ethtool-3.15
/usr/share/doc/ethtool-3.15/AUTHORS
/usr/share/doc/ethtool-3.15/COPYING
/usr/share/doc/ethtool-3.15/ChangeLog
/usr/share/doc/ethtool-3.15/LICENSE
/usr/share/doc/ethtool-3.15/NEWS
/usr/share/doc/ethtool-3.15/README
/usr/share/man/man8/ethtool.8.gz

[root@CentOS6 ~]# rpm -q -scripts bash
postinstall scriptlet (using <lua>):      #安装前脚本
...
postuninstall scriptlet (using /bin/sh):     #卸载后脚本
...

RPM软件包安装

日常系统管理工作中,安装、升级及卸载软件包是管理应用程序最基本的工作内容。

使用rpm命令安装软件包时,需要指定完整的包文件名作为参数(可以有多个);而卸载软件包时,只需要指定软件包名称即可。若要一次安装多个RPM软件包,可以使用通配符”*“,这种方式在安装存在相互依赖关系的多个软件包上特别有用,系统将会自动检查依赖性并决定安装顺序,而无需管理员去判断应该先装哪一个包。

rpm {-i|–install} [install-options] PACKAGE_FILE…

 

-i,install当前系统中安装一个新的RPM软件包

-v,verbose:显示软件安装过程中的详细信息

-vv显示比-v更加详细信息

-h在安装或升级软件包的过程中,以#号显示进度状态

–test测试安装,但不真正执行安装,dry run模式

–nodeps:忽略依赖关系

–replacepkgs| replacefiles  (覆盖包)当安装的rpm文件被破坏时,会用到,相当于重新安装一遍

–replacefiles (覆盖文件)

–nosignature: 不检查来源合法性

–nodigest:不检查包完整性

–noscipts:不执行程序包脚本片断

%pre: 安装前脚本;    –nopre

%post: 安装后脚本;   –nopost

%preun: 卸载前脚本;  –nopreun

%postun: 卸载后脚本; –nopostun

 

RPM软件包升级、卸载

在安装一个新的软件包时,通常使用”-ivh“的组合选项,这样便于了解软件安装的过程信息,及时跟踪安装进度。如果是使用新版本的软件包替换旧的版本,则只需将”-i”换成“-U”即可。

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

v rpm {-F|–freshen} [install-options] PACKAGE_FILE…

-e:卸载指定名称的软件包

-Uupgrade:检查并升级系统中的某个软件包,若该软件包原来并未安装,则等同于“-i”选项

-Ffreshen:检查并更新系统中的某个软件包,若该软件包原来并未安装,则放弃安装。还有几个相关的命令选项,可以用于辅助安装、卸载软件包的过程

–force:强制安装某个软件包,当需要替换已安装的软件包及文件,或者安装一个比当前使用的软件版本更旧的软件时,可以使用此选项。

–nodeps:在安装或升级、卸载一个软件包时,不检查与其他软件包的依赖关系。

–oldpackage:降级 

 

升级注意项

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

(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

 

卸载一个软件包时,主要使用“-e”选项。

需要安装、卸载一个与其他程序存在依赖关系的软件包时,系统将提示存在依赖关系而放弃执行这是可以结合“–nodeps”选项忽略依赖关系,而强行安装或卸载指定的软件包。忽略依赖关系可能会导致软件功能异常或失效,因此只在学习或者调试程序时使用,生产环境中应避免使用。

[root@localhost ~]# rpm -qa tree
tree-1.6.0-10.el7.x86_64
[root@localhost ~]# rpm -e tree
[root@localhost ~]# rpm -q tree
package tree is not installed

软件包效验

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 -K|checksig rpmfile 检查包的完整性和签名

rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

CentOS 7发行版光盘提供: RPM-GPG-KEY-CentOS-7

rpm -qa gpg-pubkey*

 

修改软件包生成文件后进行效验

[root@CentOS6 ~]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.5.3
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gz
[root@CentOS6 ~]# ll /usr/share/doc/tree-1.5.3/README
-rw-r--r--. 1 root root 4167 Oct 20  2009 /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# chown cyh /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# ll /usr/share/doc/tree-1.5.3/README
-rw-r--r--. 1 cyh root 4167 Oct 20  2009 /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# rpm -V tree
.....U...  d /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# echo >> /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# ll /usr/share/doc/tree-1.5.3/README
-rw-r--r--. 1 cyh root 4168 Aug 21 09:43 /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# rpm -V tree
S.5..U.T.  d /usr/share/doc/tree-1.5.3/README

恢复文件再次效验软件包

[root@CentOS6 ~]# sed -i '$d' /usr/share/doc/tree-1.5.3/README
[root@CentOS6 ~]# rpm -V tree
.....U.T.  d /usr/share/doc/tree-1.5.3/README

 

效验Linux系统上所有安装的软件包

[root@CentOS6 ~]# rpm -Va
S.5....T.  c /etc/updatedb.conf
S.5....T.  c /root/.bash_profile
S.5....T.  c /root/.bashrc
.......T.  c /etc/inittab
...

 

RPM数据库

    数据库重建:

/var/lib/rpm

    rpm {–initdb|–rebuilddb}

initdb: 初始化

如果事先不存在数据库,则新建之

否则,不执行任何操作

rebuilddb:重建

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

 

重建RPM数据库

用于记录在Linux系统中安装、卸载、升级应用程序的相关信息,由RPM包管理系统自动完成维护,一般不需要用户干预。当RPM数据库发生损坏(误删文件、非法关机、病毒破坏等导致),且Linux系统无法自动完成修复时。将导致无法使用rpm命令正常地安装、卸载及查询软件包。这时可以使用rpm命令的“–rebuiddb”或“–initdb”功能对RPM数据库进行重建。

rebuilddb重建后,后安装的软件包及文件查询不到,建议使用initdb

 

[root@localhost ~]# rpm –rebuilddb

[root@localhost ~]# rpm –initdb

 

导入验证公钥

在Linux/UNIX应用领域,相当一部分软件厂商会对发布的软件包进行数字签名,以确保软件的完整性、合法性。对于用户来说,可以利用软件官方提供的公钥文件,自动对下载的软件包进行验证,如果在安装软件时出现验证失败的提示,则表示该软件包可能已经被非法篡改。

向RPM数据库中导入公钥文件时,需要用到“–import”选项。例如,执行以下操作可以把光盘目录中的RPM-GPG-KEY-redhat-release公钥文件导入到RPM数据库中。

导入所需要公钥

[root@CentOS6 ~]# mount /dev/cdrom /media/
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@CentOS6 ~]# cp /media/Packages/tree-1.5.3-3.el6.x86_64.rpm .
[root@CentOS6 ~]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm
warning: tree-1.5.3-3.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...               ################################### [100%]
        package tree-1.5.3-3.el6.x86_64 is already installed
[root@CentOS6 ~]# rpm -K tree-1.5.3-3.el6.x86_64.rpm
tree-1.5.3-3.el6.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#c105b9de)
[root@CentOS6 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6  #导入公钥文件
[root@CentOS6 ~]# echo >> tree-1.5.3-3.el6.x86_64.rpm                
[root@CentOS6 ~]# rpm -K tree-1.5.3-3.el6.x86_64.rpm
tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK
[root@CentOS6 ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)
 
mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW
NyPBZRpM2R+Rg5eVqlborp7TmktBP/sSsxc8eJ+3P2aQWSWc5ol74Y0OznJUCrBr
bIdypJllsD9Fe+h7gLBXTh3vdBEWr2lR+xA+Oou8UlO2gFbVFQqMafUgU1s0vqaE
...
 
[root@CentOS6 ~]# rpm -qa gpg-pubkey*
gpg-pubkey-c105b9de-4e0fd3a3
[root@CentOS6 ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3
Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : c105b9de                          Vendor: (none)
Release     : 4e0fd3a3                      Build Date: Sun 21 Aug 2016 09:54:42 AM CST
Install Date: Sun 21 Aug 2016 09:54:42 AM CST      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)
 
mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW
NyPBZRpM2R+Rg5eVqlborp7TmktBP/sSsxc8eJ+3P2aQWSWc5ol74Y0OznJUCrBr
bIdypJllsD9Fe+h7gLBXTh3vdBEWr2lR+xA+Oou8UlO2gFbVFQqMafUgU1s0vqaE
...
 
 
[root@CentOS6 ~]# rpm -e gpg-pubkey-c105b9de-4e0fd3a3
[root@CentOS6 ~]# rpm -q gpg-pubkey*
package gpg-pubkey* is not installed
[root@CentOS6 ~]# rpm -K /media/Packages/tree-1.5.3-3.el6.x86_64.rpm
/media/Packages/tree-1.5.3-3.el6.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#c105b9de)
 
[root@CentOS6 ~]# cd /var/lib/rpm/
[root@CentOS6 rpm]# ll
total 74856
-rw-r--r--. 1 root root  5521408 Jul 25 17:18 Basenames
-rw-r--r--. 1 root root    12288 Jul 19 18:19 Conflictname
-rw-r--r--. 1 root root    73728 Aug 21 10:05 __db.001
-rw-r--r--. 1 root root   229376 Aug 21 10:05 __db.002
-rw-r--r--. 1 root root  1318912 Aug 21 10:05 __db.003
-rw-r--r--. 1 root root   753664 Aug 21 10:05 __db.004
-rw-r--r--. 1 root root  1351680 Jul 25 17:18 Dirnames
-rw-r--r--. 1 root root 10518528 Jul 25 17:18 Filedigests
...
[root@CentOS6 rpm]# rpm -e tree
[root@CentOS6 rpm]# ll
total 74848
-rw-r--r--. 1 root root  5521408 Aug 21 10:07 Basenames
-rw-r--r--. 1 root root    12288 Jul 19 18:19 Conflictname
-rw-r--r--. 1 root root    73728 Aug 21 10:07 __db.001
-rw-r--r--. 1 root root   229376 Aug 21 10:07 __db.002
-rw-r--r--. 1 root root  1318912 Aug 21 10:07 __db.003
-rw-r--r--. 1 root root   753664 Aug 21 10:07 __db.004
-rw-r--r--. 1 root root  1351680 Aug 21 10:07 Dirnames
-rw-r--r--. 1 root root 10518528 Aug 21 10:07 Filedigests
...

当执行安装或升级rpm软件包,rpm数据库文件时间也会发生变化

 

备份rpm数据库文件

[root@CentOS6 rpm]# \cp 
 -a 
/var/lib/rpm/* /root/rpmdatedb/

 


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

(0)
上一篇 2016-08-21 19:09
下一篇 2016-08-21 20:06

相关推荐

  • 更改CentOS7 默认网卡eno16777736为eth0

        安装完CentOS7,它的默认网卡名为eno16777736 看着不爽!习惯了eth0的命名方式。 编辑 /etc/sysconfig/grub 在“GRUB_CMDLINE_LINUX”里添加net.ifnames=0 biosdevname=0 保存退出 如图: 然后执行 grub2-mkconfig -o…

    系统运维 2015-12-19
  • 马哥教育网络班22期+第一周课程练习

    一、计算机的基本组成和功能   cpu包括运算器、控制器、寄存器、缓存       运算器:计算功能,对数据进行加工处理的的部件;       控制器:负责从存储器取出指令,控制cpu计算器之间的运行结果和状态;       寄存器:暂存指令和数据的地方,存储…

    Linux干货 2016-08-15
  • bash脚本编程

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell;分别统计这两类用户的个数;通过字符串比较来实现; #!/bin/bash declare -i loginSum=0; declare -i nologinSum=0; for x in `cat /etc/passwd|cut -d: -f 7` do if [ “/sb…

    Linux干货 2017-10-31
  • 文本处理工具和shell脚本基本编程

    文本处理工具 grep 对文本进行搜索获取我们想要的行(关键信息) egrep 支持扩展正则表达式的grep fgrep 快速搜索不支持正则    -v 取反  找出不包含“pattern”的行  -i 忽略字符的大小写  -n 显示行号  -c 显示统计到的行数,等同于wc -l  -o…

    2017-04-09
  • 文件系统的挂载、usb设备光盘的使用

    一、     文件系统的挂载mount: 1.       挂载命令mount使用: (1)挂载: 将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为,挂载点下原有文件在挂载完成后会被临时隐藏 (2) 卸载:为解除此…

    Linux干货 2016-08-29
  • DNS服务器—-主从服务器搭建

    一、环境准备   1、准备三台测试       主DNS服务器地址:192.168.10.203       从DNS服务器地址:192.168.10.103       测试主机地址:  192.168.10.120 …

    Linux干货 2015-05-18