本小节会详细介绍linux中的软件包管理,涉及软件包的定义/安装/卸载/依赖等操作。以及会详细演示rpm这个非常重要命令的使用。
前言
本小节会详细介绍linux中的软件包管理,涉及软件包的定义/安装/卸载/依赖等操作。以及会详细演示rpm这个非常重要命令的使用。
软件包
源码包
源码包是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。计算机只能识别机器语言,也就是二进制语言,所以源码包的安装需要通过编译器将程序代码翻译成二进制语言,这个过程叫做编译。
源码包的安装需要把源代码编译为二进制代码,安装时间通常都很长。安装25M左右的源码包,可能需要半小时间到一时间。但常见的二进制包安装,例如微信,几百M的文件,也只需要几分钟。
另外源码包的安装需要人为编译,这个过程很容易报错,可能还需要熟悉程序语言进行排错。
为了解决源码安装的这些问题,在linux中更常见的还是使用二进制包进行安装。
二进制包
源码包成功之后产生的包就是二进制包。二进制包在发布之前就已经完成编译工作,因此用户安装的速度会快很多,且安装报错的几率减小。
目前主流的二进制包管理系统有两大类: RPM 包管理系统:功能强大,安装、升级、査询和卸载简单方便,很多 Linux 发行版使用的软件安装管理方式,例如 红帽、CentOS、SuSE 等。 DPKG 包管理系统:由 Debian Linux 开发的包管理机制,主要应用在 Debian 和 Ubuntu 系统。 RPM 包管理系统和 DPKG 包管理系统原理大同小异,这一系列课程是在Centos7中做实验,所以以RPM包管理系统为主。
源码包 VS二进制包
源码包一般包含多个文件,为了方便发布,通常会将源码包做打包压缩处理,Linux 中最常用的打包压缩格式为“tar.gz”,因此源码包又被称为 Tarball。 源码包通常包含以下内容: 源代码文件。 配置和检测程序(如 configure 或 config 等)。 软件安装说明和软件说明(如 INSTALL 或 README)。
源码包安装软件的好处: 开源,可以修改源代码。 可自由选择所需的功能。 软件是编译安装,安装完成后更加匹配操作系统。 卸载方便。
源码包安装软件的缺点: 安装时候,参数配置和步骤较多,语法容易写错 编译安装时间比二进制安装要长很多。 编译安装过程容易出错,并且一旦出错,很难解决
二进制(rpm)包安装的优点 rpm管理系统简单,通过常见的命令可实现包的安装、升级、査询和卸载。 安装速度比源码包安装快得多。相比源码包,二进制包是在软件发布时已经进行过编译的软件包,所以安装速度比源码包快得多。
二进制(rpm)包安装的缺点 不能看到源代码。 功能选择不灵活。
依赖性
依赖性。有时在安装软件包 x 时需要先安装 y 和 z,而在安装 z 时需要先安装 a 和 b。这就需要先安装 a 和 b,再安装 y 和 z,最后才能安装 x。安装软件包需要有一定的顺序,但是有时依赖性会非常复杂。
软件包的依赖性 在包的安装和卸载过程中需要重点关注,包之间的依赖关系大致可分为以下 2 种: 树形依赖(A-B-C-D):要想安装软件 A,必须先安装 B,而安装 B 需要先安装 C;解决此类型依赖的方法是从后往前安装,即先安装 D,再安装 C,然后安装 B,最后安装软件 A。 环形依赖(A-B-C-D-A):各个软件安装的依赖关系构成环状。解决此类型依赖的方法是用一条命令同时安装所有软件包,即使用 rpm -ivh A B C D
已上两种依赖关系,都是通过手动安装方式解决,非常繁琐,如果依赖的包特别多,明显不适用。在下一讲中,将学习使用 yum 命令查询、安装、升级和卸载软件包的方法。它可以自动处理软件包之间的依赖性关系,一次性安装所有依赖的软件包,无需一个个安装。
版本要求 例如装gcc 这个软件包的时候,会有如下输出: [root@prometheus Packages]# rpm -ivh gcc-4.8.5-44.el7.x86_64.rpm error: Failed dependencies: <— 提示依赖性错误 cpp = 4.8.5-44.el7 is needed by gcc-4.8.5-44.el7.x86_64 glibc-devel >= 2.2.90-12 is needed by gcc-4.8.5-44.el7.x86_64 libmpc.so.3()(64bit) is needed by gcc-4.8.5-44.el7.x86_64 libmpfr.so.4()(64bit) is needed by gcc-4.8.5-44.el7.x86_64 提示要安装 gcc,需要先安装其他包,这就是RPM 包的依赖性。 另外信息中还会明确给出各个依赖软件的版本要求: ">=":表示版本要大于或等于显示版本; “<=”:表示版本要小于或等于显示版本; “=”:表示版本要等于显示版本;
下面我们会详细讲解 RPM包的使用,请熟练掌握
RPM包管理系统
RPM包命名规则
RPM 包的命名具有规则,用户通过名称可获取包的版本、适用平台等信息。 RPM包命名格式如下: 包名-版本号-发布次数-发行商-Linux平台-适合的硬件平台-包扩展名 例如:libreport-web-2.1.11-53.el7.centos.x86_64.rpm
选项 | 含义 |
---|
libreport-web | 软件包名。 | 2.1.11 | 包的版本号,版本号的格式通常为主版本号.次版本号.修正号。 | 53 | 包发布的次数,表示此 包是第几次编程生成的。 | el*: | 软件发行商,el7 表示是由 Red Hat 公司发布,在 RHEL 7.x 和 CentOS 7.x 上使用。 | Centos | 这个软件包适用的平台,其它软件包可能不包含这个选项 | x86_64 | 包能够使用的硬件平台,参照下面列表。x86_64代表在64位的操作系统上安装运行 |
包名和包全名
包名是指版本号之前的字符串。包全名是指带rpm完整字符串的名称。
-
例 libreport-web-2.1.11-53.el7.centos.x86_64.rpm 这个文件它的包名是 libreport-web 它的包全名是 libreport-web-2.1.11-53.el7.centos.x86_64.rpm。 注意:包名和包全名,两者是不同的。软件包的安装和升级是需要指定包全名。而软件查询卸载是使用包名。一定要区分开! -
例Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64.rpm 这个文件的包名是Percona-Server-server-56 注意不是Percona-Server-server 它的包全名是 Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64.rpm
[root@zaishu ~]
[root@zaishu ~]
Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64
[root@zaishu ~]
Name : Percona-Server-server-56 //包名
Version : 5.6.38
Release : rel83.0.el7
Architecture: x86_64
Install Date: Mon 15 Nov 2021 12:02:23 PM CST
Group : Applications/Databases
Size : 92247229
License : Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Under the GNU General Public License (http://www.gnu.org/licenses/).
Signature : DSA/SHA1, Fri 08 Dec 2017 05:28:46 PM CST, Key ID 1c4cbdcdcd2efd2a
Source RPM : Percona-Server-56-5.6.38-rel83.0.el7.src.rpm
Build Date : Fri 08 Dec 2017 05:27:16 PM CST
Build Host : os-centos-7-x64-4119.ci.percona.com
Relocations : (not relocatable)
Packager : Percona MySQL Development Team <mysqldev@percona.com>
Vendor : Percona, Inc
URL : http://www.percona.com/
Summary : Percona Server: a very fast and reliable SQL database server
硬件平台
注意:32位的包可以安装在x86_64中,但64位的包是不能够安装在32位的操作系统中。
平台 | 适用平台信息 |
---|
i386 | 386 以上计算机都可以安装 | i586 | 686 以上计算机都可以安装 | i686 | 奔腾 II 以上的计算机都可以安装,对于32位的操作系统目前基本都是这个居多 | x86_64 | 64 位 CPU 可以安装 | noarch | 没有硬件限制 |
例如当前安装的是64位centos,所以安装盘中主要都是x86_64的包
[root@prometheus Packages]
2665
还有一些包就是noarch,表示对硬件没有限制
[root@prometheus Packages]
1405
RPM常见选项
语法可以通过man rpm具体查看,这节只列出常用的一些选项
选项 | 用途 |
---|
-a | 查询所有包。 | -c | 只列出包的配置文件,本参数需配合"-l"参数使用。 | -d | 只列出文本文件,本参数需配合"-l"参数使用。 | -e<包档>或–erase<包档> | 删除指定的包。 | -f<文件>+ | 查询拥有指定文件的包。 | -h或–hash | 包安装时列出标记。 | -i | 显示包的相关信息。 | -i<包档>或–install<包档> | 安装包。 | -l | 显示包的文件列表。 | -p<包档>+ | 指定未安装的包。 | -q | 查询包。 | -R | 显示包的关联性信息。 | -s | 显示文件状态,本参数需配合"-l"参数使用。 | -U<包档>或–upgrade<包档> | 升级指定的包。 | -v | 显示指令执行过程。 | -vv | 详细显示指令执行过程,便于排错。 |
软件包查找
rpm 命令可用来对 RPM 软件包做查询操作,具体包括:
查询包是否已安装;
查询所有已安装的包;
查看包的详细信息;
查询包的文件列表;
查询文件具体属于哪个包。
rpm -q 查询软件包是否安装
查询包是否安装: [root@localhost ~]# rpm -q 包名 -q 表示查询,是 query 的首字母。 例如,查看 Linux 系统中是否安装 apache:
[root@prometheus Packages]
httpd-2.4.6-97.el7.centos.2.x86_64
这里使用的是包名,而不是包全名。
rpm -qa:查询所有安装的包
查询 Linux 系统中所有已安装软件包:
[root@zaishu ~]
glibc-devel-2.17-324.el7_9.x86_64
perl-Filter-1.49-3.el7.x86_64
libcurl-7.29.0-59.el7_9.1.x86_64
readline-devel-6.2-11.el7.x86_64
python-libs-2.7.5-90.el7.x86_64
…省略…
也可以使用管道符查找:
[root@prometheus Packages]
httpd-2.4.6-97.el7.centos.2.x86_64
httpd-tools-2.4.6-97.el7.centos.2.x86_64
rpm -qi:查询包的详细信息
查询软件包的详细信息,-i 选项表示查询软件信息: [root@localhost ~]# rpm -qi 包名
[root@zaishu ~]
Name : rpm
Version : 4.11.3
Release : 45.el7
Architecture: x86_64
Install Date: Thu 08 Oct 2020 07:57:46 PM CST
Group : System Environment/Base
Size : 2622621
License : GPLv2+
Signature : RSA/SHA256, Thu 15 Oct 2020 03:00:03 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : rpm-4.11.3-45.el7.src.rpm
Build Date : Thu 01 Oct 2020 01:30:03 AM CST
Build Host : x86-02.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.rpm.org/
Summary : The RPM package management system
..........
For a description of Percona Server see http://www.percona.com/software/percona-server/
rpm -qip 查看未安装包的详细信息
查询未安装软件包的详细信息,命令格式为: [root@localhost ~]# rpm -qip 包全名 //-p 表示未安装的软件包。 rpm -qip zziplib-utils-0.13.62-9.el7.x86_64.rpm
[root@prometheus Packages]
Name : zziplib
Version : 0.13.62
Release : 12.el7
Architecture: x86_64
Install Date: (not installed)
Group : Applications/Archiving
Size : 216046
License : LGPLv2+ or MPLv1.1
Signature : RSA/SHA256, Sat 04 Apr 2020 05:10:34 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : zziplib-0.13.62-12.el7.src.rpm
Build Date : Wed 01 Apr 2020 01:04:24 PM CST
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://zziplib.sourceforge.net/
Summary : Lightweight library to easily extract data from zip files
Description :
The zziplib library is intentionally lightweight, it offers the ability to
easily extract data from files archived in a single zip file. Applications
can bundle files into a single zip archive and access them. The implementation
is based only on the (free) subset of compression with the zlib algorithm
which is actually used by the zip/unzip tools.
rpm -ql:查询已安装包 产生的文件列表
rpm包安装后采用默认的路径,安装后的文件会分类安放在不同目录下。使用 rpm 命令可以查询到包安装后产生的所有文件和路径: [root@localhost ~]# rpm -ql 包名 -l :列出软件包所有文件的安装目录。
例如安装apache后,查询这个包中所有文件和位置:
[root@zaishu~]
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
…省略部分输出…
rpm -qlp:查询未安装包 安装后产生的文件列表
rpm 命令还可以查询 未安装的包 所含有的文件以及安装后的路径: -p :未安装的软件包。 例如查看尚未安装的bind包中的所有文件及安装后的位置,可以执行如下命令:
[root@prometheus Packages]
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
…省略部分输出…
rpm -qf 查询文件系统属于哪个包
支持反向查询,用于查询文件属于哪个包,特别是在查询命令或者卸载命令的时候,这个参数用的比较频繁: [root@zaishu~]# rpm -qf 系统文件名 -f 选项的含义是查询系统文件所属哪个软件包,是 file 的首字母。
例 ls 命令所属的包:
[root@zaishu ~]
alias ls='ls --color=auto'
/usr/bin/ls
[root@zaishu ~]
coreutils-8.22-24.el7.x86_64
以后想删掉ls这条命令的时候,就可以通过卸载coreutils-8.22-24.el7.x86_64来实现
rpm -qR:查询软件包的依赖关系
安装包的时候需考虑与其他包的依赖关系。rpm -qR 用来查询已安装包的依赖关系,该命令的格式为: [root@localhost ~]# rpm -qR 包名 -R(大写)选项的含义是查询软件包的依赖性,是 requires 的首字母。 例如,查询 apache 软件包的依赖性,可执行以下命令:
[root@zaishu ~]
/bin/bash
/bin/sh
/etc/mime.types
/usr/sbin/useradd
apr-util-ldap
chkconfig
config(httpd) = 2.4.6-97.el7.centos.2
httpd-tods = 2.4.6-97.el7.centos.2
…省略部分输出…
rpm -qRp:查询未安装包的依赖关系
同样,在此命令的基础上增加 -p 选项,即可实现查找未安装软件包的依赖性。 例如,bind 软件包尚未安装查看此软件包的依赖性可执行如下命令:
[root@zaishu Packages]
/bin/bash
/bin/sh
bind-libs = 32:9.8.2-0.10.rc1.el6
chkconfig
chkconfig
config(bind) = 32:9.8.2-0.10.rc1.el6
grep
libbind9.so.80
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
…
RPM安装
包的安装
rpm -ivh 包全名 ; 注意: 这儿一定要使用包全名,不是包名。
rpm -ivh 包全名
-i:安装(install);
-v:显示更详细的信息(verbose);
-h:打印
例:安装 Percona-Server-shared软件包
[root@zaishu ~]
warning: Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
Updating / installing...
1:Percona-Server-shared-56-5.6.38-r
第一个 100% 表示完成了准备工作;第二个100%表示安装完成。对于已经安装的包,只会有准备的那个100%
[root@zaishu ~]
warning: Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
package Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64 is already installed
例: 安装多个软件包
[root@zaishu ~]
warning: Percona-Server-client-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
Updating / installing...
1:Percona-Server-client-56-5.6.38-r
2:Percona-Server-server-56-5.6.38-r
其他参数选项
如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:
选项 | 含义 |
---|
-nodeps | 不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。 | -replacefiles | 替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。 | -replacepkgs | 替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。 | -force: | 强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles 和 -replacepkgs 的综合。 | -test | 测试安装。不会实际安装,只是检测一下依赖性。 | -prefix | 指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。 |
例 -nodeps: 不检测依赖
可以看到当正常安装Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64.rpm的时候,提示需要其他两个包,这就是依赖性,需要先安装Percona-Server-client-56和Percona-Server-shared-56才能安装Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64.rpm。
[root@zaishu ~]
warning: Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
Percona-Server-client-56 is needed by Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64
Percona-Server-shared-56 is needed by Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64
如果加上 -nodeps ,表示不检查依赖性,直接安装。实际工作当中,是不建议这样安装,因为即使安装成功,也不代表这个包能够正常使用。
[root@zaishu ~]
warning: Percona-Server-server-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
Updating / installing...
1:Percona-Server-server-56-5.6.38-r
例 --force:强制安装
[root@zaishu ~]
warning: Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
Updating / installing...
1:Percona-Server-shared-56-5.6.38-r
这个时候再安装,会提示已经安装
[root@zaishu ~]
warning: Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
package Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64 is already installed
加上–force 表示会强制安装,替换软件包和文件
[root@zaishu ~]
warning: Percona-Server-shared-56-5.6.38-rel83.0.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...
Updating / installing...
1:Percona-Server-shared-56-5.6.38-r
RPM包安装路径
RPM 包安装后的默认路径列表。所有安装文件会按照下面分类放置在不同的目录之中。
安装路径 | 含 义 |
---|
/etc/ | 配置文件安装目录 | /usr/bin/ | 可执行的命令安装目录 | /usr/lib/ | 程序所使用的函数库保存位置 | /usr/share/doc/ | 基本的软件使用手册保存位置 | /usr/share/man/ | 帮助文件保存位置 |
RPM 包的默认安装路径通过命令查询的。 RPM 包可以人为指定安装路径,但不推荐。因为手工指定的路径,系统中用来查询安装路径的命令无法自动识别使用。
[root@zaishu ~]
/etc/logrotate.d/mysql
/usr/bin/innochecksum
....
/usr/bin/resolveip
/usr/lib/systemd/system/mysqld.service
..
/usr/lib64/mysql/plugin/adt_null.so
...
/usr/lib64/mysql/plugin/validate_password.so
/usr/sbin/mysqld
...
/usr/sbin/rcmysql
/usr/share/doc/Percona-Server-server-56-5.6.38
...
/usr/share/percona-server/ukrainian/errmsg.sys
....
注意: 后面在讲解源码包编译安装方式的时候,会手工指定安装路径。但二进制包不要画蛇添足时指定安装路径。
RPM包的升级
语法:
[root@localhost ~]
-U(:如果该软件没安装过则直接安装;若已有安装则升级至最新版本。
[root@localhost ~]
-F:如果该软件没有安装,不会安装,必须有较低版本才能升级。
RPM包的卸载
语法: [root@localhost ~]# rpm -e 包名 [-nocteps] -e : erase 首字母,表示卸载。 -nocteps : 不检查依赖直接卸载。不建议使用~
rpm -e 卸载包
[root@zaishu ~]
依赖性
RPM 软件包的卸载要考虑包之间的依赖性。例如,我们先安装的 httpd 软件包,后安装 httpd 的功能模块 mod_ssl 包,那么在卸载时,就必须先卸载 mod_ssl,然后卸载 httpd,否则会报错。 软件包卸载和拆除大楼是一样的,本来先盖的 2 楼,后盖的 3 楼,那么拆楼时一定要先拆除 3 楼。 如果卸载 RPM 软件不考虑依赖性,执行卸载命令会包依赖性错误,例如:
[root@node1 Packages]
error: Failed dependencies:
httpd = 2.4.6-88.el7.centos is needed by (installed) httpd-devel-2.4.6-88.el7.centos.x86_64
httpd = 2.4.6-88.el7.centos is needed by (installed) httpd-manual-2.4.6-88.el7.centos.noarch
[root@node1 Packages]
[root@node1 Packages]
[root@node1 Packages]
[root@node1 Packages]
httpd-tools-2.4.6-88.el7.centos.x86_64
[root@node1 Packages]
卸载命令
当想删除一条命令的时候,可能更多是想将这个命令对应的软件进行卸载,彻底删除这条命令。
查找命令的绝对路径
[root@node1 ~]
/usr/bin/samba-regedit
查找这条命令对应的包,需要提供绝对路径
[root@node1 ~]
samba-client-4.8.3-4.el7.x86_64
卸载包
[root@node1 ~]
RPM包验证和数字证书
系统中有非常多的RPM 包,每个包安装后又有大量的文件。因此这些包或者文件都有可能被修改或删除。为了能及时发现文件做了变更或者被人恶意篡改文件等问题,系统提供了两种检测方式:
- 包校验:将已安装文件和 /var/lib/rpm/ 下的的数据库进行比较,来确定文件是否被修改。
- 包数字证书校验:用来校验 包本身是否被修改。
Linux RPM 包校验
包校验用来判断已安装的软件包(或文件)是否被修改,此方式可使用的命令格式分为以下 3 种。
[root@zaishu~]
-Va 选项表示校验系统中已安装的所有软件包。
[root@zaishu~]
-V 选项表示校验指定 RPM 包中的文件,是 verity 的首字母。
[root@zaishu~]
-Vf 选项表示校验某个系统文件是否被修改。
例1. 对安装后的文件做修改 apache 软件包中所有的安装文件是否被修改,可执行如下命令:
当不做任何变更的时候,如果没有输出表示没有做修改
[root@localhost -]
apache 的配置文件 /etc/httpd/conf/httpd.conf 进修改后;再验证这个包
[root@node1 conf]
S.5....T. c /etc/httpd/conf/httpd.conf
可以看到,结果显示httpd.conf这个文件修改过。输出的信息可分为以下 3 部分:分别是验证信息,文件类型,文件名称。
第一列是验证信息 最前面的 8 个字符(S.5…T)都属于验证信息,每列含义如下:
| 第一列:S.5…T. |
---|
S | 文件大小是否改变。 出现S表示文件大小改变了 | M | 文件的类型或文件的权限(rwx)是否改变。 | 5 | 文件MD5校验和是否改变(可以看成文件内容是否改变)。 | D | 设备的主从代码是否改变。 | L | 文件路径是否改变。 | U | 文件的属主(所有者)是否改变。 | G | 文件的属组是否改变。 | T | 文件的修改时间是否改变。 | . | 若相关项没发生改变,用 . 表示。 |
通过验证信息可以知道这个文件的大小和md5码,mtime都变更过。
第二列是文件类型 分为以下几类:
字符 | 含义 |
---|
c | 配置文件(configuration file)。 | d | 普通文档(documentation)。 | g | "鬼"文件(ghost file),很少见,就是该文件不应该被这个 RPM 包包含。 | l | 授权文件(license file)。 | r | 描述文件(read me)。 |
第三列是文件名称 被修改文件所在绝对路径和文件名。
因此S.5…T. c /etc/httpd/conf/httpd.conf 表达的完整含义是:配置文件 httpd.conf 的大小、内容、修改时间被人为修改过。 注意:通常修改配置文件是正常的情况,需要留意是那些被恶意修改过文件。
Linux RPM数字证书验证
之前方法是验证已经安装包后相关文件信息。如果在安装前,rpm包已经被修改,不是厂家提供的包,这个时候需要使用 RPM 数字证书来验证。 数字证书,又称数字签名,由软件开发商直接发布。Linux 系统安装数字证书后,若 RPM 包做了修改,此包携带的数字证书也会改变,将无法与系统匹配,软件无法安装。 可以将数字证书想象成自己的签名,是不能被模仿的(厂商的数字证书是唯一的) 使用数字证书验证 RPM 包的方法具有如下 2 个特点:
- 需要找到原厂的公钥文件,才能进行安装。
- 安装 RPM 包会提取包中证书信息,然后安装的原厂证书进行验证。验证通过,允许安装;验证失败,不允许安装并发出警告。
#系统中的数字证书位置
[root@node1 conf]
-rw-r--r--. 1 root root 1690 Nov 23 2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
安装数字证书
[root@node1 conf]
--import表示导入数字证书
数字证书安装完成后,可使用如下命令进行验证:
[root@node1 conf]
gpg-pubkey-f4a80eb5-53a7ff4b
查询数字证书 数字证书也是一个包,可以用 rpm 命令查询数字证书的详细信息:
[root@node1 conf]
...
-----END PGP PUBLIC KEY BLOCK----
卸载数字证书 使用 -e 选项:
[root@node1 conf]
虽然数字证书可以手动卸载,但不推荐大家将其卸载。
安装数字证书后。在系统上安装 RPM 包时,系统会自动验证包的数字证书,验证通过则可以安装, 反之将无法安装(系统会报错)。
RPM包的数据库
系统中安装的所有RPM包,信息会保存到 RPM 数据库中,用户在使用 rpm 命令对执行查询、安装和卸载等操作的时候,会通过这个数据库中得到相关信息。
重建RPM包的数据库
在实际操作过程中有可能有一些操作导致数据库损坏,例如升级过程强行退出、安装时候意外中断,甚至误删除数据库等操作,都可能导致数据库出现故障。 后续再使用rpm命令的时候,由于数据库出现故障,请求无法执行。这时需要重建数据库,操作步骤如下:
删除已损坏的数据库,执行如下命令:
[root@zaishu ~]
Basenames __db.001 __db.003 Dirnames Installtid Obsoletename Providename .rpm.lock Sigmd5
Conflictname __db.002 .dbenv.lock Group Name Packages Requirename Sha1header Triggername
[root@zaishu ~]
[root@zaishu ~]
ls: cannot access /var/lib/rpm/__db*: No such file or directory
重建 RPM 数据库,执行如下命令:
[root@zaishu ~]
[root@zaishu ~]
-rw-r--r-- 1 root root 270336 Nov 15 15:44 /var/lib/rpm/__db.001
-rw-r--r-- 1 root root 81920 Nov 15 15:44 /var/lib/rpm/__db.002
-rw-r--r-- 1 root root 1318912 Nov 15 15:44 /var/lib/rpm/__db.003
人为修改数据库
为了不想让管理员 通过包校验检查出软件异常,进而手工修改数据库。对于这种情况,可以按照以下步骤对文件进行检测:
对于要校验的文件或命令,找到它属于哪个软件包,如下命令所示:
[root@node1 ~]
samba-4.8.3-4.el7.x86_64
使用 -dump 选项查看每个文件的信息,使用 grep 命令提取对应文件信息:
rpm -ql --dump samba|grep /etc/pam.d/samba,输出结果中 177表示 smb 文件最初的字符数。
adf2c510d4218ac0b3f72898cfe4097c0d1c9836da2b0237929af6bf4619ea84表示 文件的 MD5 校验值。
0644 root root表示文件权限及所有者、所属组。
查看文件,通过对比文件大小,所有人、所属组、权限、MD5 校验值等数据,判断文件是否改动过:
[root@node1 ~]
c8d4d43f8a3f06190fcf32ff7e8b87b5 /etc/pam.d/samba
以上校验结果显示,系统的 /etc/rc.d/init.d/smb 文件的信息和通过 rpm-ql-dump Samba 命令获取的信息不一致,因此可以断定此文件没有被更改过。
总结
本小节会详细介绍linux中的软件包管理,涉及软件包的定义/安装/卸载/依赖等操作。以及会详细演示rpm这个非常重要命令的使用。
|