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 Package,Debian包管理器)机制的Linux操作系统中进行安装,如Debian 8.0、Ubuntu 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包管理器
redhat:rpm文件, 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:
x86:i386, i486, i586, i686
x86_64:x64, 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包管理器前端工具
zypper:suse上的rpm前端管理工具
dnf:Fedora 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:卸载指定名称的软件包
-U,upgrade:检查并升级系统中的某个软件包,若该软件包原来并未安装,则等同于“-i”选项
-F,freshen:检查并更新系统中的某个软件包,若该软件包原来并未安装,则放弃安装。还有几个相关的命令选项,可以用于辅助安装、卸载软件包的过程
–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