源码与Tarball

本以为搭建一个lanmp架构应该不难,没想到我在用源码包安装的时候报各种错误,有的还无法解决搞的我蛋都快碎了!于是再祭出鸟哥的私房菜这部葵花宝典,认真琢磨相关的章节,以求有所突破。看过之后还是有收获的,以前感觉如凉水般无味的章节变得很有用,至少对我。现在把我认为对我有帮助的部分给摘下来,供大家参考学习。
 
 
什么是tarball的软件
所谓的tarball文件,就是将软件的所有源代码先以tar打包,然后再用压缩技术来压缩,通常以gzip来压缩。因为利用了tar和gzip的功能,所以tarball文件一般的扩展名就会写成*.tar.gz或*.tgz,后来由于bzip2的压缩效率高,tar包渐渐以bzip2来取代gzip,因此文件名也会变成*.tar.bz2。
 
为什么要使用make
使用类似gcc的编译程序来进行编译的过程并不简单,因为一套软件并不会仅有一个程序,而是有一堆程序代码文件。make是一个程序,它会在当前目录下搜索makefile,makefile里记录了源码如何编译的详细信息。那么,makefile怎么生成、编辑?软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动新建这个makefile规则文件。这个检测程序的文件名通常为configure或config。
 
为什么要检测操作系统环境
不同版本的内核所使用的系统调用可能不同,而且每个软件所需要的相关函数库也不相同,同时,软件开发商不会仅针对linux开发,而是会针对整个Unix-like做开发。检测程序会检测的数据大约有一下这些:
是否有适合的编译程序可以编译本软件的程序代码;
是否已经存在本软件所需要的函数库或其他需要的相关软件;
操作系统平台是否适合本软件,包括linux的内核版本;
内核的头定义文件(header include)是否存在(驱动程序必须要的检测)。
 
使用源码管理软件所需要的基础软件
1. gcc或cc等C语言编译程序(即compiler),再补充一个gcc-c++
2. make及autoconfig等软件
用make的方式可以简化编译流程。
但是make需要makefile这个文件的规则,又由于不同系统里面可能具有的基础软件环境并不相同,所以就需要检测用户的操作环境,还自行建立一个makefile文件。这个自行检测的小程序也必须要通过autoconfig这个相关的软件来辅助才行。
3. 需要kernel提供的library以及相关的include文件
函数库在源码编译的过程中很重要,很多软件都是直接取用系统内核提供的函数库与include文件,尤其是在驱动程序方面的模块。在redhat的系统当中,内核的相关功能通常都是被包含在kernel-source或kernel-header这些软件当中。
4. development tools以及kernel source development等相关字眼的软件。
更吊的:在centos当中,如果要安装gcc等软件开发工具,使用“yum groupinstall “development tools” ”。
 
函数库管理
 

程序执行时引用外部动态函数库的示意图
linux操作系统中,函数库是一个很重要的项目,因为许多的软件都会相互使用彼此提供的函数库来进行特殊功能呢的运行,例如很多需要验证身份的程序都习惯利用PAM这个模块提供的验证机制来实作,而很多网络联机机制则习惯利用SSL函数库来进行联机加密的机制。
函数库依照是否被编译到程序内部而分为动态与静态函数库。
静态函数库的特色
扩展名
为.a,通常为lib***.a的类型
编译行为
这类函数库在编译的时候会直接整合到执行程序当中,所以利用静态函数库编译成的文件比较大。
独立执行的状态
这类函数库最大的优点是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函数库的内容
升级难易程度
只要函数库升级了,所有将此函数库纳入的程序都需要重新编译
动态函数库的特色
扩展名
为.so,通常为lib***.so的类型
编译行为
动态函数库与静态函数库的编译行为差异较大。动态函数库在编译的时候,程序里只有一个“指针”(Pointer)的位置而已。也就是说,动态函数库的内容并没有被整合到可执行文件当中,而是当可执行文件要使用到函数库的机制时,程序才会去读取函数库来使用。
独立执行状态
这类型的函数库所编译出来的程序不能被独立执行,因为当我们使用到函数库的机制时,程序会去读取函数库,所以函数库文件必须要存在才行,而且,函数库的所在目录也不能改变,因为我们的可执行文件里面仅有“指针”。
升级难易程度
当函数库升级后,可执行文件根本不需要进行重新编译,因为可执行文件会直接指向新的函数库文件(函数库新旧版本文件名相同)。
目前的linux distribution比较倾向于用动态函数库,最重要的一点就是函数库的升级方便。
绝大多数的函数库放在/usr/lib、lib目录下。此外linux系统里面很多的函数库其实kernel就提供了,kernel库放在/lib/modules里面,而且不同版本的内核提供的函数库差异性是挺大的。
 
两个命令ldconfig和ldd
ldconfig /etc/ld.so.conf用来将常用的动态函数库先加载到缓存(cache)当中,增加其读取性能。
具体步骤:
1. 在/etc/ld.so.conf里面写下想要读入高速缓存当中的动态函数库所在的目录
2. 用ldconfig这个可执行文件将/etc/ld.so.conf的数据读入缓存当中
3. 同时也将数据记录一份/etc/ld.so.cache这个文件当中
例如:将mysql函数库加入到缓存当中
vim /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/lib/mysql
执行ldconfig
ldconfig  -p,查看函数库名称对应的实际路径,即/etc/ld.so.cache
 
程序的动态函数库解析:ldd
ldd [-vdr]  [filename]
参数:
-v:列出所有的信息
-d:重新将数据有丢失的link点显示出来
-r:将elf有关的错误内容显示出来
例如:执行ldd /usr/bin/passwd
显示内容中有一行为:
libpam.so.0 => /lib/libpam.so.0 (0x004ab000)
由此知道passwd使用到pam模块
 
 
Tarball软件安装的建议事项
安装是选择单独的目录/usr/local/software,这样删除该软件时就比较简单,只要将该目录移除即可。这样安装的缺点是软件的命令目录不在PATH变量里,所以安装完毕之后要修改PATH,以apache为例,将“:/usr/local/apache/bin”加入到~/.bash_profile文件中的PATH变量中。在manpage搜索的设置中要在/etc/man.config内的40~50行左右处写入如下一行:
MANPATH/usr/local/software/man