Linux软件包管理的相关概念与介绍
Linux软件包管理的相关概念与介绍

Linux软件包管理的相关概念与介绍

相关概念

什么是软件包管理器?

Linux的各个发行版本之间其中一个重要的区别就是在于软件包管理器的不同。

关于软件包管理器是什么这个问题,简单的解释就是,软件包管理器能够让用户在开源系统中对软件进行安装,删除,更新,配置以及管理等操作的工具。软件包管理器可以是图形应用像是软件中心,也可以是命令行工具像是apt-get或者yum等。

linux中很多软件都是以源代码方式进行发布的,但是源代码对普通用户来讲编译成一个可执行的文件过程是非常繁琐的。所以有些软件商帮我们把互联上的开源软件编译成了二进制并且把它打包成一个文件然后我们可以直接用包管理器将软件商打包好的文件直接进行安装。

包管理器是方便软件安装、卸载,解决软件依赖关系的重要工具,在不同发行版本的Linux系统中,有着不同的软件包管理器:

(1)CentOS、Redhat、Fedora使用yum包管理器,软件安装包格式为rpm

(2)Debian、Ubuntu使用apt包管理器,软件安装包格式为deb

什么是软件包?

软件包通常指的就是应用程序,但是也可以是图形界面程序,命令行工具或者软件库(被其他的软件所依赖的),一个软件包本质上包含了二进制执行文件,配置文件有时候会有依赖信息的封装文件。

在早年间,软件的安装通常是通过源码完成的,您可能需要参考一个文件(通常被命名为readme)然后瞅瞅需要什么软件组件以及二进制文件的位置。一般来说包含配置脚本文件以及生成文件,您需要自己编译软件有时候还需要自己解决依赖问题(有些软件的安装是需要其他软件配合)。

为了解决这个麻烦事,linux的发行版本创造了独特的软件安装形式,为想要安装有元数据(版本号,描述)以及依赖的软件的用户,提供了可直接使用的二进制文件(提前编译好的)

一个形象的比喻就是,你想吃蛋糕,你可以自己买原材料做一个,但也可以直接买现成的。

Source Code Compilation Vs Packaging in Linux

大概在九十年代中期,debian创造了.deb(DEB)为后缀的软件安装包,red hat创造了.rpm(RPM)后缀的软件安装包。编译源码的安装方法仍然存在,但是已经变成了一个选项,而且不是必选项。

软件包管理器如何工作

事先声明,软件包管理是一个通用的概念,并不是linux独有的,对于不同的软件和编程语言你都可以找到软件包管理器,就比如pip就是python的软件包管理,甚至是Atom文本编辑器都有自己的软件包管理器。

Linux Package Manager Explanation

几乎所有的linux的发行版本都有软件库,这个库基本上就是软件的集合。

软件库里面还有一些元数据文件,这些文件一般包括软件包的一些信息(软件包的名字,版本号,描述性文件以及库的名字等等)

软件包管理器首先会与元数据进行交互,之后会在系统里生成一个元数据的本地缓存,当你运行软件包管理器的更新指令的时候(就比如apt update命令),它就会通过软件库中的元数据来更新本地的元数据缓存。

当运行安装命令时(就比如apt install),管理器就会自动指向之前的本地元数据缓存,如果它能够在缓存中找到安装包的信息,它就会使用网络连接去链接到合适的软件库,并会在系统上安装这个软件之前首先下载这个软件包。

如果一个软件包需要其他依赖才能安装,软件包管理器会自动处理这些依赖,与你要安装的软件一同安装。

Package Manager Handling Dependencies In Linux

相似地,当你要使用软件包管理器删除软件时,它会自动删除,或者告诉你系统里哪些是可以删除的未被使用的包。

除了安装,删除软件的基本功能以外,管理器还可以根据你的需求配置和管理软件包。例如,你可以设置软件包版本不被系统自动更新升级等等,软件包管理器还可以干很多的事情。

rpm包与rpm命令

RPM 是 RedHat Package Manage 的简写,是一种由红帽公司开发的软件包管理方式,在 Linux 中通过以 .rmp 为扩展名的文件对应用程序包进行管理。RPM 文件带有 .rpm 扩展名,RPM 程序包由一个存档文件组成,该文件包含特定程序包的库和依赖项。使用 RPM 我们可以方便的进行软件的安装、查询、卸载、升级、校验等工作。

RPM 早期被称为 Red Hat Package Manager,但由于 RPM 非常流行,大部分的 Linux 发行版本都使用了 RPM 管理软件包,所以它实际上已经成为 Linux 工业标准。所以 RPM 现在又被称为 RPM is Package Manager。RPM 现在是 Linux Standard Base (LSB) 中采用的包管理系统。

