Linux包管理(RPM,YUM)

发布于 2021-08-09  2.11k 次阅读


一, Linux软件包和包管理器的分类

一,包管理器的分类

在linux中包管理器理论上是同用的,但不同的发行版本有开发单独的包管理器,常见的包管理器有RPM和APT

按照包管理器分发行版本主要分为两大类:

  1. RedHat系列:主要支持RPM包管理器
  2. Debian系列:主要支持APT包管理器

RedHat系列包括CentOS,Mandrive等

Debian系列包括Ubuntu,SUSE等

Mandrive收费的发行版本,现在大多数使用ContOS和Ubuntu两发行版本(CoentOS是开源免费)

注:这里的包管理器是二进制包管理器,源码包是没有包管理器的

版本名称
网 址
特 点
软件包管理器
Debian Linux
开放的开发模式,且易于进行软件包升级
apt
Fedora Core
拥有数量庞人的用户,优秀的社区技术支持. 并且有许多创新
up2date(rpm),yum (rpm)
CentOS
CentOS 是一种对 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,由于 Linux 是开发源代码的操作系统,并不排斥样基于源代码的再分发,CentOS 就是将商业的 Linux 操作系统 RHEL 进行源代码再编译后分发,并在 RHEL 的基础上修正了不少已知的漏洞
rpm
SUSE Linux
专业的操作系统,易用的 YaST 软件包管理系统
YaST(rpm),第三方 apt (rpm)软件库(repository)
Mandriva
操作界面友好,使用图形配置工具,有庞大的社区进行技术支持,支持 NTFS 分区的大小变更
rpm
KNOPPIX
可以直接在 CD 上运行,具有优秀的硬件检测和适配能力,可作为系统的急救盘使用
apt
Gentoo Linux
高度的可定制性,使用手册完整
portage
Ubuntu
优秀已用的桌面环境,基于 Debian 构建
apt

二,软件包的分类

在Linux中可以直接安装的软件包主要分两类:

                                                                        1,源码包

                                                                                 1)脚本安装包

                                                                        2,二进制包(RPM包或APT包,系统默认包)

一,源码包

源码包:就是源文件包,通常一个软件或者框架都会提供,一般以tar.gz压缩包的方式提供下下载,它需要手动安装安装过程比较繁琐

源码包的优点:

  • 开源,可以查看源码
  • 可以自由配置和选择所需的功能
  • C语言软件编译安装,所有更加适合自己的系统,有较高的稳定性
  • 解压后是一个完整的文件(没有被分散目录),方便查看目录结构,整理和卸载也更加方便

注:和window不一样Linux一切皆文件,一个软件文件提供一个软件服务,在源码安装的情况下rm删除那个文件就能卸载那个软件,不会有残留,但RPM安装就不行,RPM安装的软件文件被分散在各个默认目录中没有办法进行一次性删除,只能使用RPM卸载功能

源码包的缺点:

  • 安装步骤较繁琐,尤其安装大型软件集合时,容易出现拼写错误的情况
  • 编译过程时间较长,比二近制安装时间长(Mysql源码安装就需要20分钟)
  • 因为编译安装,安装过程中一旦报错,对刚接触学习的新手不用友好

源码包语言分类:

  1. C语言源码包:由C语言或者C++编写的软件或者框架,这类软件安装一般需要安装GCC进行make手动编译才能使用(比如Nginx,Redis等)
  2. Java语言源码包:由java语言编写的框架和软件,这类软件一般不需要进行手动编译只需要安装JDK环境即可(比如:Hadoop,Hive,Zookeeper等)

注:Linux中可以使用压缩方式有多种,比如zip,rar,tar,gz,z,tar.gz……,tar只是打包工具提供压缩,当tar.gz提供压缩,tar.gz是最常用的,tar.gz压缩率比较高,很多软件默认提供tar.gz压缩包供linux安装

脚本安装包:对源码包进行了二次开发,它提供安装界面,只需要执行安装程序,省去了手动配置(就相当于windows安装软件一样),一般只有极少数的软件会提供这个安装包

二,二进制包(.RPM包,.APT包)

二进制包是Linux发展的产物,早期都是源码安装较多,选择单一,安装较繁琐,花费时间长,没有统一的自动管理工具,这时产生了二进制包,它可以被RPM或APT进行统一管理

