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)
cyh5217cyh5217
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • Linux安全与加密基础(一)

    Linux安全与加密基础(一) 常见的加密算法 SSL: Openssl与CA认证 ssh服务 dropbear AIDE sudo 常见的加密算法 密码学古以有之,尤其是在中国古代的战争中,在现在科技中,密码学不得不说是一门高深的学问,普通人知其一二足矣;本文要讨论的是关于加密与解密的基本原理与应用,以及关于Linux系统中的一些安全管理问题,如ssh服务…

    Linux干货 2016-10-06
  • 马哥教育网络班第21期+第四周课程作业

    1. 复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 cp -r /etc/skel /home/tuser1 chmod –R 700 /home/tuser1 2. 编辑/etc/group文件,添加组hadoop。 echo &q…

    Linux干货 2016-08-01
  • 新的开始

    hello,我在这里,马哥运维,一起努力!

    Linux干货 2016-12-26
  • linux命令格式及基础命令

    linux命令格式及基础命令介绍 命令格式 command [options] [arguments] * command:命令 * options: –单词 或 -单字 * argument:参数(档案名称或其他) 基础命令介绍 ifconfig 用于显示或设置网络设备 语法 ifconfig [网络设备][down up -allmulti -arp …

    Linux干货 2017-12-03
  • 网络理论基础

    一、网络概述   1、什么是网络     网络就是通过有线或无线技术将各种硬件设备连接起来进行数据传输的一种方式。   2、网络的分类     根据距离范围可以将网络划分为局域网和广域网。       局域网:传输距离较近,传输速率快。     &n…

    Linux干货 2016-01-11
  • 设定Linux自动登陆

    设定Linux自动登陆 在实验场景中我们可能会经常重新启动Linux,然后反复输入账户密码登陆。为了在每次启动后快速进入系统减少在实验场景中不必要的工作,我们可以设定Linux在启动后自动登陆到指定账户(实验中一般为root账户)。基于Linux一切皆文件的思想,我们可以通过修改配置文本的方式决定是否启用自动登录,以及自动登录的账户是普通用户账户还是root…

    Linux干货 2017-07-15