本节书摘来自异步社区《UNIX/Linux 系统管理技术手册(第四版)》一书中的第1章,第1.12节,作者:【美】Evi Nemeth , Garth Snyder , Trent R.Hein , Ben Whaley著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.12 查找和安装软件的途径
UNIX/Linux 系统管理技术手册(第四版)
第12章详细讲述了软件方面的知识。但是对于没有耐性的读者来说,这一节是个初级速成教材,教给读者怎样知道自己系统上已经安装好的软件有哪些,以及怎样获得和安装新软件。
现代操作系统把自己分成多个软件包,软件包可以逐个独立安装。默认安装的只包括一定范围的起步软件包,用户可以根据需要再扩充。
附加软件常常也以预先编译好的软件包形式提供,这是一种主流的方式,各个系统间的区别仅仅在于程度的不同。大多数软件都是由独立的小组开发,且以源代码的形式发布出来。接下来,软件库收集这些源代码,然后根据软件库为之服务的系统上的使用习惯,对其进行编译,再把编译结果打成软件包。安装针对特定系统的二进制软件包通常要比取得并编译原来的源代码更容易。不过,打包软件有时候要比当前版本落后一两个版本号。
两种系统使用相同的软件打包系统不一定意味着两个系统的软件包能够互换使用。例如,Red Hat和SUSE都使用RPM,但是它们的文件系统布局却稍有不同。如果能找到专为自己系统做的软件包,那就用它们,这是最好的做法。
主流的Linux发行版本都提供优异的软件包管理体系,里面包括能够访问和搜索Internet上软件库的工具。发行商替社区积极维护这些软件库,所以Linux系统管理员很少需要跳出自己系统上的默认软件包管理器。生活真美好。
UNIX系统在软件包管理方面显得畏手畏尾。Solaris、HP-UX和AIX都提供打包软件,在单机的层次上使用没问题。但是,这些系统的厂商却没有维护开源软件库,而让用户群大多进行自我维护1。遗憾的是,维系一个打包软件环境所依赖的纽带之一,是有一条途径可以让软件包可靠地检索其他软件包,从而掌握依赖性和兼容性方面的信息。没有某种中心作为协调,整个体系就会很快分崩离析。
在现实世界里,情形则各不相同。Solaris有一套附加系统(blastwave.org的pkgutil),可以方便地从Internet软件库安装软件,这和Linux发行版本上自带的系统很像。HP-UX有一个不错的Internet软件库,它采用了HP-UX移植和存档中心(HP-UX Porting and Archiving Centre)的形式,地址为hpux.connect.org.uk,但是必须手工逐个下载软件包。在这个领域内做得较差的典型,就是AIX,给它预先打包好的软件找起来很分散。
系统管理员没找到打好包的二进制软件,就必须采用老办法安装软件:下载一个tar源代码包,手工配置、编译和安装它。这个过程可长可短,取决于具体软件和操作系统。
在本书里,我们一般认为可选软件都已经装好了,并不折磨读者按生搬硬套的步骤去安装每个软件包。如果有可能发生混淆,我们有时候也会给出完成某个特定项目所需软件包的确切名称。但是,对于大部分内容来说,我们都不会重复讲述安装步骤,因为前后软件包的安装都很类似。
1.12.1 判断软件是否已经安装
出于各种原因,要判断实际需要的东西在哪个软件包里,需要有点儿小技巧。除了在软件包的级别上查找之外,更简单的做法是使用shell的which命令找出相关的二进制程序是否已经在搜索路径中。例如,下面的命令就揭示出已经在机器上安装了GNU的C编译器。
aix$ **which** gcc
/opt/pware/bin/gcc
如果which没有找到要找的命令,那么试试whereis;该命令搜索更大范围的系统目录,与shell的搜索路径无关。
另一种方法是采取作用非凡的locate命令,它参照预先编译好的一个文件系统索引,以此确定与特定模式相匹配的文件名。locate命令是GNU的findutils软件包里的一个程序,这个软件包在大多数Linux系统上都是默认包含的,但在UNIX系统上必须手工安装。
locate的搜索并不只针对命令或者软件包,而是能够找到任何类型的文件。例如,如果读者不能确定在哪儿能找到头文件signal.h,可以试试:
ubuntu$ **locate** signal.h
/usr/include/signal.h
/usr/include/asm/signal.h
/usr/include/asm-generic/signal.h
/usr/include/linux/signal.h
locate的数据库通常由updatedb命令定期更新,这条命令由cron来运行。因此,执行一次locate的结果不是总能够反映出文件系统新近的变化。
如果用户知道正在查找的软件包的名字,那么也可以使用系统上的软件包工具来直接检查是否有该软件包出现(以及已装软件的版本)。例如,在Red Hat或者SUSE系统上,下面的命令可以检查是否有Python脚本语言:
redhat$ **rpm -q python**
python-2.4.3-21.el5
参考第12章,了解有关软件包管理的更多知识。
1.12.2 增加新软件
如果需要安装额外的软件,首先要确定相关软件包的标准名称。例如,需要把“我想装locate”转换为“我需要安装findutils软件包”,或者把“我要named”转换为“我必须安装BIND”。在网上各种针对特定系统的索引能够帮助做转换,但是Google通常更有效。例如,搜索“locate命令”,就能直接找到若干与之相关的讨论。如果是在UNIX上,那么还需要输入操作系统的名字。
一旦知道了相关软件的确切名称,就可以下载并安装它。在Linux和安装了pkgutil的Solaris系统上,整个安装过程通常用一条命令就够了。对于HP-UX和AIX而言,则要么下载预编译好的二进制软件包,要么下载项目的源代码。如果是后者,需要通过Google定位该项目的正式网站,然后从项目的镜像站点之一下载源代码。
下面的例子展示了在我们的每一种示例系统上安装wget命令。它是一个很棒的GNU工具,能够把HTTP和FTP下载变成单条命令——对于脚本编程来说非常有用。我们所举的每种Linux系统默认都安装了wget,但是下面给出的命令用于初始化安装和后续升级。
Ubuntu使用APT(Debian Advanced Package Tool,Debian高级软件包工具):
ubuntu# apt-get install wget Reading package lists... Done Building dependency tree Reading state information... Done wget is already the newest version. 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
SUSE版的操作:
suse# yast --install wget <在一个基于终端的UI里运行>
Red Hat版的操作&#xff1a;
redhat# yum install wget Loaded plugins: fastestmirror … Parsing package install arguments Package wget-1.10.2-7.el5.i386 is already installed and latest version Nothing to do
在已经装有pkgutil的Solaris系统上&#xff08;参考blastwave.org来了解配置说明&#xff09;&#xff1a;
solaris# /opt/csw/bin/pkgutil --install wget <安装了7个软件包产生的多页输出信息>
对于HP-UX&#xff0c;我们在hpux.connect.org.uk上找到了一个适用的二进制软件包&#xff0c;把它下载到/tmp目录下。解压缩和安装的命令如下&#xff1a;
hpux# gunzip /tmp/wget-1.11.4-hppa-11.31.depot.gz hpux# swinstall -s /tmp/wget-1.11.4-hppa-11.31.depot wget &#61;&#61;&#61;&#61;&#61;&#61;&#61; 05/27/09 13:01:31 EDT BEGIN swinstall SESSION (non-interactive) (jobid&#61;hpux11-0030) * Session started for user "root&#64;hpux11". * Beginning Selection * Target connection succeeded for "hpux11:/". * Source: /tmp/wget-1.11.4-hppa-11.31.depot * Targets: hpux11:/ * Software selections: wget.wget-RUN,r&#61;1.11.4,a&#61;HP-UX_B./800 * Selection succeeded. * Beginning Analysis and Execution … * Analysis and Execution succeeded.
在swinstall命令行里出现的depot软件包必须用/开头的完整路径&#xff1b;否则&#xff0c;swinstall就会到网络上找文件。最后的wget告诉swinstall从depot文件里安装哪个软件包。 遗憾的是&#xff0c;这个安装过程没有乍看上去那么简单。装好的wget版本实际上无法运行&#xff0c;因为没有装它所依赖的几个库。
hpux$ wget http://samba.org/samba/docs/Samba3-HOWTO.pdf /usr/lib/dld.sl: Can&#39;t open shared library: /usr/local/lib/ libcrypto.sl /usr/lib/dld.sl: No such file or directory [HP ARIES32]: Core file for 32 bit PA-RISC application [HP ARIES32]: /usr/local/bin/wget saved to /tmp/core.wget.
swinstall内置有依赖关系的管理机制&#xff0c;但是遗憾的是&#xff0c;它的这种功能不能延伸到Internet上的软件库里。用户不得不根据提示安装所有要求预装的软件包&#xff08;本例中有6个之多&#xff09;以达到最终目标。
1.12.3 从源代码编译软件
实际上&#xff0c;wget至少存在一种可用于AIX的二进制软件包&#xff0c;它是RPM格式的。用Google搜索“aix wget rpm”应该就能找到一些不错的线索。下载下来之后&#xff0c;安装命令很简单
aix# **rpm --install wget-1.11.4-1.aix5.1.ppc.rpm**
但为了演示&#xff0c;我们从源代码开始编译AIX版本的wget。
我们的第一项任务是找到代码&#xff0c;这很容易&#xff1a;用Google搜索“wget”得到的第一个结果就正好把我们指向GNU的wget项目&#xff0c;再点一下就能找到源代码的tar包。把当前版本的代码下载到/tmp目录里&#xff0c;再解开、配置和安装&#xff1a;
aix# **cd /tmp; gunzip wget-1.11.4.tar.gz**
aix# **tar xfp wget-1.11.4.tar**
aix# **cd wget-1.11.4**
aix# **./configure --disable-ssl --disable-nls** # 参考下面的注释
configure: configuring for GNU Wget 1.11.4
checking build system type... rs6000-ibm-aix
…
config.status: creating src/config.h config.status: executing default commands generating po/POTFILES from ./po/POTFILES.in creating po/Makefile
aix# **make**
<几页的编译输出>
aix# **make install**
<大约有一页的输出>
对于大多数UNIX和Linux软件来说&#xff0c;都可以依次执行configure/make/make install三条命令&#xff0c;只要已经安装了开发环境以及预先要求有的软件包&#xff0c;就会得到结果。不过&#xff0c;最好查看软件包的INSTALL或者README文件&#xff0c;了解该软件的特别之处。
在这个例子里&#xff0c;configure命令的两个选项--disable-ssl和--disable-nls省略了wget的一些特性&#xff0c;这些特性要依赖其他一些还没有安装的库。在实际中&#xff0c;用户可能想还是安装要求预装的那些库。使用configure--help查看所有的配置选项。另一个有用的配置选项是--prefix&#61;directory&#xff0c;这个选项可以把软件安装到/usr/local之外的其他目录里。