RPM命令详解(程序包管理器)

一:什么是RPM程序包管理器

  程序包管理器是一种用于管理软件包的工具,它可以方便地安装、升级、卸载和管理软件包。程序包管理器通常包含了一个软件包仓库,其中包含了大量预打包好的软件包供用户选择和安装。
  RPM(Red Hat Package Manager)就是一种常见的程序包管理器,是由RedHat公司提出,它是一种用于管理软件包的文件格式和工具集。RPM使用特定的文件格式(.rpm)来打包软件包,并提供了一组命令行工具用于在基于RPM的Linux系统上安装、升级、查询和删除软件包。每个RPM软件包实际上是一个二进制文件,其中包含了要安装的软件文件、元数据以及其它必要的信息。当您运行rpm命令进行安装或升级时,RPM会读取软件包中的信息,并将文件复制到适当的位置。为了跟踪已安装的软件包,RPM使用一个数据库来记录系统上所有已安装的软件包的信息。这个数据库存储了软件包的名称、版本、安装路径以及其它相关信息。通过查询数据库,您可以获取有关已安装软件包的详细信息。说白了RPM是一种用于管理软件包的文件格式和工具集,它使用特定的文件格式打包软件,并提供了命令行工具来操作这些软件包。它还维护一个数据库,记录系统上已安装的软件包的相关信息。
  补充:一般来说,在安装RPM类型的文件时,会先去读取文件内记录的设置参数内容,然后将该数据用来对比Linux系统的环境,以找出是否有属性依赖的软件尚未安装的问题。若环境检查合格,那么RPM文件就被安装到Linux系统上。安装完毕后,该软件的相关信息就会被复制写入到/var/lib/rpm目录下的数据库文件中,并且还会在RPM的数据库(/var/lib/rpm)里写入安装的版本信息等记录写入RPM数据库是因为未来如果我们有任何软件升级的需求,查询系统已经安装软件的需求,查询软件详细信息的需求等都是由这个数据库记录提供的。
  通过:rpm --eval '%{_dbpath}'  命令查询RPM数据库位置

1:RPM包的优缺点

优点:
    ①:由于已经编译完成井且打包完华,所以软件传输与安装上很方便(不需要再重新编译那个如tar.gz的源码包)。
    ②:RPM在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装。
    ③:RPM本身提供软件版本信息、依赖属性检查、软件用途说明、软件所含文件等信息;便于了解软件
    ④:RPM管理使用数据库记录RPM文件的相关参数,便于查询、删除、升级与反安装。
缺点:
    由于RPM文件是已经打包好的数据,也就是说,里面的数据已经都编译完成了,所以该安装文件几乎只能安装在原本默认的硬件与操作系统版本中
    所以你的主机系统环境必须要与当初建立这个软件安装文件的主机环境相同才行。

2:RPM包命名规范

源代码命令规范:name-VERSION.tar.gz;(源码包集合了两种命令,tar和gzip)
    举例:redis-7.0.12.tar.gz(Redis源码包)、nginx-1.22.1.tar.gz(Nginx源码包)
    tar:用于打包多个文件或目录为单个文件、gzip则用于对该打包文件进行压缩。tar.gz因此成为一种常见的归档和压缩格式。

RPM包命名规范:name-version-release.architecture.rpm
    组成部分:
        name: 软件包的名称,通常使用小写字母命名,可以包含数字、连字符和下划线,例如:mysql-community-server
        version: 软件包的版本号,通常使用数字和点号(.)进行表示,例如:5.7.33
        release: 软件包的发布号,用于标识软件包在某个版本下的不同发布或修订版,通常使用数字,例如:1
            说明:当在同一个软件包版本下需要进行修改或修复时,可以使用发布号来区分不同的修订版。修订版是基于同一软件包版本的补充
          或修正版本,用于解决已知的问题、漏洞或错误。具体来说,如果在某个特定的软件包版本中发现了问题,为了修复这个问题,
          开发者可能会对软件包进行修改并重新发布。而为了区分这个修订版和原始发布版,可以通过增加发布号来标识。举个例子,假
          设有一个软件包的初始版本是name-version-1.arch.rpm,其中发布号为1。若在该版本中发现了一个bug,开发者对软件           包进行修复,并重新发布一个修订版。为了区分这个修订版和初始版本,可将发布号递增,如name-version-2.arch.rpm。