RPM最大的特点就是需要安装的软件已经编译过,并已经打包成RPM机制的安装包,通过里头默认的数据库记录这个软件安装时需要的依赖软件。当安装在你的Linux主机时,RPM会先依照软件里头的数据查询Linux主机的相关依赖软件是否满足,若满足则予以安装,若不满足则不予安装。

所以想要解决 RPM 软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个 RPM 包组成时,有时候装一个软件要安装很多其他的软件包,忒麻烦!

RPM 软件包管理方式一般是 Red Hat 派系的发行版本使用,另外 openSUSE、SUSE企业版、PCLinuxOS、Mandriva Linux、Mageia 也是要 RPM 作为软件包管理系统。

为了解决rpm包安装时的依赖等相关问题,就有了rpm的前端工具:

yum:作为 RHEL 及 CentOS 的软件包前端工具
dnf:作为 Fedora 的软件包前端工具
zypper:作为 SUSE 发行版的软件包前端管理工具
urpmi:作为 Mandriva Linux 及相关派生版的软件包前端管理工具

我们将在后面介绍yum相关的使用方法。

rpm包的名称

  • 所有rpm包都是以.rpm后缀结尾的;
  • 软件版本需要标记,因为在安装这个软件包的时候呢,软件包之间会有一个互相的依赖关系的问题的,软件版本主要是用来解决依赖关系的;
  • 系统版本:这里的el7表示软件发行商,el7表示此包是由 Red Hat 公司发布,适合在 RHEL 7.x (Red Hat Enterprise Linux) 和 CentOS 7.x 上使用。但是如果系统版本是el6的话,是可以强制安装到centos7的系统上,但是其软件的稳定性或者版本的兼容性可能会有问题。所以当我们去选择rpm包的时候,我们第一个要看它的软件版本,是否符合我们的要求。另外我们还需要查看的系统版本是否与我们系统的发行版本对应;
  • 平台:目前服务器大部分都是x86_64的平台

rpm常用命令

rpm命令常用参数:

(1)-q 查询软件包 查询当前系统中安装了哪些软件包;

rpm -qa  # 查看系统安装的所有软件包

显示当前系统所有已经安装的软件包,条目太多如果想要分屏显示,可以在上面命令的基础上添加一个管道符|more参数

rpm -qa | more  # 分屏查看系统所有已经安装的软件包

空格键换浏览下一页;按回车键浏览下一行,按q退出;

我们如果想查看某一个单独的软件包是否安装,可以使用命令:rmp -q <软件包名称>

rpm -q vim-common  # 查询是否安装vim-common

(2)-i 安装软件包 安装指定软件包,使用命令rpm -i <软件包名称>

rpm -i vim-enhanced-7.4.629-6.el7.armv7hl.rpm

使用rpm命令安装软件包时,经常会遇到以下错误:

失败原因:依赖错误,它有一个依赖关系需要我们手动去解决,安装vim-enhanced时需要先安装vim-common,再去安装vim-enhanced,这样呢我们才不会被依赖关系所困扰。

如果依赖关系非常多,手动解决太麻烦,我们可以使用解决依赖关系有效的工具:yum仓库,它可以自动帮我们解决依赖关系;yum仓库将在下个部分介绍。

另外在安装软件包的时候,如果软件包的版本不符合我们的要求,我们还可以通过源代码来编译安装软件包。关于如何用源代码编译安装软件包,将在后面的部分介绍。

(3)-e 卸载软件包 卸载指定软件包,使用命令rpm -e <软件包名称>

rpm -e vim-common

如果想卸载多个软件包的话,多个软件包之间用空格隔开即可。在查询和卸载软件包时,我们只需要写上软件包的名称即可,但是安装软件包的时,需要写上完整的软件包名称。

yum和dnf

CentOS 使用 yum, dnf 解决rpm的包依赖关系 YUM: Yellowdog Update Modifier,yum是rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
rpm 安装rpm软件包的时候是无法解决包的依赖性问题的,在安装的时候能告知缺少什么软件包,但是它无法知道依赖包文件的位置路径,导致依赖包无法解决
yum仓库,是一个集中的大数据库,存放两块重要的内容
1、 存放所有的rpm软件包(安装包或依赖包)
2、 仓库包的元数据(包的描述信息-版本-制作者、存放包和包之间的依赖性等一些信息)

yum/dnf 工作原理

yum/dnf 是基于C/S 模式
yum 服务器存放rpm包和相关包的元数据库
yum 客户端访问yum服务器进行安装或查询等

