在Linux系统管理中,通过本地编译源代码的方式安装软件包,是普遍采用的一种方式。
优点
这种方式以灵活定制著称,主要具备以下优点:
- 定制软件包版本
在一些情况下,我们对软件包的版本有定制化的要求:
- 安装最新版本的软件包以使用其新特性
- 安装特定版本的软件包以满足特殊开发需要
- 安装过时版本的软件包以使用较老的开发管理工具
虽然像apt-get/yum这样基于deb/rpm的软件包管理器也提供定制软件包版本等功能,但由于deb/rpm中收录的软件包版本有限(最新/过旧的没有),直接通过编译源代码来安装特定版本的软件包仍是不可替代的。
- 安装软件库中没有的软件
deb/rpm软件库中的软件并不是一应俱全的,要安装软件库中没有的软件只能通过编译源代码的方式进行。这种软件一般是小众的开源软件、待发行的开源社区工具、处于开发测试阶段的软件等。
- 完美匹配本地环境
谁也无法保证异地编译的软件能在本地环境完美运行,在发行版林立、定制性极强的Linux世界里更是如此。因此,最稳妥的办法就是本地编译,本地编译至少能够保证软件包运行所依赖的环境完整,从而最大程度地减少软件运行不正常情况的发生。
- 多版本并存
Linux中,软件包多版本并存是支持且不可避免的。
以python为例,vim等工具需要依赖较旧的python版本,此时,若舍弃旧版本盲目提升python版本,就会导致vim等工具无法正常使用。
在这种情况下,安装多个版本的python是一个很好的选择。(对于python而言,更好的选择应该是virtualenv)
- 脱机安装
出于安全等因素考虑,企业网络一般会限制对外网的访问,在这种网络环境下,本地编译源代码进行脱机安装是迫不得已的选择。
缺点
- 复杂
毋庸置疑,这种方式操作较为复杂,需要较多的Linux系统管理知识。
- 依赖性关系
Linux中,软件包的依赖关系特别复杂,安装某一软件包往往意味着一系列依赖性软件包的安装。
apt-get/rpm会自行分析处理软件包依赖关系,从而简化安装过程。
本地编译安装源代码包就需要自己处理这些依赖关系了,事无巨细,亲力亲为。
一般步骤
1.下载待安装源代码软件包
wget url
2.解压缩
tar -jxvf xx.tar.bz2
tar -zxvf xx.tar.gz
3.进入解压缩后目录
cd xx
4.编译环境检查与软件安装配置
./configure
检查编译环境和软件包依赖关系,同时配置软件安装选项。
--prefix=软件要安装的路径
指定软件安装路径,默认路径为/usr/local。
5.编译源代码
make
编译源代码,生成目标文件,依赖gcc即其他编译环境。
6.安装到本机
make install
注意事项
- 安装说明高于一切
编译源代码包本身就是一种定制性很强的操作,具体的安装步骤直接与软件包相关。
标准的发行版软件源代码包内都会有安装说明文件,README/INSTALL。
该文件内一般会写明软件安装配置的具体步骤,以及软件依赖关系。该文件在安装过程中具有绝对地位,高于任何教程。所谓教程,包括我博客中的那些,不过是结合实践,对README/INSTALL文件做的简化和归纳。
- 善用echo $?
echo $?
用于检查上一条命令的退出状态,正常退出返回值为0。
编译安装的过程很复杂,不便直接看出执行结果,在每个步骤执行完毕后用echo $?
是最为经济的办法。
- 提前处理软件包依赖
软件包依赖关系需要在安装前处理完毕,即先安装依赖性软件包再安装目标软件。
软件包依赖一般没有补救的机会。
- 多版本并存
编译安装软件包之前,推荐检查Linux是否已经安装有该软件包的其他版本。
rpm -qa
列出所有安装的rpm package,通过其他方式安装的软件包不在范围内。
which xx
查找xx命令的位置,软件包一般会提供配套的命令,通过查找这些命令也可以判断软件包是否已存在。
thanks