文章目录
- Linux源码包的安装与升级
- 什么是源代码、编译器与可执行文件
- 什么是函数库
- 什么是make与configure
- 什么是Tarball的软件
- 如何安装与升级软件
Linux源码包的安装与升级
如果你想在自己的Linux服务器上运行网站,就需要安装一个Web服务器软件,否则无法提供Web服务。所以学会如何安装软件非常重要。
在Windows操作系统上安装软件很简单,只需要一直按下一步就可以。但是,因为Windows软件源代码是封闭的,所以无法修改它的功能或添加新功能
。这就意味着,如果你的电脑受到病毒或黑客攻击,你只能等待软件开发商提供的修补程序,而不能自己修补。
相比之下,如果你在Linux上安装软件,你可以修改和自定义软件功能,甚至可以修补软件漏洞,因为Linux的软件源代码是开放的
。这样可以增加你的电脑安全性,减少受到攻击的风险。
==Linux的优点在于它的软件几乎都是开放源代码的,这意味着每个软件都提供源代码,你可以自己修改它,以适合自己的需求。==开放源代码的好处在于你可以自由定制软件,增加或减少功能,甚至修补漏洞。但是,你需要理解什么是开放源代码,源代码是什么,以及在Linux上安装软件时,安装文件和源代码之间的关系。不同版本的Linux是否可以使用相同的执行文件,还是需要重新转换源代码,这些都是需要了解的概念。下面就以源代码与可执行文件来进行说明
什么是源代码、编译器与可执行文件
在Linux系统中,可执行文件是指二进制程序,比如 /usr/bin/passwd
和 /bin/touch
等文件。这些文件需要具有可执行权限(即有 x permission)才能被执行。与之不同的是,shell脚本是使用 shell 程序(如 bash)的功能进行一些判断,最终还是需要执行一些已经编译好的二进制程序。因此,shell本身也是一个二进制程序。
要判断一个文件是否为二进制程序,可以使用 file
命令来查看。
[root@localhost ~]# 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
# 还有系所提供的/etc/init.d/network
[root@localhost ~]# file /etc/init.d/network
/etc/init.d/network: Bourne-Again shell script, ASCII text executable
看到了吗?如果一个文件是二进制程序,并且具有可执行权限,那么使用 file
命令时会显示它的执行文件类别(如 ELF 64-bit LSB executable),同时也会显示是否使用动态函数库(shared libs)。如果一个文件只是一般的脚本,那么 file
命令会显示它是文本可执行文件(text executable)等字样。
既然Linux操作系统真正认识的其实是二进制程序,那么我们是如何做出这样的一个二进制程序的呢?制作一个二进制程序的过程分为两步:编写源代码和编译源代码
。编写源代码时,我们使用的是文本编辑器,比如 vim,来写出一段程序的文字描述;这个文件就是源代码文件,它本质上是一个纯文本文件。接着,我们需要使用编译器来将这个源代码文件编译成操作系统认识的二进制程序
。在Linux系统中,最常用的编程语言是C语言,所以我们可以使用标准的C语言编译器——gcc,来将C语言源代码文件编译成可执行的二进制程序。
流程图如下:
在编译过程中,编译器会将源代码文件编译成目标文件(object file),这些目标文件通常以 *.o 的扩展名存储。同时,我们在编写程序时,可能会引用或调用其他外部的子程序或函数,这时候我们需要在编译的过程中将这些函数库加入到我们的程序中。这样,编译器就会将所有的程序代码与函数库链接在一起,生成最终的可执行文件。在C语言中,源代码文件通常以 *.c 作为扩展名,而函数库文件通常以 *.a 或 *.so 的扩展名存储。
- 开放源代码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行
- 编译器:将程序代码转译成为机器看得懂的语言,就类似翻译者的角色
- 可执行文件:经过编译器变成的二进制程序,机器看得懂所以可以执行
什么是函数库
在前面的流程图中,提到了函数库,那么什么是函数库?函数库是一组编写好的程序代码,可以在其他程序中被调用和重复使用。它们通常被组织成一个或多个文件,以便在需要时链接到程序中。在Linux系统中,PAM模块就是一个函数库,提供了验证用户身份和记录日志等功能,其他程序可以直接调用PAM的函数来实现身份认证,而不需要重新编写认证机制。此外,Linux内核也提供了很多函数库,可以供硬件开发者使用。
函数库又分为动态与静态函数库
如上图,如果需要使用一个函数库里面的函数,就需要在编译程序的时候加入相关的设置,让程序知道去哪里找到这个函数库。在Linux系统中,提供了很多与内核相关的函数库和参数,这些信息对于设计硬件驱动程序非常有用,它们通常被放置在/usr/include、/usr/lib、/usr/lib64这些目录中。
- 函数库:就类似子程序角色,是可以被调用来执行的一段功能函数
什么是make与configure
在使用类似gcc这样的编译器编译程序时,有多个程序文件需要编译,并且还需要写一个最终的链接程序。对于程序代码比较简短的情况,这并不是很麻烦,但是对于像WWW服务器软件(比如Apache)或者内核这样的大型程序,编译过程非常繁琐,需要写很多编译命令。为了简化这个过程,我们可以使用make命令来自动化编译过程,从而减少编译命令的编写量。
当使用make命令时,它会在当前目录下查找Makefile文件,这个文件记录了源代码如何编译的详细信息。make命令会自动判断源代码是否被修改过,如果有修改,则自动更新执行文件,这使得make成为了软件工程师非常实用的辅助工具。
make是一个程序,会去找Makefile,那么Makefile怎么写?通常软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动地建立中Makefile的规则文件,通常这个检测程序的文件名为configure或是config。
为什么要检测环境呢?因为不同版本的内核所使用的系统调用可能不同,每个软件所需要依赖的内核函数库也不同,同时,软件开发商不仅针对Linux开发,还可能针对整个UNIX-like系统进行开发,因此需要检测操作系统平台是否提供了所需要的编译器等工具。一般来说没检测程序会检测的内容大约有下面这些:
- 是否有适合的编译器可以编译本软件的程序代码
- 是否已经存在本软件所需要的函数库,或其他需要的依赖文件
- 操作系统平台是否适合本软件,包括Linux的内核版本
- 内核的头文件是否存在(驱动程序必须要的检测)
下面的图表明了整个过程中需要完成两个任务:
(1)执行configure来建立Makefile,这个步骤必须成功完成,只有成功之后才能(2)调用make命令进行编译所需的数据。
简单来说,configure是在检测和设置编译环境之后生成Makefile,而make则是根据Makefile来编译执行文件。这两个命令在整个编译过程中起到了非常重要的作用。
什么是Tarball的软件
Tarball文件就是将软件的源代码文件使用tar命令打包成一个文件,再使用压缩技术将其压缩。
最常见的压缩技术是gzip,因此Tarball文件的扩展名一般为.tar.gz或.tgz。由于利用了tar和gzip的功能,Tarball文件可以将软件的所有源代码文件打包在一起,方便用户进行传输和备份。近来,由于bzip2和xz的压缩率较高,Tarball文件也开始使用这些压缩技术,并相应地更改了扩展名,如.tar.bz2和.tar.xz等。用户在下载Tarball文件后,需要使用tar命令和相应的压缩解压工具进行解压缩,然后按照软件提供的安装说明进行编译和安装。所以说Tarball是一个软件包,你将它解压缩后,里面的文件通常就会有:
- 源代码文件
- 检测程序文件(可能是configure或config等文件)
- 本软件的建议说明与安装说明(README 或 INSTALL)
如何安装与升级软件
使用源代码编译安装:有些软件可能没有官方的软件包,只提供源代码,可以通过下载源代码并进行编译安装来安装软件,繁琐时间很漫长。
直接以编译好的二进制程序来安装与升级:这样做的好处就是省略了检测与编译等繁杂的过程。
那么源码包如何安装呢?基本流程是这样的