yum 实现过程 :
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。

yum服务器的仓库可以多种形式存在:
file:// 本地路径
http:// 网络
https:// 网络
ftp:// 网络
注意:yum仓库指向的路径一定必须是repodata目录所在目录(repodata其实存放仓库软件包的元数据的地方\记录了包之间的依赖性以及包的描述信息)

yum命令常用选项

(1) install 安装软件包

使用yum进行安装不用考虑软件包的依赖关系,系统会自动帮你找到你需要的依赖包,一并安装,通过yum install <软件包名>就可以安装指定的软件包;比如当我们想安装软件包:vim-enhanced就可以使用命令:


yum install vim-enhanced

这些软件包的安装都是一个一个的安装,但是我们使用Linux系统时通常需要一次性安装多个软件。比如我们Linux系统要做服务器的话,通常要安装httpdmysqlphp之类的;如果我们要做c语言开发的话,通常就需要安装cmakegcc之类的,但是一个一个的安装可能会由于版本问题或者依赖问题导致安装失败,这时候yum提供了一种很人性化的安装方式yum groupinstall <整组软件包>,可以帮我们一次性安装好一整套软件包,我们使用命令:


yum grouplist

可以查看系统中有哪些可以使用的软件包套件:

可以看到软件套装有:最小安装、计算节点、基础设施服务、基础网络服务、虚拟化主机、桌面系统、网络控制台工具、图形管理工具、系统管理工具等等,都是可以整套安装的,比如我们想安装基础网络服务套装就可以直接使用命令:

yum groupinstall "Basic Web Server"

就可以安装一整套基础网页服务器所需要的软件包,然后输入y再回车就可以了,注意不要忘了加双引号哦!

(2)remove 卸载软件包

如果想把已经安装的软件包vim-enhanced卸载,可以通过yum remove <软件包名>来卸载指定的软件包。

(3) list 查看软件包

如何查看系统中已经安装过哪些安装包?我们可以使用命令:

yum list

来查看当前系统中已经安装的软件包;

(4) update 升级软件包

系统中的软件怎么更新升级呢,可以使用命令:

yum update

来更新升级软件包,系统会根据yum仓库里的最新版本,提示哪些软件包需要重新安装哪些需要升级,根据命令按y再回车就可以升级到yum仓库中最新版本了。

源代码编译安装软件包

使用yum或者rpm安装很高效与便捷,这也是yum、rpm包管理工具被用户广泛使用的原因。但是很多时候最新版本的软件还没有被yum仓库收录,我们想使用最新版本的软件可以通过源代码编译安装我们以安装opentesty为例,使用源码编译的方式进行安装:

第一步:下载应用程序源代码

wget https://openresty.org/download/openresty-1.15.8.1.tar.gz

第二步:解压缩gzip文件


tar zxf openresty-1.15.8.1.tar.gz

第三步:进入源码目录

cd openresty-1.15.8.1

第四步:配置源码环境

由于当前的系统环境以及预先设置在源码中了,但是没有真正的和我们系统环境进行匹配,所以我们使用./config去自动配置一下我们内核的版本、编译器匹配,再使用--prefix参数来指定应用程序安装位置,如果不指定安装位置的话,删除软件的时候就会很不方便;

./configure --prefix=/usr/local/openresty

第五步:编译源码

将源代码编译为可执行程序,使用-j2参数,意味着我们使用两个逻辑内核来编译源码,再一定程度上加快编译速度

make -j2

实际上我们上一步配置完成后,系统提示我们使用gmake来进行编译,gmake与make都可以达到同样的编译操作目的

我们可以参照它的需求来使用命令,同样可以加上j2参数:

gmake -j2

第六步:安装

执行完编译操作后,我们查看一下源代码目录

我们编译好的应用文件、配置文件、依赖的模块就会出现在build目录中,这时候我们将编译好的程序安装到指定目录(指定目录我们在配置那一步已经申明好了)

make install

安装完成后,openresty就会安装到/usr/local/openresty目录下:

以上,我们就完成了如何通过源代码编译来进行安装我们的软件。

参考文章

1.linux的软件包管理器是什么?如何工作? – 知乎 (zhihu.com)
2.What is a Package Manager in Linux? (itsfoss.com)
3.Linux学习笔记(九)软件包管理 (qq.com)
4.Linux软件包管理(rpm、yum、dnf) – 知乎 (zhihu.com)
5.Linux 常用的软件包管理器/软件包管理工具详解_liaowenxiong的博客-CSDN博客_linux包管理器

0 0 投票数
打个分吧!
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x