architecture: 软件包适用的体系结构,通常使用一个固定的架构标识符,如x86_64(64位系统)、i386(32位系统)等 命名规范: ①:名称应该全部采用小写字母,并可以包含数字、连字符(-)和下划线(_)。避免使用特殊字符或空格,以免引起命名上的问题。 ②:版本号通常由数字和点号(.)组成,避免在版本号中使用特殊字符或空格,例如:1.0.0。 ③:发布号用于标识软件包在某个版本下的不同发布或修订版。建议使用数字来表示发布号,例如:1、2 ... ③:架构标识需要按照当前打的RPM包的运行环境如实设置,例如:x86_64 架构标识由两部分组成(操作系统.操作系统结构)常见架构名称: 操作系统: RedHat系列:el6(Linux 6版本)、el8(Linux 8版本) CentOS系列:centos6(CentOS 6版本)、centos7(CentOS 7版本)、centos8(CentOS 8版本) Fedora系列:fc34、fc35、fc36 等:Fedora 的不同版本,按照版本号递增。 操作系统架构: noarch: 不依赖任何操作系统架构 i386: 32位x86体系结构 x86_64: 64位x86体系结构 armv7hl: ARMv7体系结构 aarch64: ARM64位体系结构 ppc64le: 64位POWER体系结构(Little Endian) s390x: IBM System z体系结构 MySQL的RPM包文件名示例: mysql-community-client-5.7.33-1.el7.x86_64.rpm mysql-community-common-5.7.33-1.el7.x86_64.rpm mysql-community-libs-5.7.33-1.el7.x86_64.rpm mysql-community-server-5.7.33-1.el7.x86_64.rpm MySQL的RPM包部分说明: mysql-community名称(MySQL社区版) client、common、libs、server(分支版本,如MySQL的客户端、公共包、动态链接库、服务端) 5.7.33版本号;1代表这5.7.33版本中第一次编译成RPM包 el7.x86_64(RedHat 7系列的64位x86体系系统适用)

3:RPM包获取途径

    网易云镜像站点:http://mirrors.163.com/
    阿里云镜像站点:https://developer.aliyun.com/mirror/
    Centos官方站点:http://mirror.centos.org/
    pkgs【第三方】:https://pkgs.org/
    pbone【第三方】:http://rpm.pbone.net/
    rpmfind【第三方】:http://www.rpmfind.net/

二:RPM命令详解

  我们可以使用:rpm --help 查询详细说明

1:RPM命令五大基本模式

RPM命令五大基本模式
    Query:用来查询RPM软件包。
    Verify :用来验证RPM软件包。
    Install : 使用于安装任意的RPM包。
    Upgrade : 用于更新已经存在的RPM软件包。
    Remove :用于擦除,删除或卸载任何RPM软件包。

2:通用命令

  说明:--开头的命令若存在值的话需要:--xxx='xxx'
  说明:-开头的命令若存在值的话需要:-xxx 'xxx'

所有rpm模式下可执行文件的通用选项:
    --nodigest              不检查包签名信息,不检查包的合法性
    --nosignature           不检查包完整性信息
    --quiet                 提供更少的详细信息输出
    -v,--verbose            提供更多的详细信息输出
    -vv                     提供超多的详细详细输出
    --version               打印使用的 rpm 版本号
    --querytags             显示已知的软件包可用查询标签
    -r, --root=ROOT         使用 ROOT 作为顶级目录 (default: "/")
    --dbpath=DIRECTORY      使用DIRECTORY目录中的数据库

补充详细说明:
--querytags:列出RPM数据库中可用的查询标签。这些标签表示可在查询命令中使用的不同信息字段
    如常见标签:
        [NAME]软件包的名称、[VERSION]软件包的版本、[RELEASE]软件包的发布号、[SIZE]软件包的大小、
        [VENDOR]软件包的供应商、[LICENSE]软件包的许可证信息、[URL]软件包的网址、[DESCRIPTION]软件包的描述信息
    基本使用:(以curl-7.29.0-59.el7_9.1.x86_64举例)
        rpm -q --queryformat '名称:%{NAME} 版本:%{VERSION} 地址:%{URL} 大小:%{size} \n' curl
            打印:名称:curl 版本:7.29.0 地址:http://curl.haxx.se/ 大小:540396
-r,--root=ROOT:是用于指定RPM数据库的根目录的选项,而不是一个单独的命令。
    此选项允许您指定要操作的RPM数据库的根目录。通常情况下默认的根目录是"/",也就是整个文件系统。但使用--root选项,
    您可以将操作的范围限制在特定的根目录下。
    例如:我把mysql安装包安装到了/home下,我查询包则需要指定方式
        安装到/home目录下
            rpm -ivh mysql-community-common-5.7.33-1.el7.x86_64.rpm -r '/home'
        切换/home目录下查询可以查询刚才装的mysql
            rpm -qa -r '/home'
