Linux 安装软件的几种方式

news2024/10/7 18:24:28

哈喽大家好,我是咸鱼

相信小伙伴们都知道在 Linux 中,安装软件一般有三种方式

  • yum 安装
  • rpm 安装
  • 源码编译安装

咸鱼平时三种安装方式都会用,但是具体原理和区别却没有去深入了解过

结果上周部门刚来的新人问我这几种安装方式的时候,一下子把我问懵了

那么今天咸鱼将会向小伙伴们介绍这三种软件安装方式的原理以及各自的优缺点

源码编译安装

首先我们来看源码编译安装,这是 Linux 中最传统的软件安装方式

我们知道在 Linux 中,安装好的软件通常是以可执行文件的形式提供的

这些可执行文件是经过编译的二进制程序,其本质上是由计算机可以直接执行的机器指令组成的

而二进制程序可以直接在 Linux 系统上运行,执行相应的功能

# 可以用 file 工具来查看
[root@minion2 ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=85e3da5a087950e7aaeb7893c056218a8874d2e5, stripped

“ELF 64-bit LSB executable” 时,表示该文件是一个 64 位的 ELF 可执行文件

“源码”就是源代码,源代码其实就是一般的纯文本文件,我们编写好“源码”之后,需要将这个文本文件“编译”成为操作系统看得懂的二进制程序,这个“编译”的过程就需要”编译器“来实现

比如说我们使用 Linux 的标准程序语言 C 来写一个源代码,然后用 C 语言编译器 gcc 来编译,就可以制作一个可执行二进制程序

有时候我们会在程序当中调用外部子程序,或是利用其他软件提供的函数,这个时候我们就需要在编译的过程中将对应的函数库加进去,这样编译器就可以将源代码与函数库作一个链接(link)

在这里插入图片描述
make 与 makefile

我们在用 gcc 这类编译器进行编译的时候,需要手动指定要编译的每个源代码文件以及相关的编译选项(如编译模式、优化级别等)

编译小型程序还好,如果碰到包含大量源代码的程序就会导致编译过程往往极为复杂(例如需要手动管理依赖关系和编译顺序)

那么我们可以使用 make 来进行编译,make 能够根据代码文件之间的依赖关系自动执行必要的编译和链接操作,简化编译过程

当执行 make 命令时,make 会在当前目录下查找 makefile 这个文件(makefile 里面记录了源代码该如何编译的详细信息)

通常软件开发商会写一个检测用户操作环境以及当前操作环境是否有软件开发商所需要的其他功能的程序,这个检测程序一般命名为 configconfigure

检测程序执行完毕之后就会主动建立出一个 makefile 文件

通常检测的内容如下:

  1. 是否有适合的编译器可以编译该软件的代码
  2. 是否已经存在该软件所需要的函数库或其他依赖条件
  3. 操作系统是否适合该软件
  4. 内核的头文件是否存在

makefile 是一种文本文件,它包含了一组规则和指令,用于告诉 make 工具如何编译和链接源代码文件,生成可执行程序或库文件等

#来看一个 makefile 简单例子
[root@root ~]# cat makefile
main: main.o haha.o sin_value.o cos_value.o
	gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
	rm -f main main.o haha.o sin_value.o cos_value.o

Tarball(压缩文件)

前面我们已经知道,源代码其实就是纯文本文件,我们想要安装一款软件,就需要去官网下载这些源码到本地

但是这样是很浪费带宽和消耗网络资源的(纯文本文件在网络上是很浪费带宽的一种文件格式)

所以如果能够把这些源码将其打包和压缩,不但能够让用户方便下载,还能减轻官网的网络带宽, Tarball 文件由此诞生

所谓的 Tarball 文件,就是将软件的所有源码先用 tar 打包,然后再压缩(最常见的就是 gzip 压缩技术),所以 Tarball 文件一般的扩展名会写成 *.tar.gz*.tgz
img

所以我们常见的安装方式过程如下:

  1. 从官网下载 Tarball 软件包,放在 /usr/local/src 目录下解压缩
  2. 解压缩之后进入到软件目录,查看 INSTALLREADME 等相关文件内容,然后安装好一些依赖的软件
  3. 建立 makefile,通过自动检测程序(configconfigure)生成 makefile 文件
  4. 使用 make 命令进行编译
  5. 最后 make install 安装

我们以安装 nginx 为例

1、首先从官网下载 Tarball 文件到相关目录

cd /usr/local/src && \
wget http://nginx.org/download/nginx-1.15.4.tar.gz

2、然后安装相关的依赖软件

yum -y install gcc openssl-devel pcre-devel zlib-devel

3、对 Tarball 文件解压缩,并进入文件目录

tar -zxvf nginx-1.15.4.tar.gz -C /usr/local
cd /usr/local/nginx-1.15.4

4、建立 makefile(指定了安装目录 /usr/local/nginx

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

5、编译以及安装

make && make install

总结一下

  • 源代码大多为纯文本文件,需要通过编译器的编译操作后,才能够生成操作系统看得懂的可执行二进制文件
  • 可以通过 make 和 makefile 来简化编译流程
  • makefile 包含了一组规则和指令,由自动检测程序(configconfigure)生成
  • 为了方便用户下载和检测软件官网的压力,一般通过 Tarball 的方式来管理软件

rpm 安装

前面我们讲到了源码编译安装,即通过下载软件发行商提供的 Tarball 文件来进行安装

将 Tarball 文件下载之后还要解压缩,还要 configure 检测,还要编译还要配置还要安装,可以看到过程是比较复杂的,需要敲的命令比较多,很容易劝退小白

不但如此,这种安装方式还会导致一些其他问题

  • 依赖性问题: 软件通常依赖于其他软件库和组件,手动解决依赖性问题可能会变得非常棘手,特别是当软件的依赖关系相对复杂时
  • 版本控制: 用户需要自行管理多个软件的不同版本,这可能导致版本冲突和不一致
  • 一致性问题: 用户需要花费大量时间来确保所有安装的软件都保持一致,并避免不同版本之间的冲突

为了能够更好地更加标准地管理 Linux 的软件,减轻用户的负担和学习成本,厂商们就在想:我们能不能先把软件所有的相关文件都打包成一个特殊格式的软件包(文件)

然后在这个软件包里面不但包含了检测依赖关系和系统环境的文件,还包含了关于这个软件的信息、二进制文件等等

这样当用户下载了这个软件包的时候,只需要简单的命令就能够安装,并且还会把当前软件的信息管理起来,方便用户后续的升级、卸载等操作

于是 Red Hat 在 1995 年引入了 RPM (RedHat Package Manager)

RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制

1、厂商们先把软件编译好,然后打包成 RPM 包(包含软件的依赖关系、版本信息以及其他元数据)

2、当你在安装 RPM 包的时候,系统会检查该软件包的依赖的其他软件包是否已经安装

3、然后检查本地没有已经安装好的软件或者冲突的版本(有的话会给提示)
在这里插入图片描述
4、如果上面两项检查都通过了,系统会将安装的软件包的信息添加到 RPM 数据库中,以便后续的管理和查询

5、安装完成后,系统会更新 RPM 数据库中的信息,标记软件包为已安装状态,并记录安装时间、版本等信息

我们来看一下常见的 rpm 命令有哪些

# 安装
rpm -i package

# 卸载
rpm -e package

# 卸载的时候不验证依赖
rpm -e --nodeps package

# 显示软件包的详细信息
rpm -qi package

# 列出已安装的软件包
rpm -qa

YUM 安装

前面我们介绍了 RPM 安装,尽管 RPM 可以处理软件的依赖关系,但仍有一定的局限性

比如依赖关系需要我们手动处理,RPM 不会帮我们自动下载安装所需要的依赖软件包,这就导致我们需要手动查找并下载软件包

为了解决这个问题,YUM(Yellowdog Updater, Modified)诞生了

YUM 基于 RPM 包去管理软件包,它通过一个名为 yum repository 的服务器存储库来管理软件包,其中包含了各种软件包及其依赖关系信息

这使得用户可以通过简单的命令完成软件包的安装、升级和卸载,同时自动处理依赖关系,无须繁琐地一次次下载、安装

虽然 YUM 最初是为 Red Hat Linux 开发的,但它的原理和功能非常通用,因此很多其他 Linux 发行版也采用了 YUM 作为其软件包管理工具

下面是一些 yum 常见命令

# 安装指定的软件包
yum install package

# 更新所有已安装的软件包到最新版本
yum update

# 更新指定安装包
yum upgrade package

# 卸载指定的软件包
yum remove package

# 显示有关指定软件包的详细信息
yum info package

# 列出所有已安装的软件包 
yum list

# 列出所有可用的软件包(在仓库中但尚未安装)
yum list available

# 清理 YUM 缓存,包括元数据和软件包
yum clean all

总结

最后我们总结一下

区别:

  • 源码编译安装需要手动下载源代码,解决依赖问题,配置编译选项,编译,安装,并且没有自动升级和卸载功能
  • RPM 软件包包含已经编译好的二进制程序、相关依赖关系信息以及软件信息等,减轻了软件安装复杂性,方便软件管理
  • YUM 软件包基于 RPM 包去管理软件包,进一步解决了软件依赖等问题,不同于 RPM 安装,YUM 安装能够自动解决软件包的依赖关系

各自优缺点:

  • 源码编译安装
    • 优点:灵活性高定制性强,可以根据需要自定义编译选项和功能;可以跨平台使用
    • 缺点:安装过程复杂;不能解决软件依赖问题;管理不方便,没有自动升级卸载机制
  • RPM 安装
    • 优点:管理方便,将软件以及相关信息打包成 RPM 形式,可以自动升级和卸载软件;可以轻松跟踪已安装的软件包、版本和更新信息;较好地解决软件依赖问题
    • 缺点:遇到软件依赖问题的时候,需要手动解决;不够灵活,不能够自定义功能
  • YUM 安装
    • 优点:自动解决软件包的依赖关系;管理方便,提供软件包的安装、升级、卸载和搜索等功能
    • 缺点:缺少定制化,不能自定义功能;更新滞后,某些发行版的官方仓库可能不及时提供最新版本的软件包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/848347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

连续四年入选!三项荣耀!博云科技强势上榜Gartner ICT技术成熟度曲线

日,全球知名咨询公司Gartner发布了2023年度的《中国ICT技术成熟度曲线》(《Hype Cycle for ICT in China, 2023》,以下简称“报告”)。令人瞩目的是,博云科技在报告中荣获三项殊荣,入选云原生计算&#xff…

【linux-keepalive】keepalive避免单点故障,高可用配置

keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…

HTTP Status 404 – 未找到

这HTTP Status 404 – 未找到 我的问题就是啥呢 这里已经提示了原因有两个: ①:找不到 ②:资源被占用 我的问题就是找不到,找不到的问题也就说可能是文件路径不对,也可能是文件名不对,仔细检查两遍 apac…

Visual Studio实用调试技巧---让你成为高端的程序员

​ 🍁 博客主页:江池俊的博客 💡代码仓库:江池俊的代码仓库 🎪 社区:GeekHub 🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞 文章目录…

链式二叉树统计结点个数的方法和bug

方法一: 分治:分而治之 int BTreeSize1(BTNode* root) {if (root NULL) return 0;else return BTreeSize(root->left)BTreeSize(root->right)1; } 方法二: 遍历计数:设置一个计数器,对二叉树正常访问&#…

Spring 是如何解决循环依赖问题的?

项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道,如果在代码中,将两个…

高忆管理:券商板块探底回升,大市值券商企稳,中信建投涨超5%

近日活泼的券商板块8日盘中大幅回落,哈投股份一度跌停,后探底上升。大市值券商企稳,截至发稿,中金公司触及涨停,中信建投涨超5%。 首创证券一度大跌近9%,此前接连三日涨停,公司昨日晚间公告称&a…

【Vue】全家桶之vue-devtools

文章目录 概述安装使用componentsVuexEventsRoutingPerformanceSettings 来源 概述 Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌在开发者工具中,使用体验流畅。Vue Devtools 由 Vue.js…

9-数据结构-栈(C语言版)

数据结构-栈(C语言版) 目录 数据结构-栈(C语言版) 1.栈的基础知识 1.入栈,出栈的排列组合 情景二:Catalan函数(计算不同出栈的总数) 2.栈的基本操作 1.顺序存储 (1)顺序栈-定义…

在QT及VS运行包含opencv的cmakelists实例

本文分享如何利用QT和Visual Studio运行cmake组织管理的程序&#xff0c;也就是运行cmakelists.txt。 main和cmakelists内容 main和cmakelists文件路径如下&#xff1a; main.cpp #include<opencv2/opencv.hpp> #include<iostream> #include <string> usi…

ElementPlus 自定义主题(Vite4 + Vue3)

配置 ElementPlus 主题的时候遇到 SCSS 循环导入的报错&#xff0c;排查后发现是以为在 main.ts 和 vite.config.ts 中引入了两次自定义主题的样式文件&#xff0c;解决方法很简单&#xff0c;去掉 main.ts 中导入自定义主题的文件即可。这个问题发生在按需导入的时候&#xff…

vue实现大转盘抽奖

本案例为在小程序中实现的转盘抽奖&#xff0c;其他手机端项目思路类似。 注意&#xff1a; 转盘上的东西是由后台web项目里的配置页进行配置的&#xff0c;可以配置每个位置的奖品&#xff0c;中奖概率等。此文章只讲了抽奖转盘的实现&#xff0c;配置可根据真实需求进行开发…

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…

网络编程的使用

文章目录 基础代码URL类进行传输编码解码 协议TCPUDPhttp PORT端口协议的实现TCPUDP 模拟服务器 基础代码 最后一个是&#xff1a;只要再timeout时间内连接上就是true URL类 导了一个common-iojar包&#xff0c;那个IOUtils就是那个里面的工具类 进行传输编码解码 协议 TC…

VSCode Remote-SSH (Windows)

1. VSCode 安装 VSCode 2. 安装扩展 Remote SSH Getting started Follow the step-by-step tutorial or if you have a simple SSH host setup, connect to it as follows: Press F1 and run the Remote-SSH: Open SSH Host… command.Enter your user and host/IP in the …

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

在SAP中使用苹果手机进行条码扫描

适用于iOS的Liquid UI支持使用内置摄像头或第三方设备&#xff08;如Linea Pro&#xff09;进行条形码扫描。它使您能够通过单击在任何 SAP 输入字段中填充数据。它支持&#xff1a;一维和二维条码扫描。此外&#xff0c;编辑扫描的数据或在扫描后对操作进行编程&#xff0c;以…

JWT的初步说明

JWT 概念 JWT 主要用于用户登录鉴权&#xff0c;JWT (全称&#xff1a;Json Web Token)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名…

【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的方法&#xff0c;它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制&#xff0c;神经网络能够自动地学习并选择性地关注输入中的重要信息&#xff…

巡课技巧,工作再忙也要学会!提高效率杠杠的

在当今不断演变的教育环境中&#xff0c;教学质量的提升和教师专业发展变得尤为重要。为了更好地监督和评估教师的教学表现&#xff0c;以及促进学生在课堂中的积极参与&#xff0c;在线巡课系统应运而生。 通过实时观察、远程巡课、数据分析等功能&#xff0c;该系统不仅为教育…