Linux下程序包管理之源码形式
程序包的前世今生:
说到程序包管理,不得不提到是就是程序包是由什么组成的?也就是怎么形成的?程序 是由源代码程序经过预处理、编译、然后汇编形成二进制的程序,这是针对特定硬件而形成 的程序。有计算机编程基础的同学都应该知道源代码编译的时候是要调用特定的库(库文件), 而这些库,在不同的系统上是不同的,比如Linux和window上的就不同,不同发行版的Linux 上的库也不尽相同,所以这就导致了在不同种类系统上编译生成的二进制程序的运行环境也 不尽相同,那么这些程序是不能在不同种类上的系统上运行,也就是说只能针对某一特定版 本的系统运行(这点一定要记住,在后面的RPM程序包管理器上还会提到)。
既然是Linux下的程序包管理,那我这里就以Linux为基础说明了,后面的内容默认在centos发行版上 说明。在centos上,二进制程序是生成了,但是要想让它在上面运行,还需要其他的东西?
库文件是必须要有的,在前面已经说过了,程序运行需要对应的库文件,所以这个必须要有。
程序要以某种配置运行,那它的配置要放在哪里呢?在Linux中一切皆文件的思想就在这里显现出来 了,配置是放在文件中的,叫配置文件,所以配置文件是必不可少的。
程序是有了,但是怎么用?对了,帮助文档也必须要有,通常是doc或者man,有了这些帮助文档,之后 就算是以前没有用过这个程序的小白用户也能看着这些帮助文档去使用它。
再加上上面生成的二进制程序
以上四点加起来就组成了程序包
源代码程序包版本:
程序的源代码会被归档压缩成.tar.gz或者.tar.bz2或者.tar.xz种类的文档,形如bash-4.3.2.tar.gz 类型的文件,其中
bash叫源代码程序包名
4是主版本号
3是次版本号
2就是发型号也叫做修订号
关于开源软件:
现在开源很流行,比如Java、MySQL、PHP等等,这些开源软件在开发的时候会依赖很多其他的开源软 件的功能,它们之间会有很多依赖关系,所以好多开源软件向外面发布的时候通常会以源代码的格式 向外发布,这样的话,用户想用这个软件的话直接获取到软件的源代码,然后在自己的环境上通过预处 理、编译、汇编等形成二进制软件,然后再通过一些设置,库文件的设置、头文件的设置帮助文档的设 置等,这个程序就能正常使用了,下面要说的就是这种通过源码方式获取程序的过程。
源码程序形式的特点:
兼容性很好,可控制性很好,可以定制:因为最后的二进制程序是在自己的环境中编译生成的,库 文件肯定没有问题,那么程序运行不会有问题的
操作很复杂,编译时间很长,非常容易出错(这也是为什么会有程序包管理器RPM):步骤多、不同 源代码所需要的库不同,所以非常容易出错,不是缺这个库文件,就是缺那个库文件;
下面就以源码形式安装nginx来给大家演示源码安装的步骤:
实验环境:
CentOS 6.6(64bit)内核是2.6.32-504.el6.x86_64
nginx-1.6.1.tar.gz
进行编译安装的前提:
要提供开发工具和开发库,需要安装一些包组:Development Tools、Server Platform Development、
Debug Tools、Compatibility libraries等,方法如下:
yumgroupinstall ‘Development Tools’
其他的包安装方法类似;
编译安装C源程序的步骤【三部曲】:
./configure: 检查编译环境,并根据指定的选项确定编译的特性、安装路径等;
--prefix=指定软件安装位置
--user=指定启动该程序的用户
--group=指定启动该程序的用户的属组
make : 调用所需要的编译器根据makefile配置文件定义执行编译过程;
make install: 安装程序
操作步骤:
# 解压压缩包 [root@localhost ~]# tar xfnginx-1.6.1.tar.gz # 进入到解压后的目录中 [root@localhost ~]# cd nginx-1.6.1 # 执行如下命令,查看执行./configure所需要的参数 --prefix==PATH 设定安装位置 --user=USER 设定可以启动这个程序的用户 --group=GROUP 设定可以启动这个程序的用户的属组 # 也可以看看其他的需要注意的参数,看看有没有需要设定的 [root@localhost nginx-1.6.1]# ./configure--help --help print this message --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname --lock-path=PATH set nginx.lock pathname --user=USER set non-privileged user for workerprocesses --group=GROUP set non-privileged group for workerprocesses --builddir=DIR set build directory --with-rtsig_module enable rtsig module --with-select_module enable select module --without-select_module disable select module --with-poll_module enable poll module --without-poll_module disable poll module # 由上一步可知需要建立一个系统用户,那就创建为nginx吧,同时它的属组为nginx [root@localhost nginx-1.6.1]# useradd -rnginx # 执行如下命令,设定其安装位置为/usr/local/nginx可以启动这个程序的用户为nginx属组为nginx # 这一步基本上都会有报错 [root@localhost nginx-1.6.1]# ./configure--prefix=/usr/local/nginx --user=nginx --group=nginx # 执行过之后我的报错信心如下: ./configure: error: the HTTP rewrite modulerequires the PCRE library. You can eitherdisable the module by using --without-http_rewrite_module option, orinstall the PCRE library into the system, or build the PCRE library statically fromthe source with nginx by using --with-pcre=<path> option. #可知缺少一个PCRE库,通过yum安装这个包 pcre或者 pcre-devel yum -y installpcre-devel # 安装过后,然后再执行 ./configure �Cprefix=/usr/local/nginx �Cuser=nginx�Cgroup=nginx # 没有报错,然后执行如下: make # 没有报错的话,然后执行如下: make install
程序是安装完了,还要完成后续的步骤:
# 1、把所安装程序的二进制程序所在路径加到PATH环境变量中; # 临时生效: ls /usr/local/nginx/sbin/nginx exportPATH=/usr/local/nginx/sbin:$PATH # 永久生效: # 在/etc/profile.d/下面创建一个文件命名为nginx.sh # 向里面加入 exportPATH=/usr/local/nginx/sbin:$PATH # 然后source 一下: source/etc/profile/nginx.sh # 2、 把库文件导出给系统: # 可以看到在nginx的安装目录下面有如下: [root@localhost profile.d]# ls/usr/local/nginx/ conf html logs sbin # nginx这个软件没有lib文件夹,但是其他的软件会可能会有,如果有的话那就需要把lib这个目录放在指定的地方可以让系统搜索到,假设nginx的lib路径为:/usr/local/nginx/lib; # 1、 新建文件/etc/ld.so.conf.d/nginx.conf,在文件里面添加下行: /usr/local/nginx/lib # 2、 然后运行一个命令: ldconfig让系统读取一下; #3 导出帮助文件: # 可以看到在nginx的安装目录下面有如下: [root@localhost profile.d]# ls/usr/local/nginx/ conf html logs sbin # nginx这个软件没有share目录,但是其他的软件可能会有,并且在share下面可能有man文件夹,把这个路径放在/etc/man.config的文件中: # 假设nginx的帮助文档路径为:/usr/local/nginx/share/man # 在/etc/man.config文件中加上如下语句: MANPATH /usr/local/nginx/share/man # 然后用source把/etc/man.config重读一下; # 这样就成功了 #4 把头文件导出 # 有的程序在安装之后会生成对自己拥有库文件调用接口相关的文件,系统查找头文件的路径为:/usr/include # 所以把相应应用程序的头文件方法:创建软链接至/usr/include下面 # 假设nginx的头文件路径为:/usr/local/nginx/include # 执行下面的代码即可: ln �Cs /usr/local/nginx/usr/include/nginx 做过了上面的四步之后,安装C源码程序就结束了。安装C源程序是不是很麻烦,很繁琐?需要编译、 还需要指明二进制应用程序路径给PATH环境变量、还需要导出帮助文件路径、还需要导出库文件、 还需要导出头文件等等,步骤多了,也会产生很多错误,那么有没有这样一个管理软件包的软件包 管理器呢?它可以把这些步骤都做好,然后用户可以通过一个步骤就可以做上面的多个步骤?当然有了 ,下一篇就会说到,在RedHat上很强大的一个软件包管理器:RPM