--dbpath=DIRECTORY:是用于指定RPM数据库文件所在目录的选项。
    在RPM中,数据库文件位于特定目录中,存储有关已安装软件包的信息。默认情况下数据库文件位于/var/lib/rpm/目录下。
    使用--dbpath选项可以指定RPM命令使用的数据库文件所在的目录。这对于需要在不同位置或备份的数据库文件上执行操作非常有用。
    比如我查询上面安装好的mysql,指定RPM数据库位置
        rpm -qa --dbpath='/home/var/lib/rpm'

3:安装、卸载、更新

### 安装命令
安装命令:rpm { -i | --install } [ install-options ] PACKAGE_FILE
    -i, --install    安装软件包
    --replacepkgs    如果软件包已经有了,重新安装软件包
    --allfiles       安装全部文件及配置文件。
        说明:在安装软件包时,默认RPM会跳过已经存在于系统上的配置文件,并保留用户修改的配置。但使用--allfiles选项将强
        制RPM安装软件包中的所有文件,包括配置文件,这样可能会覆盖用户进行的任何更改。这可能会导致配置重置或损坏。
    --ignoresize     在安装前不检查磁盘空间
    --ignorearch     不验证软件包架构
    --ignoreos       不验证软件包操作系统
    --excludedocs    不安装程序文档
常用命令
    ①:基本安装如MySQL的RPM包
        rpm -ivh mysql-community-common-5.7.33-1.el7.x86_64.rpm
    ②:不验证软件包的依赖安装(但可能安装后无法正常使用,因为未安装需要的依赖包)
        rpm -ivh --nodeps mysql-community-common-5.7.33-1.el7.x86_64.rpm
    ③:安装前的测试(测试是否可以安装,和安装打印的信息一样,但只是模拟安装)
        rpm -ivh --test mysql-community-common-5.7.33-1.el7.x86_64.rpm

### 更新命令
升级命令:rpm { -U | --upgrade } [install-options] PACKAGE_FILE
升级命令:rpm { -F | --freshen } [install-options] PACKAGE_FILE
    -U, --upgrade    升级或安装软件包
    -F, --freshen    只有软件包已经安装,才可升级软件包
    --justdb         更新数据库,但不修改文件系统
注意说明:
    ①:不要对内核程序做升级操作;Linux是支持多内核版本并存,因此我们只需要直接安装新版本内核即可。
    ②:如果原程序包的配置文件被修改过,升级时新版本的程序配置文件不会覆盖原版本的配置文件,而是把新版本的配置文件重新命名
        为如FILENAME.rpmnew后提供升级包使用。
常用命令:
    ①:对已经安装的MySQL的包进行升级
        rpm -ivh mysql-community-common-5.7.33-1.el7.x86_64.rpm
        ## 升级版本 8 版本
        rpm -Fvh mysql-community-common-8.0.33-1.el7.x86_64.rpm
        说明:若使用-U则代表升级(已存在)或安装(之前未安装)

