到此为止,Linux长什么样,怎么用算是基本讲完了。但真正掌握一个系统的标志不是你都知道它能干什么或者是怎么干,而是能够按照自己的意图安装自己需要的软件。因为操作系统能够提供的功能是有限的,而我们的欲望是无限的。接下来我们就要搞清楚这个问题,看看在Linux下如何安装软件吧。 2.5.1 从源代码安装软件 自己动手丰衣足食,从源代码安装软件是Linux系统中最原始也是最为有效的一种方式。采用这种方式可以安装所有针对Linux系统开发的软件,以及绝大部分针对类Unix系统开发的软件。 从源码安装离不开安装“三步曲”。在演奏这“三步曲”之前,因为不确定源码中是否包含上次编译过的目标文件(* .o),我们最好用make clean或make distclean去除目标文件,以保证新编译出来的可执行文件是在自己机器上编译完成的。 第一步:configure 它被用来检查待安装源码的 Linux 系统的相关软件属性,创建Makefile文件。这一步很关键,随后需要的安装信息都是从这一步中获取的。例如安装nginx软件包时,我们可使用以下命令: ./configure --user=www --group=www --with-pcre=/usr/include/pcre/ --with-http_ssl_module --with-http_stub_status_module--without-select_module--without-poll_module --without-http_empty_gif_module --with-http_rewrite_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic 看起来,nginx配置的configure参数还真不少。不要紧,磨刀不误砍柴工,我建议事先阅读一下源码安装包目录下的 README 或 INSTALL 相关的文件,这样做有助于我们正确设置参数。 第二步:make make 根据Makefile的指示开展编译工作,利用gcc将原始码编译成为目标文件,这些目标文件通过函数库连接产生一个完整的可执行文件。此时这个可运行文件还没有被安装到预定安装的目录,仍然在当前编译目录下。 第三步:make install make根据Makefile这个文件里面关于 install 的项目,将上一个步骤所编译完成的文件安装到预定的目录中。一般有etc、lib、bin和man 等目录分别代表配置文件、函数库、执行文件、线上说明文件。 把命运掌握在自己手里固然好,利用源码安装软件有一定的灵活性,例如某个软件在系统中已经稳定运行了一段时间了,可是目前该软件有一个新版本,我们不知道这个新版本能否在当前系统中可靠运行,就可以利用源码安装这个新版本。 但是我不得不说在大多情况下,利用源码安装是费力不讨好的事。这种方式安装的软件因为没有做软件相关性检查会导致它依赖的其他软件不存在或者版本不正确,从而有可能无法正常运行。 2.5.2 利用软件管理工具rpm和dpkg 君子善假于物,由于从源码安装存在上述问题,Linux引入了软件管理机制进行软件包的安装、更新和卸载。软件发行商需要在固定的操作系统平台上将需要安装或升级的软件及其相关软件打包成一个特殊格式的文件。这个软件包中包含了软件包描述文件,其提供了软件包的各种信息,例如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作,以及软件包所要包含的文件列表等等。用户得到了软件包并在系统中执行特定的命令后,软件包会根据内部的脚本检测需要的软件是否存在。若安装环境OK的话,安装工具就有条不紊地开展安装工作。在安装完成后安装工具还会将安装信息写入软件管理机制供今后升级、删除、查询与验证。 了解了软件管理运行机制后,我就以表格的形式向你简单说明一下Linux系统上最通用的两个软件管理工具rpm和dpkg。 表 2-4 RPM DPKG 全称 Red Hat Package Manager(Red Hat包管理器) Debian Package(Debian软件包管理器) 文件名 RPM软件包的命名遵循名称版本修正版类型这种格式。例如Magiclinux-3.0.2-1.i386.rpm DEB软件包的命名遵循名称版本修正版类型这种格式。例如Magiclinux-3.0 .2-1.i386.deb 软件包 内容 软件包描述文件(SPEC)、预安装脚本、多个二进制文件、安装后脚本 源码包xxx_x.x-x.tar.gz、源代码信息总结包xxx_x.x-x.dsc、用dpkg管理的完整二进制包xxx_x.x-x-xxxx.deb、供dput使用的包xxx_x.x- x-xxxx.change。 dsc包提供了control文件、copyright文件、changelog文件、Rules文件、Compat文件和dirs文件。control文件声明了重要的变量,dpkg通过这些变量来管理软件包 (续) RPM DPKG 安装 rpm -ivh<rpm软件包名>,如 rpm -ivh Mysoftware-1.2 -1.i386.rpm dpkg -i<deb软件包名> 查询 当你只知道软件名称,在卸载前需要确定这个软件的完整名称时,你可以使用rpm -qa xxx*查找RPM包软件。xxx指软件名称开头的几个字母。 查找此软件向系统里写入的文件列表,使用: rpm -ql <rpm包名> 统配符模式进行模糊查询 dpkg -l xxx* 查询系统中属于xxx 软件的文件: $ dpkg --listfiles xxx 卸载 rpm -e<rpm软件包名>,如rpm -e Mysoftware(注意此处是软件名而不是软件包名) dpkg -e <deb软件名> 有关RPM包的制作本书在后续章节中会有详细介绍,至于dpkg包的制作就得麻烦你自己查手册学习了。具体的原因就是RPM更多地被企业所应用。需要说明的是RPM在被安装之前,为了避免文件被错误安装会先检查系统的硬盘容量、操作系统版本等,所以RPM文件必须要在相同的Linux环境下才能够安装。如果我们的环境与原作者打包的Linux环境不同,又想安装这个软件,怎么办?幸好很多软件作者除了提供RPM包外,还提供了以***.src.rpm这种格式来命名的SRPM软件包。 SRPM提供了参数配置档,即configure与makefile。这样虽然SRPM内容是源码,但仍含有所需要的相依性软件说明、以及所有RPM文件所提供的数据。在安装该软件时,先将该软件以RPM管理的方式编译RPM文件,然后将编译完成的RPM文件安装到Linux系统当中。 2.5.3 更酷的线上升级 有了上节谈到的那类工具的帮忙,安装自然方便不少,但是dpkg/rpm 这些机制并没有完全解决软件属性相依的问题。例如在装PHP软件包时,系统就可能会提示一些错误信息,指出需要其他一些软件包的支持。你可能想到的解决办法是从Linux系统的安装盘中查找一下,看是否有需要的软件包。但是不少软件包在Linux安装盘中是没有的,需要自己到网上去下。如果要在原先已经部署好的Linux服务器中追加一些应用服务时,很难避免不出现软件包的依赖问题。那有没有办法解决呢?当然有。 很多Linux开发商提供了线上升级策略。这种策略的实施过程是系统先制作这些相依属性的软件列表,在安装某个软件包的时候,先到这个列表去找,同时与系统内已安装的软件相比较。这样没安装的相依软件就能一次性全部安装起来。哈哈,原版光盘就只有第一次安装时需要用到而已,其他时候只要有网络都可以从开发商的服务器中获得!不同Linux开发商采用的工具不同,dpkg管理机制出现了 APT 线上升级机制,而RPM 根据开发商的不同所采用工具也不一样,其中有 Red Hat 系统的yum ,SUSE系统的Yast Online Update(YOU),Mandriva的urpm软件等。首先我们结合下面的yum机制示意图来理解线上升级策略。 图2.3 yum机制示意图 $ ls -al /var/cache/yum …… drwxr-xr-x 3 root root 4096 08-31 05:09 alibaba-cn drwxr-xr-x 3 root root 4096 08-31 05:09 alibaba-common drwxr-xr-x 3 root root 4096 01-31 17:13 alibase.5Server.noarch drwxr-xr-x 3 root root 4096 01-31 17:13 alibase.5Server.x86_64 …… drwxr-xr-x 3 root root 4096 01-23 11:36 taobao.5.x86_64.current drwxr-xr-x 3 root root 4096 01-31 17:13 taobao.5.x86_64.stable drwxr-xr-x 3 root root 4096 11-27 17:08 taobao.5.x86_64.test drwxr-xr-x 3 root root 4096 11-01 13:25 xen 在上图中,一个或者多个配置文件描述了对应的repository的网络地址,repository可以是我们自己用yum-arch或者createrepo命令创建的,也可以是别人已有的repository作为镜像。通过http或者ftp协议从repository获得必要的信息,下载相关的软件包。然后本地用户通过建立不同的repository的描述说明,在有网络连接时就能方便地进行系统的升级维护工作。另外,如果需要使用代理,可以使用http_proxy和ftp_proxy这些shell里面的标准环境变量来设定。 接下来我们介绍一下Linux系统上最popular的两个线上升级工具:apt和yum。 表 2-5 yum apt-get 简介 yum是yellowdog updater modified的缩写。yellowdog是一个Linux的distribution,Red Hat将这种升级技术利用到自己的distribution形成了现在的yum APT是Advance Packaging Tool的缩写。它包含以“apt-”开头的多个工具:apt-get、apt-cache和apt-cdrom等,在Debian/Ubuntu发行版中使用 基本操作 安装 yum install <package_name> apt-get install <package_name> 升级 yum update <package_name> 刷新软件源,建立更新软件包列表 apt-get update 将系统中的所有软件包一次性升级到最新版本 apt-get upgrade 卸载 yum remove <package_name> apt-get remove <package_name> 清除软件包的同时清除配置 apt-get purge remove <package_name> 查询 1. 查找软件包: yum search <keyword> 2. 列出所有已安装的软件包: yum list installed 3. 获取软件包信息: yum info <package_name> 4. 列出软件包提供哪些文件: yum provides <package_name> 1. 查找软件包: apt-cache search <keyword> or <regular expression> 2. 获取指定软件包的详细信息: apt-cache show <package_name> 3. 获取软件包版本和软件包的依赖关系: apt-cache showpkg <package_name> (续) yum apt-get 基本操作 清除 缓存 下载的软件包和header存储在cache中不会自动删除。使用yum clean 完成清除磁盘空间的工作 1. 清除header: yum clean headers 2. 清除下载的rpm包: yum clean packages 3. 清除缓存的软件包及旧headers: yum clean all 1. 清理整个软件包缓冲区: apt-get clean 2. 按照依赖关系清理缓冲区中多余的软件包: apt-get autoclean yum和apt的原理类似,apt的执行效率高于使用 Python写成的yum。既然yum是利用Pthyon脚本语言实现的,所以在Pthyon升级问题上要慎重,否则会导致yum工作不正常,系统无法实现线上升级了。 当然在Linux系统上除了通过命令行方式进行软件安装外,还可以通过图形工具进行软件安装,例如在Fedora和Ubuntu系统上使用Synaptic,在SUSE和openSUSE系统上使用YaST2。但是我推荐使用命令行的方法。