注:二进制包RPM和APT安装和源码安装本质上没有优劣之分(各有优缺点),只是根据不同情况的选择问题

二进制包:源码经过编译后的包,这类包看不到源代码

二进制包的优点:

  • 这类包提供包管理系统(RPM),只通过几个命令就可以实现包的安装,升级,查询,卸载等操作
  • 安装速度比源码包快很多,安装时间少

二进制包的缺点:

  • 经过编译,不可以看见源代码
  • 功能选择,功能配置较固定修改麻烦,不如源码包灵活
  • 二进制包有依赖性问题(安装软件包A时提示依赖软件包B,B依赖C……)

源码包和二进制包的区别(类举):                       你的Leader叫你做一个Java WEB的分布式微服务网站,你自己做起来相当麻烦且费时间,然后你把这个网站交于第三外包,它有团队也有丰富这方面的开发经验,以前的代码也能复用,写起来相当简单,写完后它帮你部署和维护,你只需要访问,你要加功能只需要联系他们即可,你看不到源代码,但你花费时间少(源码包就是自己写,二进制包就是找外包)                           

三,源码包或者二进制包的安装区别

位置的区别:
  • RPM包主要安装在系统默认的位置,文件是被分散的
  • 原码包安装位置可以指定,且文件没有分散

1,RPM包的安装位置

安装在默认位置中,这些位置是RPM开发者约定俗成的

/etc
配置文件安装目录
/usr/bin
可执行命令安装目录
/usr/lib
程序所使用的函数库保存位置
/usr/share/doc
基本的软件使用手册保存位置
/usr/share/man
帮助文件保存位置
/var/log
软件日志文件
……
……
2,源码包安装位置

安装位置自定义,一般企业中都保存在/usr/local/软件名中

3,安装位置不同带的影响

RPM二进制包安装的服务可以使用系统服务管理命令(service)来管理

rpm启动有两种方式:

  • service命令进行启动
  • 绝对路径的方式,进入软件的启动目录进行启动

注:service是一个RPM软件启动的一个自动化过程,它其实本质是进入RPM可执行目录寻找软件的启动文件进行启动,service实现了自动化

例如:启动httpd软件和重启网络

service httpd start

service network restart

  源码包安装的服务不能被服务管理命令进行管理,因为没有安装在RPM默认位置中,所有只能通过绝对路经的方式进行服务管理(也可以配置环境变量这样就不受路径限制)

二,RPM包管理器

rpm全称是RedHat Package Manager(RedHat软件包管理工具)

rpm用于互联网下载包的打包及安装工具,它包含在某些Linux的分发版本中,它生成具有.RPM拓展名的文件

rpm在Linux的分发版本如redhat,centos,suse都有使用,可以算是公认的行业标准

一,RPM包命名规则和依赖性

一,RPM的存放位置

RPM包主要存放在两个位置:

  1. 本地光盘
  2. 网络yum源服务器

本地光盘和远程YUM服务器都存有所有的RPM包

查看光盘中的RPM包:

  1. 挂载光盘(不细谈)
  2. 进行光盘的Package目录

二,RPM包的命名规则

以tar-1.26-35.el7.x86_64.rpm包为

  • tar :软件包名
  • 1.26: 软件版本
  • 35: 软件发布的次数
  • el7: 适应于Linux平台
  • X86_64:表示适应于64位的系统
  • rpm: 后缀名

注:如果有i686,i386表示适用于32位系统,noarch表示64和32都适用

RPM的包名和包全名的应用:

  • 在没有安装某个RPM包时使用包全名(如 rpm -ivh 包全名)
  • 安装了某个RPM包,后续都是使用包名(如 rpm -qi 包名)

三,RPM包的依赖性

其实在具体安装过程中,问题最大的就是依赖性问题,像看不到源码,文件分散都是小问题(后面yum的出现解决了这一问题)

依赖性就是一个软件包安装时需要依赖另一个软件包或者库文件

RPM依赖性的两个依赖因素:

  • 包依赖:就是具体的另一个软件
  • 库依赖:是另有一个软件中的某一个文件(这类依赖要去这具体的文件对于的软件包)