### 卸载命令
卸载命令:rpm {e | --erase } [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME
    -e, --erase          清除 (卸载) 软件包
常用命令:
    ①:测试卸载已经安装的(若卸载多个请使用空格在后面隔开)
        rpm -evh --test mysql-community-common-8.0.33-1.el7.x86_64

### RPM模式下可执行文件的通用选项
    --test                 不真正安装,只是判断下是否能安装
    --nodeps               不验证软件包依赖
    --percent              安装软件包时打印百分比
    -h, --hash             软件包安装的时候列出哈希标记(就是进度条)(和-v一起使用效果更好)
    --replacefiles         忽略软件包之间的冲突的文件
    --force                用于强制执行操作的选项
        它可以与不同的RPM命令一起使用,如rpm -i(安装)、rpm -U(升级)和rpm -e(卸载)等。
        安装(-i):--force选项可以强制覆盖现有的文件,即使相同路径下已经存在文件。
        升级(-U):--force选项可以强制执行软件包升级,即使软件包版本低于或等于已安装软件包的版本。
        卸载(-e):--force选项可以强制卸载软件包,即使软件包被其他软件所依赖。

4:查询

查询命令:rpm { -q | --query }[select-options][query-options]
    【select-options】选项:
        ①:PACKAGE_NAME:查询指定的程序包是否已经安装及版本信息
            查询curl功能的rpm包:rpm -q curl-7.29.0-59.el7_9.1.x86_64
        ②:-a,--all:查询所有已经安装的包
            比如查询全部:rpm -qa
            比如搜索指定信息:rpm -qa | grep '^mysql'
        ③:-f,--file:查询指定的文件由哪个程序包安装生成的
            比如查询/etc/yum.conf是由哪个rpm程序包生成的:rpm -q -f '/etc/yum.conf'
        ④:-p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作
            比如查询这个未安装的MySQL的rpm包:rpm -qp mysql-community-client-5.7.33-1.el7.x86_64.rpm
        ⑤:--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
            需要配合--provides查询选项:
                查询所有能力:rpm -q --provides mysql-community-client-5.7.33-1.el7.x86_64
                查询指定的能力由谁提供:rpm -q --whatprovides 'mysql'
        ⑥:--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
            查询:rpm -q --whatrequires 'mysql'

    【query-options】查询选项
        ①:--changelog:查询rpm包的修改日志(编译为RPM包的每个版本日志)
            查询已安装的rpm包版本日志:rpm -q --changelog vim-common-7.4.629-8.el7_9.x86_64
            查询未安装的rpm包版本日志:rpm -qp --changelog mysql-community-common-8.0.33-1.el7.x86_64.rpm
        ②:-l,--list:查询程序包生成的所有文件列表
            查询已安装的rpm包会生成哪些文件:rpm -ql yum-3.4.3-168.el7.centos.noarch
            查询未安装的rpm包会生成哪些文件:rpm -qpl mysql-community-server-5.7.33-1.el7.x86_64.rpm
            假如想查看会生成的配置文件则:rpm -qpl mysql-community-server-5.7.33-1.el7.x86_64.rpm | grep '^/etc/'
        ③:-i,--info:程序包相关的信息、版本号、大小、所属的包组等
            查询已经安装的MySQL的rpm包信息:rpm -qi mysql-community-client-5.7.33-1.el7.x86_64
        ④:-c,--configfiles:查询指定的程序包提供的配置文件
            查询已安装的MySQL提供的配置文件:rpm -qc mysql-community-server-5.7.33-1.el7.x86_64
        ⑤:-d,--docfiles:查询指定的程序包提供的文档
            查询已安装的MySQL提供的文档:rpm -qd mysql-community-server-5.7.33-1.el7.x86_64
        ⑥:--provides:列车指定程序包提供的所有的CAPABILITY。
            比如查询已安装的MySQL客户端有哪些能力:rpm -q --provides mysql-community-client-5.7.33-1.el7.x86_6
        ⑦:-R.--requires:查询指定程序包的依赖关系
            比如查询安装MySQL服务的RPM包需要依赖哪些RPM包:rpm -qR mysql-community-server-5.7.33-1.el7.x86_64
        ⑧:--scripts:查看程序自带的脚本片段
            比如查询bash包写的:rpm -q --scripts 'bash-4.2.46-34.el7.x86_64'
补充:
    CAPABILITY为能力:
        比如--provides选项用于列出指定程序包提供的所有能力(capabilities)。在RPM软件包中,除了提供文件和功能之外,
        还可以声明它们提供特定的能力。这些能力可以是函数、库、接口、命令等。它们允许其它软件包或系统识别某个程序包所提供的功能。

5:校验

校验语法:rpm { -V | --verify }[select-options][verify-options]
校验yum-3.4.3-168.el7.centos.noarch的程序是否被修改
    我在/etc/yum.conf文件下随便修改个东西
    校验:rpm -V yum-3.4.3-168.el7.centos.noarch
    打印:S.5....T.  c /etc/yum.conf       注:c代表文件、d代表文件夹
    具体说明:文件属性包括属主、属组、权限、MD5签名、大小、主设备号、从设备号、符号连接及最后修改时间9项内容,
        其中每一项改变RPM都会发现。这9 属性RPM并非都校验,因为文件类型不同,其中某些属性会没有意义,RPM因而也不会去检查。
        如果文件某属性正常,则对应的位置会显示字符'.',否则的话将显示对应的字母,如下所示:
            S    表示文件大小改变
            M    表示权限改变
            5    表示MD5签名改变,也就是内容改变了
            D    表示主从设备号改变
            L    表示符号连接改变
            U    表示属主改变
            G    表示属组改变
            T    表示最后修改时间改变(即使你未改变文件,只是再次保存都会记录)
            c    表示文件属于配置文件
    若需要排除一些信息校验则如下:
        排除校验:rpm -V --nomd5 yum-3.4.3-168.el7.centos.noarch
            打印:S......T.  c /etc/yum.conf
        可选项:
            --nomd5     关闭MD5签名改变(不校验内容是否被修改)
            --nosize    关闭文件大小改变校验
            --nogroup   关闭属组改变
            --nomtime   关闭时间修改校验

.

posted @ 2023-08-20 17:17  蚂蚁小哥  阅读(2325)  评论(0编辑  收藏  举报