
rpm详解——原理,命令详细讲解
目录 什么是RPM SRPM (Source RPM) RPM软件包 RPM 查询命令 RPM 软件包的安装、卸载 辅助选项 RPM 升级与更新 典型应用程序的目录结构 先抛出三个问题...
目录
什么是RPM
SRPM (Source RPM)
RPM软件包
RPM 查询命令
RPM 软件包的安装、卸载
辅助选项
RPM 升级与更新
典型应用程序的目录结构
先抛出三个问题,最后简单解释一下。
rpm包是如何得到的?
rpm包是如何制作出来的的?
rpm包在安装时能否指定路径?
下面文字的原理讲解可能有点多,大家只想看命令的话直接跳到RPM命令标题即可。
什么是RPM
RPM 全名 RedHat Package Managerment,是由Red Hat公司提出,被众多Linux发行版本所采用,是一种数据库记录的方式来将所需要的软件安装到到Linux系统的一套软件管理机制。它会建立统一的数据库文件,详细记录软件包安装 、卸载等变化信息,能够自动分析软件包依赖关系它最大的特点就是将你要安装的软件先编译过,并且打包成为 RPM 机制的文件,通过打包好的软件里面默认的数据库,记录这个软件要安装的时候必须具备的依赖属性软件。当在你的 Linux 主机安装时,RPM 会先依照软件里面的数据查询Linux 主机的依赖属性软件是否满足,若满足则子以安装,若不满足则不子安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装。
优点:
由于已经编译完成井且打包完华,所以软件传输与安装上很方便(不需要再重新编译)。RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装。RPM 本身提供软件版本信息、依赖属性检查、软件用途说明、软件所含文件等信息;便于了解软件RPM 管理使用数据库记录RPM文件的相关参数,便于查询、删除、升级与反安装。
缺点:
由于 RPM 文件是已经打包好的数据,也就是说,里面的数据已经都编译完成了,所以,该软件安装文件几乎只能安装在原本默认的硬件与操作系统版本中。所以你的主机系统环境必须要与当初建立这个软件安装文件的主机环境相同才行。
所以,通常不同的 Linux 发行版所发布的RPM文件,并不能用在其他的 Linux 发行版上。但如果我们真的想要安装其他Linux发行版的RPM软件包怎么办?这时候就该用到我们SRMP。
SRPM (Source RPM)
SRPM文件里面含有原始码(Source Code),即SRPM所提供的软件内容并没有进行编译,提供的是源代码SRPM的文件名是以 ***.src.rpm这种格式来命名虽然SRMP的内容是源代码,但是它仍然含有该软件所需的依赖性软件说明以及所有RPM文件所提供的数据,也提供了参数的配置文件,所以如果我们用的是SRPM的话,安装时,需要先将该软件以RPM管理的方式进行编译,此时SRPM会被编译成RPM文件,然后再将RPM文件安装到Linux系统当中。
RPM软件包
一般来说,在安装RPM类型的文件时,会先去读取文件内记录的设置参数内容,然后将该数据用来对比Linux系统的环境,以找出是否有属性依赖的软件尚未安装的问题。
若环境检查合格,那么RPM文件就被安装到Linux系统上。安装完毕后,该软件的相关信息就被写入到/var/lib/rpm目录下的数据库文件中了。
RPM的数据库:/var/lib/rpm
这个目录内的数据很重要,因为未来如果我们有任何软件升级的需求,查询系统已经安装软件的需求,查询软件详细信息的需求等都是由这个数据库记录提供的
故障原因:
非正常关机、误删除运行中的程序文件RPM数据文件被误写或删除
当RPM数据库损坏时,需要进行数据库重建
格式:rpm --rebuilddb 或者 rpm --initdb
接下来我们来查看一些放在光盘里RPM包。
# 通过挂载光盘镜像(可以指定挂载点)来查看Package
[root@zabbix_server ~]# mount /dev/cdrom /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@kafka01 ~]# ll /dev/cdrom
lrwxrwxrwx 1 root root 3 12月 21 20:10 /dev/cdrom -> sr0
光驱:读光盘的一个设备(驱动器) --> cdrom
/dev/cdrom 对应光驱的设备文件 --> dev/sr
挂载成功之后,可以去挂载点查看文件 Centos8的系统中Packages再AppStream下,7的系统直接在mnt下就可以找到 [root@kafka01 ~]# cd /mnt/AppStream/Packages/
# Packages里的包基本都是rpm的包,列一点点如下
可以统计一下总共有多少
[root@zabbix_server ~]# ls /mnt/Packages|wc -l 4071
[root@kafka01 Packages]# ls openssh-askpass-8.0p1-5.el8.x86_64.rpm openssh-askpass-8.0p1-5.el8.x86_64.rpm
一般命名格式:
openssh-askpass
8.0p1
5
.el8
x86_64
.rpm
软件名称
软件版本信息
发布的次数
企业版的Linux8
硬件平台
扩展名
el --> enterprise el8 --> 企业版的Linux 8
noarch --> no architecture --> 不区分架构,即没有任何硬件等级上的限制,一般这种类型的RPM文件中没有二进制程序文件存在,常出现的就是属于shell脚本方面的软件
RPM 查询命令
查询已安装的RPM软件信息 格式:rpm -q[子选项] [软件名] 用法:结合不同子选项完成不同查询
-qa:查看系统中已安装的所有RPM软件包列表-qi:查看指定软件的详细信息(information)-ql:列出该软件所有的文件与目录所在的完整文件名(list)-qc:列出该软件所有的配置文件(找出在/etc下的文件)-qd:列出该软件所有的说明文件(找出与man相关的文件)-qR:列出与该软件有关的依赖软件所含的文件(Required)
查询文件/目录属于哪个RPM软件
rpm -qf 文件或目录名
查询未安装的RPM包文件 格式:rpm -qp[子选项] [RPM包文件] 用法:-qp后接的所有参数与上面说明的一致,但用途仅在找出某个RPM文件内的信息,而非已安装的软件信息
-qpi:通过.rpm包文件查看该软件的详细信息-qpl:查看.rpm安装包内所包含的目录、文件列表-qpc:查看.rpm安装包内包含的配置文件列表-qpd:查看.rpm安装包内包含的文档文件列表
接下来随意列举几个应用一下命令
[root@kafka01 ~]# rpm -qa
[root@kafka01 ~]# rpm -qi nginx
[root@kafka01 etc]# rpm -ql nginx
[root@kafka01 etc]# rpm -qf dhcp
dhcp-client-4.3.6-44.0.1.el8.x86_64
[root@zabbix_server ~]# rpm -qpl /mnt/Packages/zsh-5.0.2-34.el7_8.2.x86_64.rpm |more
# 查看openssh的安装包
[root@kafka01 ~]# rpm -qa|grep openssh
openssh-8.0p1-5.el8.x86_64
openssh-server-8.0p1-5.el8.x86_64
openssh-clients-8.0p1-5.el8.x86_64
[root@kafka01 ~]# rpm -ql openssh-server
/etc/pam.d/sshd
RPM 软件包的安装、卸载
# 卸载
rpm -e zsh
选项与参数: -i:install 安装 -v:查看更详细的安装信息 -h:显示安装进度 -e:erase 卸载清除安装包
依赖关系 安装有依赖关系的多个软件时,被依赖的软件包需要先安装 --> 需要同时指定多个.rpm包文件进行安装 卸载有依赖关系的多个软件时,依赖其他程序的软件包需要先卸载 --> 同时指定多个软件吗进行卸载
yum可以自动解决依赖关系,但rpm安装需要我们自己去解决依赖关系结合 "--nodeps"可以忽略依赖关系,但可能导致软件异常
辅助选项
--force:强制安装所指定的rpm软件包
--nodeps:安装、升级或卸载软件时,忽略依赖关系
--replacefiles:在安装过程中出现某个文件已经被安装在你的系统上的信息,或出现版本不合的信息,可以用这个参数直接覆盖文件
--replacekgs:重新安装某个已经安装过的软件。防止安装RPM文件时因为某软件已安装导致无法继续安装
--test:测试软件是否可以被安装到用户的Linux环境中
建议:尽量安装时直接使用 -ivh 就好,尽量不要使用--force暴力安装,否则可能会发生很多不可预期的问题。
RPM 升级与更新
格式:rpm [选项] [RPM包文件]…
选项与参数
-i:安装一个新的rpm软件包-U:升级某个rpm软件,若原本未装,则进行安装
需要自己提供高版本的软件包,不会自动去帮助到哪里下载-F:更新某个rpm软件,若原本未装,则放弃安装
所以最后,大家应该就能知道这些问题的答案了。
rpm包是如何得到的?
镜像文件里官方网站(mysql、docker等)第三方网站 Rpmfind mirror自己制作
rpm包是如何制作出来的的?
通过源码包制作出来的,具体制作方法的话大家可以去官网查询一下,难点是写配置文件
rpm包在安装时能否指定路径?
和Windows不一样,不能自己指定,Linux里的每个目录都有一定含义,rpm安装之后,会将这个软件内的文件分配到目录下,这里简单给一些目录的相关意义
典型应用程序的目录结构
文件类型
保存目录
普通可执行程序文件
/usr/bin
服务器执行程序文件和管理程序文件
/usr/sbin 应用程序配置文件
/etc
日志文件
/var/log 应用程序文档文件
/usr/share/doc 应用程序手册页文件
/usr/share/man 一些程序使用的动态函数库
/usr/lib