在来到马哥教育之前,我只在Windows上安装过软件。昨天,就在昨天,才知道,真正的软件安装是什么。一切都可以自己定制,不会出现莫名其妙的问题,一切都可以追根溯源,一切都在掌控之中。再也不用担心注册表的问题了。我称之为“风一样的软件安装”。
在Linux系统中,软件安装可以通过rpm管理器安装,也可以通过本地的yum或者服务器端yum来安装软件。但,这一切都要依靠他人做好的程序包。如果我们自己想自定义安装,按需索取,只安装自己需要的功能模块,可能源代码编译安装就更加合适了。
这里以编译安装apache为例,简单介绍源代码编译安装软件的过程。
一、概述
源代码编译安装是指获取程序的源代码,然后在Linux开发环境下,编译,然后安装到系统中的过程。本文以CentOS 6.5 X86_64 relase作为实验环境,实验室内部拥有yum源。无局域网yum源的小友,可以使用互联网yum源。本文主要涉及到的内容有:
获取源代码
查看帮助信息
运行配置脚本
编译源代码
安装程序
测试安装结果
配置环境变量
输出头文件至系统
配置man手册文件路径
加载库文件
源代码编译需要系统提供gcc开发环境,因此需要事先配置好编译环境。当前系统为 CentOS 6.5,常用的开发包组为“Development Tools”和“Server Platform Development”。安装即可。具体怎么配置访问内部yum源,请参见博主的另一篇博客。此处仅给出安装开发编译环境的过程
#由于中间过程内容较多这里省略了一些不太重要的内容,小友们可以自行安装 #查看。这里安装组包使用yum groupinstall -y(安装过程无需输入确认)这里先安装Development Tools [root@station47 yum.repos.d]# yum groupinstall "Development Tools" -y Loaded plugins: fastestmirror, refresh-packagekit, security Determining fastest mirrors base | 3.2 kB 00:00 base/primary_db | 3.2 MB 00:00 Setting up Group Process Loading mirror speeds from cached hostfile base/group_gz | 220 kB 00:00 Package 1:make-3.81-20.el6.x86_64 already installed and latest version Package patch-2.6-6.el6.x86_64 already installed and latest version .................................................................................................... ...................................................................... Complete! [root@station47 yum.repos.d]#
#安装Server Platform Development组包 [root@station47 yum.repos.d]# yum groupinstall "Server Platform Development" -y Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile Setting up Group Process Loading mirror speeds from cached hostfile ..................................................................................... ..................................................................................... openldap.x86_64 0:2.4.23-32.el6_4.1 openssl.x86_64 0:1.0.1e-15.el6 pam.x86_64 0:1.1.1-17.el6 Complete!
如果看到如上所述的Complete,基本可以确定安装成功。可以测试一下
#显示如下信息说明已经安装成功 [root@station47 yum.repos.d]# gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [root@station47 yum.repos.d]#
三、获取源代码
从本地ftp服务器上获取源码包。源码包名字一般格式是package-version.tar.{gz|bz2|xz}(马帮风格,或的意思)。这里博主从本地服务器获取到一份源码。名称为
httpd-2.2.25.tar.bz2 。解压该文件至家目录(作为当前临时的工作目录)。
#解压源码包 [root@station47 ~]# tar xf httpd-2.2.25.tar.bz2 [root@station47 ~]# ll total 5464 -rw-------. 1 root root 2774 Feb 14 21:34 anaconda-ks.cfg drwxr-xr-x 11 500 500 4096 Jun 29 2013 httpd-2.2.25 -rw-r--r-- 1 root root 5524905 Jul 25 2013 httpd-2.2.25.tar.bz2 -rw-r--r--. 1 root root 43809 Feb 14 21:34 install.log -rw-r--r--. 1 root root 9963 Feb 14 21:30 install.log.syslog [root@station47 ~]#
四、查看帮助信息
切换当前工作目录至~/httpd-2.2.25,作为当前的工作目录(十分重要)。
[root@station47 ~]# cd httpd-2.2.25 #切换目录,查看源码目录的基本文件结构。 [root@station47 httpd-2.2.25]# ls ABOUT_APACHE CHANGES httpd.dsp libhttpd.dep NOTICE server acinclude.m4 config.layout httpd.mak libhttpd.dsp NWGNUmakefile srclib Apache.dsw configure httpd.spec libhttpd.mak os support build configure.in include LICENSE README test BuildAll.dsp docs INSTALL Makefile.in README.platforms VERSIONING BuildBin.dsp emacs-style InstallBin.dsp Makefile.win README-win32.txt buildconf httpd.dep LAYOUT modules ROADMAP [root@station47 httpd-2.2.25]#
目录中,INSTALL等包含了丰富的帮助信息。这里我们通过查看配置脚本自带的帮助信息。
#内容较多,中间有省略。这里重点关注--prefix和--syscondir [root@station47 httpd-2.2.25]# ./configure --help `configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... .................................................................... --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var]
五、运行配置脚本
#这里--prefix设置程序安装目录,--sysconfdir设置配置文件目录,--enable-so #设置http服务加载DSO模块。 若无问题,就可以编译安装了。若有错误,需根据具体错误信息做相应对策。 [root@station47 httpd-2.2.25]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd/ --enable-so
configure脚本主要是用来检查编译环境,定义相关的目录,定义启用或者禁用的特性。
背后的故事:在工作繁忙的./configure运行的间隙,探析下源码包都做了些什么工作。要知道configure这个文件不是一开始就有的,make也不是一开始就能用的。在他们能够被我们使用的背后,开发人员和程序做了大量的工作,其中,生成configure脚本和mkkefile是重中之重。源码包提供了autoconf工具,生成了伟大的configure脚本。在cofigure脚本和自定应的配置(例如--prefix)的共同作用下,atuomake以Makefile.in为模板,生成勤劳的make。make根据配置文件给出的信息,以及模板中已经提供的内容(由程序开发人员维护),编译安装程序。需要特别说明的是,这里的make并不是一个命令,而是系统提供给我们的一个程序管理项目,它后面有着复杂的管理工作,极大的简化了我们编译安装源码的难度。
六、编译源代码
#不要切换当前工作目录,直接使用make命令即可开始编译 [root@station47 httpd-2.2.25]# make
根据源代码的数量,编译的时间长短也会有所不同。需耐心等待,若没有出现error信息,咋表明编译成功,否则,则需要根据具体的错误信息一一排除。
七、安装程序
[root@station47 httpd-2.2.25]# make install
将源代码编译好后,就可以安装了。这里的安装,可以通俗的理解成将编译好的二进制程序和相关文件等复制到配置文件中指定的路径。因此,可以明确,需要卸载编译安装的程序,只需要移除指定的目录即可。
八、测试安装结果
启动httped服务,在远程主机上使用浏览器测试安装部署结果
切换工作目录之httpd安装目录,执行apachectl start启动httpd服务 [root@station47 ~]# cd /usr/local/httpd/bin/ [root@station47 bin]# ls ab apu-1-config dbmmanage htcacheclean htpasswd logresolve apachectl apxs envvars htdbm httpd rotatelogs apr-1-config checkgid envvars-std htdigest httxt2dbm [root@station47 bin]# apachectl start [root@station47 bin]#
在远程主机上输入服务器地址,出现如下信息,说明httpd服务已启动。
九、配置环境变量
为什么要配置环境变量?在配置之前一定要搞清楚。要不然,只知其然,不知其所以然。在Linux系统中,运行一个命令(内置命令除外),shell进程都会去环境变量PATH中列举的路径中搜素,如果搜索到了有这个命令,那么就创建子进程,执行命令;若没有找到,则会报错,提示命令没有找到。
我们编译安装好httd后,相关的二进制程序被放置在了/usr/local/apache目录下,如果要执行其中bin目录下的二进制程序就必须要写完整的路径才能执行。比如说这样写才能启动httpd服务。/usr/local/apache/bin/apachectl start。只有将bin路径添加至环境变量中才能实现直接使用命令,而不用完整路径。
在/etc/profile.d/目录下创建新的配置文件,apache.sh,然后,添加目录之PATH路径中。
#在apache.sh中键入如下内容。 PATH=/usr/local/apache/bin:$PATH export PATH
在bash中直接启动httpd服务
#如果配置成功,命令补全功能也能够正常使用 [root@station75 profile.d]# apachectl start httpd (pid 1972) already running [root@station75 profile.d]#
十、配置man手册文件路径
man手册存放在/usr/share/man目录中,系统通过配置文件/etc/man.config中的MANPATH来指定查找路径。这里我们新安装的程序的man手册并没有在这个配置文件中,因此系统无发找到man手册。我们使用vim编辑器添加一条MANPATH即可。
#在最后面添加一条,将apache的man路径添加进来。系统能够自动去寻找 MANPATH /usr/man MANPATH /usr/share/man MANPATH /usr/local/man MANPATH /usr/local/share/man MANPATH /usr/X11R6/man MANPATH /usr/local/apache/man
十一、输出头文件至系统
头文件以.h结尾。系统中其他源代码程序如果需要头文件中的定义的相关函数等,会在代码中声明调用此头文件,在编译程序时,会连接该库文件,动态生成二进制程序。多用于二次开发的过程中。
Linux系统的库文件都存放在/usr/include中,程序使用时会到这个目录中调用,因此需要将我们安装后的库文件跟系统库文件做以关联。我们使用软连接的方式,将httpd的头文件目录整个连接到/usr/include目录下。
将/usr/local/apache/include目录整个与系统include做软链接 [root@station75 man]# ln -sv /usr/local/apache/include/ /usr/include/httpd `/usr/include/httpd' -> `/usr/local/apache/include/' [root@station75 man]#
查看链接信息
[root@station75 include]# ll -d httpd/ drwxr-xr-x 2 root root 4096 Feb 24 17:34 httpd/ [root@station75 include]#
十二、加载库文件
在Linux系统中,库文件以.os(share object)结尾。库文件是编译好的二进制程序(这里仅指共享库)。Linux系统在启动时,会将/etc/ld.so.conf.d/目录下的所有库文件都加载至缓存中,缓存目录/etc/ld.so.cache。一直等到下次重启或者手动加载新的库文件,缓存才会更新。
要想让httpd的库文件能够被访问使用,加载至系统缓存中,必须配置相关文件。在/etc/ld.so.conf.d/目录下新建配置文件,httpd.conf。添加配置信息。
#在配置文件中,仅有这一条,如果有多个库文件目录,每行一条即可 /usr/local/apache/lib
使用命令ldconfig命令重新加载缓存。
#-v显示详细信息 [root@station75 ld.so.conf.d]# ldconfig -v | less /usr/local/apache/lib: libexpat.so.0 -> libexpat.so.0.5.0 libaprutil-1.so.0 -> libaprutil-1.so.0.5.2 libapr-1.so.0 -> libapr-1.so.0.4.8
十三、结语
源代码编译安装程序是系统管理、运维工作中非常重要、基础的工作。因此,熟练掌握操作步骤,洞悉内部工作原理,掌握配置文件修改等,至关重要。本文简单描述了源代码安装apache。如有纰漏,还请批评指正。
version:1.0 原始版本