依赖性主要分三类:

     1)树形依赖(如:A->B->C->D): 要想安装软件 A,必须先安装 B,而安装 B 需要先安装 C…….解决此类型依赖的方法是从后往前安装,即先安装 D,再安装 C,然后安装 B,最后安装软件 A

     2)环形依赖(如:A->B->C->D->A): 各个软件安装的依赖关系构成“环状”,解决此类型依赖的方法是用一条命令同时安装所有软件包,即使用rpm -ivh 软件包A 软件包B ...

     3)模块依赖: 软件包的安装需要借助其他软件包的某些文件(比如库文件),解决模块依赖最直接的方式是通过 http://www.rpmfind.net 网站找到包含此文件的软件包,安装即可

模块依赖案例:安装mysql-connector-odbc-5.2.5-8.el7.x86_64.rpm包

1,下载

2,寻找文件所属的软件包(文件名:libodbcinst.so.2,搜索网站: http://www.rpmfind.net)

3,下载依赖包后,然后下载mysql-odbc

二,RPM包管理的命令

一,基础命令

一,RPM的安装,升级,卸载

1,安装:rpm -ivh 包全名

参数:

  • -i(install):安装
  • -v(verbose):显示安装的详细信息
  • -h(hash):显示进度条
  • --nodeps:不检查依赖性

注:一般安装不用nodeps参数,因为底层的软件包不安装,上层的软件包安装了也运行不了

2,升级:rpm -Uvh 包全名

参数:

  • -U(upadata):升级

注:升级时必须要光盘有最新的RPM包,才能更新

3,卸载:rpm -e 包名

参数:

  • e(erase):卸载:默认卸载有依赖性,底层的依赖包卸载会报错,需要由上至下卸载
  • --nodeps:不检查依赖性

注:卸载也不推荐使用nodeps,假如底层的软件包卸载成功,上层的软件也会使用不了

二,RPM的查询

rpm 选项 包名

参数:

  • -q:查询
  • -a(all):所有
  • -i(information):软件详细信息
  • -p(package):未安装包详细(未安装的需要进入光盘package目录)
  • -l(list):软件包安装形成的文件和目录位置
  • -f(file):系统文件目录属于那个软件包
  • -R(requires):查询软件包的依赖性

注:q是前提参数,没有查询后面参数都是没有的

1,rpm -q:查询包是否已经安装(成功输出包全名)

2,rpm -qa:查询所有已经安装的RPM包(可以加一些过滤推荐如:grep,tail,wc……)

3,rpm -qi:查询软件包的详细信息

4,rpm -ql:查询软件包安装形成的文件和目录

注:RPM包的安装位置在是事先被系统绝对好了的

5,rpm -qf:查询系统文件属于那个软件包

6,rpm -qR:查询软件包的依赖性

二,RPM包的校验和文件提取

一,RPM包效验

RPM包效验就是检查包中文件是否被修改过,可以检查其他用户修改

命令:rpm -V 已安装的包名

参数:

  • -V:效验指定RPM包中的文件

假如没有被修改返回空,被修改了返回8个字节的验证信息和修改文件的位置

8个字节的验证信息(为.表明没有被修改):

  • S:文件大小是否改变
  • M:文件的类型或文件权限(rwx)是否被修改
  • 5:文件MD5效验和是否被改变(文件内容是否改变)
  • D:设备的代码是否改变
  • L:文件路径是否改变
  • U:文件所有者是否改变
  • G:文件的所属组是否改变
  • T:文件的修改时间是否改变

例:效验httpd包

1,修改httpd包中的httpd/conf/httpd.conf文件

2,包效验

文件效验信息有S,5,T:说明文件大小,文件内容,文件修改时间被改变

二,RPM包文件提取

RPM包安装是安装全部文件,RPM提取是提取RPM包中指定某个文件

文件提取的主要作用:解决误操作问题,假如你误删了系统的/etc目录,这时就可以先找到/etc文件属于的软件包(rpm -qf),然后再从软件包中把etc文件提取出来进行复源

命令:rpm2cpio 包全名 |  cpio-idv .提取的文件目录

两个子命令:

            1,rpm2cpio:将rpm包转化为cpio格式的命令

            2,cpio:一个标准的工具,它用于创建软件档案文件和从档案中提取文件

  • -i:copy-in模式,还原
  • -d:还原时自动新建目录
  • -v:显示还原进程

三,YUM插件

YUM(yellowdog updater modified)是一个RPM系统的自动更新和软件包安装/卸载器。它可以自动计算依赖和找出想要安装的软件包。这使得它更容易而不必手动更新每一个使用RPM维护机器的”软件组“。YUM有一个添加简单功能的插件接口  

  普通的RPM包管理是通过手动进行安装管理的,需要自己解决依赖性问题,yum是一种在线较为自动化的包管理工具,相当于一个基于RPM包管理的一个插件,本质上它属于RPM包管理器(都是对RPM包进行管理)

yum出现的一个重要原因就是解决传统RPM安装的依赖性问题,它安装一个软件包,可以一次把软件包和依赖软件包都安装

yum有两种安装源:

  • 网络源:从网络yum源服务器上下载rpm包(默认源)
  • 本地源:把光盘作为源,从本地光盘中进行下载

注:并不是使用yum都要联网,网络源需要配置网络,本地源则不需要

一,YUM源的配置

一,网络yum源

首先需要配置网络(不细讲)

网络yum源是默认源,安装后就不需要配置,但我们看一下它的配置文件

1,默认yum的源是在/etc/yum.repos.d文件中

默认yum源以repo作为后缀名

  • CentOS-Base.repo:网络yum源(默认使用)
  • CentOS-Media.repo:本地光盘yum源
  • CentOS-Vault.repo:虚拟yum源
  • CentOS-Deduginfo.repo:修复yum源、

2,查看CentOS-Base.repo网络源的内容

  • [base]:容器的名称,一定要放在[]中
  • name:容器说明,可以自己随便写
  • mirrorlist:镜像站点,这个可以注释一般使用真实yum源服务器地址
  • baseurl:真实的yum源服务器地址,默认是CentOS官方的yum源服务器,是可以使用的,如果慢可以换成国内的yum源服务器地址
  • enabled:此容器是否生效,如果不写或者写成enable=1都是生效,写成enable=0就是不生效
  • gpgcheck:如果是1是指的数字证书生效,如果是0则不生效
  • gpgkey:数字证书公钥的保存位置,不用修改

二,光盘本地yum源

本地光盘yum源默认是不支持的,需要手动配置

步骤:

1,挂载光盘(不详讲):mout  /dev/cdrom /mnt/cdrom

2,让网络yum源和其他yum源失效(添加一个bak无法识别的后缀名)

[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@localhost yum.repos.d]# mv CentOS-Vault.repo CentOS-Vault.repo.bak
[root@localhost yum.repos.d]# mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak

3,修改光盘yum源文件

修改项:

  • 真实源服务器地址改为光盘挂载地址(file:///是本地文件协议)
  • 注释两不存在的地址
  • 把enabled=0改为enabled=1,让源生效

修改前:

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

修改后:

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom/
#        file:///media/cdrom/
#        file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

二,yum操作命令

yum使用的全部都是包名而不是部分使用包全名,因为是可以直接去服务器搜索

一,yum查询

yum查询是对源服务器上的可用的RPM软件包进行查询输出的,查询也是联网的

查询参数:

  • list:查询源服务器上所有可用软件包列表
  • search:搜索服务器上所有和搜索包有依赖性的包(类似于 rpm -R 包名)

二,yum安装

yum安装不需要考虑依赖性问题,一次性把安装和依赖包都安装

安装参数:

  • install:安装
  • -y:自动回答yes

三,yum升级和卸载

升级参数:

  • update:升级
  • -y:自动回答yes

注:升级命令不接包名如yum -y update 会把系统所有的rpm包都升级,会导致系统错误无法正常运行,因此更新时要加包名

卸载参数:

  • remove:卸载
  • -y:自动回答yes

注:卸载也解决了依赖性问题但不推荐,因为你卸载一个上层包它会把你依赖的所有下层包全部卸载,假如还有很多的上层包依赖这些下层包,就会出现大量的软件报错(推荐使用rpm原生的卸载命令)


路漫漫其修远兮,吾将上下而求索