简易指南:Linux系统下安装软件的多种方法
哈喽大家好,我是咸鱼
相信小伙伴们都知道在 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 里面记录了源代码该如何编译的详细信息)
通常软件开发商会写一个检测用户操作环境以及当前操作环境是否有软件开发商所需要的其他功能的程序,这个检测程序一般命名为 config
或 configure
检测程序执行完毕之后就会主动建立出一个 makefile 文件
通常检测的内容如下:
- 是否有适合的编译器可以编译该软件的代码
- 是否已经存在该软件所需要的函数库或其他依赖条件
- 操作系统是否适合该软件
- 内核的头文件是否存在
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
所以我们常见的安装方式过程如下:
- 从官网下载 Tarball 软件包,放在
/usr/local/src
目录下解压缩 - 解压缩之后进入到软件目录,查看
INSTALL
和README
等相关文件内容,然后安装好一些依赖的软件 - 建立 makefile,通过自动检测程序(
config
或configure
)生成 makefile 文件 - 使用 make 命令进行编译
- 最后
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 包含了一组规则和指令,由自动检测程序(
config
或configure
)生成 - 为了方便用户下载和检测软件官网的压力,一般通过 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 安装
- 优点:自动解决软件包的依赖关系;管理方便,提供软件包的安装、升级、卸载和搜索等功能
- 缺点:缺少定制化,不能自定义功能;更新滞后,某些发行版的官方仓库可能不及时提供最新版本的软件包
推荐阅读
-
紧急模式问题处理 - 图 1 紧急模式 根本原因分析 应急模式提供了尽可能小的环境,即使无法进入应急模式,也可以在其中修复系统。在应急模式下,系统只安装根文件系统供读取,不尝试安装任何其他本地文件系统,不激活网络接口,只启动一些基本服务。 进入应急模式的原因通常是 /etc/fstab 文件中存在错误,导致文件系统挂载失败。 文件系统中存在错误,导致。 约束和限制 本节适用于 Linux 操作系统紧急模式。程序涉及修复文件系统。修复文件系统有丢失数据的风险,因此请先备份数据,然后再执行修复操作。 处理方法 输入根密码,然后进入修复模式。 在应急模式下,根分区以只读模式挂载。要修改根目录中的文件,需要执行以下命令以读写模式重新挂载根分区。# mount -o rw,remount / 请执行以下命令首先检查 fstab 文件是否有误,然后尝试挂载所有未挂载的文件系统。# mount -a 如果挂载点不存在,请创建一个挂载点。 如果不存在此类设备,请注释或删除挂载行。 如果指定了不正确的挂载选项,请将挂载参数更改为正确的参数。 如果没有发生错误,但出现 UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY 消息(通常是由文件系统错误引起的),请跳至第 7 步。 执行以下命令打开 /etc/fstab 以修改相应的错误。# vi /etc/fstab /etc/fstab 文件包含以下字段,以空格分隔:[文件系统] [dir] [type] [options] [dump] [fsck] 表 1 /etc/fstab 参数 说明 参数 说明 [文件系统] 要挂载的分区或存储设备。 文件系统]列建议以 UUID 的形式写入。执行 blkid 命令可查询设备文件系统 UUID。 参考格式如下: # <device> <dir> <type> <options> <dump> <fsck>; UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2 使用 UUID 的好处是,它们与磁盘顺序无关。如果你在 BIOS 中更改了存储设备的顺序,或重新插入了存储设备,或者因为某些 BIOS 可能会随机更改存储设备的顺序,那么使用 UUID 会更有效率。 [文件系统] 文件系统]的挂载位置。 类型 挂载设备或分区的文件系统类型,支持多种不同的文件系统:ext2、ext3、ext4、reiserfs、xfs、jfs、smbfs、iso9660、vfat、ntfs、swap 和 auto。 设置为自动类型后,挂载命令会猜测所使用的文件系统类型,这对 CDROM 和 DVD 等移动设备非常有用。 选项 挂载时要使用的参数,有些参数是特定文件系统特有的。例如,默认值参数使用文件系统的默认挂载参数,ext4 的默认参数为:rw、suid、dev、exec、auto、nouser、async。 有关更多参数,请执行以下命令查看 man 手册:# man mount
-
windows下进程间通信的(13种方法)-摘 要 本文讨论了进程间通信与应用程序间通信的含义及相应的实现技术,并对这些技术的原理、特性等进行了深入的分析和比较。 ---- 关键词 信号 管道 消息队列 共享存储段 信号灯 远程过程调用 Socket套接字 MQSeries 1 引言 ---- 进程间通信的主要目的是实现同一计算机系统内部的相互协作的进程之间的数据共享与信息交换,由于这些进程处于同一软件和硬件环境下,利用操作系统提供的的编程接口,用户可以方便地在程序中实现这种通信;应用程序间通信的主要目的是实现不同计算机系统中的相互协作的应用程序之间的数据共享与信息交换,由于应用程序分别运行在不同计算机系统中,它们之间要通过网络之间的协议才能实现数据共享与信息交换。进程间通信和应用程序间通信及相应的实现技术有许多相同之处,也各有自己的特色。即使是同一类型的通信也有多种的实现方法,以适应不同情况的需要。 ---- 为了充分认识和掌握这两种通信及相应的实现技术,本文将就以下几个方面对这两种通信进行深入的讨论:问题的由来、解决问题的策略和方法、每种方法的工作原理和实现、每种实现方法的特点和适用的范围等。 2 进程间的通信及其实现技术 ---- 用户提交给计算机的任务最终都是通过一个个的进程来完成的。在一组并发进程中的任何两个进程之间,如果都不存在公共变量,则称该组进程为不相交的。在不相交的进程组中,每个进程都独立于其它进程,它的运行环境与顺序程序一样,而且它的运行环境也不为别的进程所改变。运行的结果是确定的,不会发生与时间相关的错误。 ---- 但是,在实际中,并发进程的各个进程之间并不是完全互相独立的,它们之间往往存在着相互制约的关系。进程之间的相互制约关系表现为两种方式: ---- (1) 间接相互制约:共享CPU ---- (2) 直接相互制约:竞争和协作 ---- 竞争——进程对共享资源的竞争。为保证进程互斥地访问共享资源,各进程必须互斥地进入各自的临界段。 ---- 协作——进程之间交换数据。为完成一个共同任务而同时运行的一组进程称为同组进程,它们之间必须交换数据,以达到协作完成任务的目的,交换数据可以通知对方可以做某事或者委托对方做某事。 ---- 共享CPU问题由操作系统的进程调度来实现,进程间的竞争和协作由进程间的通信来完成。进程间的通信一般由操作系统提供编程接口,由程序员在程序中实现。UNIX在这个方面可以说最具特色,它提供了一整套进程间的数据共享与信息交换的处理方法——进程通信机制(IPC)。因此,我们就以UNIX为例来分析进程间通信的各种实现技术。 ---- 在UNIX中,文件(File)、信号(Signal)、无名管道(Unnamed Pipes)、有名管道(FIFOs)是传统IPC功能;新的IPC功能包括消息队列(Message queues)、共享存储段(Shared memory segment)和信号灯(Semapores)。 ---- (1) 信号 ---- 信号机制是UNIX为进程中断处理而设置的。它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制。例如在发生浮点错、非法内存访问、执行无效指令、某些按键(如ctrl-c、del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理。 ---- 信号处理的系统调用是signal,调用形式是: ---- signal(signalno,action) ---- 其中,signalno是规定信号编号的值,action指明当特定的信号发生时所执行的动作。 ---- (2) 无名管道和有名管道 ---- 无名管道实际上是内存中的一个临时存储区,它由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出方式管理,并严格按顺序操作,例如不能对管道进行搜索,管道中的信息只能读一次。 ---- 无名管道只能用于两个相互协作的进程之间的通信,并且访问无名管道的进程必须有共同的祖先。 ---- 系统提供了许多标准管道库函数,如: pipe——打开一个可以读写的管道; close——关闭相应的管道; read——从管道中读取字符; write——向管道中写入字符; ---- 有名管道的操作和无名管道类似,不同的地方在于使用有名管道的进程不需要具有共同的祖先,其它进程,只要知道该管道的名字,就可以访问它。管道非常适合进程之间快速交换信息。 ---- (3) 消息队列(MQ) ---- 消息队列是内存中独立于生成它的进程的一段存储区,一旦创建消息队列,任何进程,只要具有正确的的访问权限,都可以访问消息队列,消息队列非常适合于在进程间交换短信息。 ---- 消息队列的每条消息由类型编号来分类,这样接收进程可以选择读取特定的消息类型——这一点与管道不同。消息队列在创建后将一直存在,直到使用msgctl系统调用或iqcrm -q命令删除它为止。 ---- 系统提供了许多有关创建、使用和管理消息队列的系统调用,如: ---- int msgget(key,flag)——创建一个具有flag权限的MQ及其相应的结构,并返回一个唯一的正整数msqid(MQ的标识符); ---- int msgsnd(msqid,msgp,msgsz,msgtyp,flag)——向队列中发送信息; ---- int msgrcv(msqid,cmd,buf)——从队列中接收信息; ---- int msgctl(msqid,cmd,buf)——对MQ的控制操作; ---- (4) 共享存储段(SM) ---- 共享存储段是主存的一部分,它由一个或多个独立的进程共享。各进程的数据段与共享存储段相关联,对每个进程来说,共享存储段有不同的虚拟地址。系统提供的有关SM的系统调用有: ---- int shmget(key,size,flag)——创建大小为size的SM段,其相应的数据结构名为key,并返回共享内存区的标识符shmid; ---- char shmat(shmid,address,flag)——将当前进程数据段的地址赋给shmget所返回的名为shmid的SM段; ---- int shmdr(address)——从进程地址空间删除SM段; ---- int shmctl (shmid,cmd,buf)——对SM的控制操作; ---- SM的大小只受主存限制,SM段的访问及进程间的信息交换可以通过同步读写来完成。同步通常由信号灯来实现。SM非常适合进程之间大量数据的共享。 ---- (5) 信号灯 ---- 在UNIX中,信号灯是一组进程共享的数据结构,当几个进程竞争同一资源时(文件、共享内存或消息队列等),它们的操作便由信号灯来同步,以防止互相干扰。 ---- 信号灯保证了某一时刻只有一个进程访问某一临界资源,所有请求该资源的其它进程都将被挂起,一旦该资源得到释放,系统才允许其它进程访问该资源。信号灯通常配对使用,以便实现资源的加锁和解锁。 ---- 进程间通信的实现技术的特点是:操作系统提供实现机制和编程接口,由用户在程序中实现,保证进程间可以进行快速的信息交换和大量数据的共享。但是,上述方式主要适合在同一台计算机系统内部的进程之间的通信。 3 应用程序间的通信及其实现技术 ---- 同进程之间的相互制约一样,不同的应用程序之间也存在竞争和协作的关系。UNIX操作系统也提供一些可用于应用程序之间实现数据共享与信息交换的编程接口,程序员可以通过自己编程来实现。如远程过程调用和基于TCP/IP协议的套接字(Socket)编程。但是,相对普通程序员来说,它们涉及的技术比较深,编程也比较复杂,实现起来困难较大。 ---- 于是,一种新的技术应运而生——通过将有关通信的细节完全掩盖在某个独立软件内部,即底层的通讯工作和相应的维护管理工作由该软件内部来实现,用户只需要将通信任务提交给该软件去完成,而不必理会它的具体工作过程——这就是所谓的中间件技术。 ---- 我们在这里分别讨论这三种常用的应用程序间通信的实现技术——远程过程调用、会话编程技术和MQSeries消息队列技术。其中远程过程调用和会话编程属于比较低级的方式,程序员参与的程度较深,而MQSeries消息队列则属于比较高级的方式,即中间件方式,程序员参与的程度较浅。 ---- 4.1 远程过程调用(RPC)
-
全面梳理在Linux环境下运行Windows应用的多种方法(最全指南)
-
简易指南:Linux系统下安装软件的多种方法
-
简易指南:在Debian系统中快速安装Nginx的三种方法
-
Linux——FTP服务器搭建及访问-重点一、安装vsftp服务器软件,并启动 vsftpd是Linux下的一款小巧轻快、安全易用的FTP服务器软件,是受各个Linux发行版推崇的FTP服务器软件。安装方式:法一、yum安装: yum install -y vsftpd 出现如下图形即代表安装成功法二、镜像文件下载 rpm安装 ====》使用挂载光盘的方式进行下载 更改Linux系统的挂载镜像文件(.iso文件) 使用mount命令进行挂载.iso文件(等同于挂载在光盘) ==》mount /dev/cdrom /mnt/cdrom 进入/mnt/cdrom 目录,进行访问即可 安装命令:rpm -ivh rpm安装包