哈喽大家好,我是咸鱼
相信小伙伴们都知道在 Linux 中,安装软件一般有三种方式
咸鱼平时三种安装方式都会用,但是具体原理和区别却没有去深入了解过
结果上周部门刚来的新人问我这几种安装方式的时候,一下子把我问懵了
那么今天咸鱼将会向小伙伴们介绍这三种软件安装方式的原理以及各自的优缺点
首先我们来看源码编译安装,这是 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
所以我们常见的安装方式过程如下:
/usr/local/src
目录下解压缩INSTALL
和 README
等相关文件内容,然后安装好一些依赖的软件config
或 configure
)生成 makefile 文件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
总结一下
config
或 configure
)生成前面我们讲到了源码编译安装,即通过下载软件发行商提供的 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
前面我们介绍了 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 安装