11.3.1 软件包管理系统
常用的软件包格式有两种。Red Hat、Fedora、SUSE和其他几种发行版本使用RPM,即Red Hat Package Manager(Red Hat软件包管理器)。Debian和Ubuntu使用一种不同的.deb格式。这两种格式的功能类似。
利用从kitenet.net/programs/alien获得的alien这样的工具,很容易就能在两种软件包格式之间进行转换。alien对软件包内的软件一无所知,如果软件包的内容和发行版本不兼容的话,那么alien毫无用处。一般来说,最好坚持使用发行版本自己的软件包机制。
RPM和.deb这两种打包系统现在都是两层的全能配置管理工具。下面一层是安装、卸载和查询软件包的工具:RPM的工具叫rpm,.deb的工具叫dpkg。
在这些命令之上的是知道如何在Internet上找软件包、分析软件包间依赖关系、以及升级系统上所有软件包的系统。在这个层次上主要的竞争软件有:配合RPM系统运行的yum,Red Hat Linux专门的、也使用RPM的Red Hat Network,还有Debian的APT(Advanced Package Tool,高级软件包工具)。APT源自于.deb的世界,但是现在能很好地平等处理.deb和RPM软件包。
下面我们会看看底层的rpm和dpkg命令。我们将在11.4节讨论在这些底层工具上建立的全面的更新系统(例如APT和yum)。
它包含制作软件包的指导,以及使之易于管理的指导原则。有关.deb软件包格式的一般信息可以在
http://www.debian.org/doc/FAQ/ch-pkg_basics.html
上的Debian FAQ第6章里找到。
2311.53.1
2 rpm:管理RPM软件包
rpm命令安装软件包、核实和查询软件包的状态。它以前也可以构造软件包,但是这项功能现在已经分拆出来交由rpmbuild命令负责。不过,rpm的选项仍然有复杂的相互关系,它们只能按某些组合一起使用。最好把rpm想成是碰巧有相同名字的几个不同命令。
用户告诉rpm进入的模式(比如--install或者--query)指出了用户希望访问到rpm多种特性中哪一个。您可以用rpm命令来管理RPM软件包。这一条命令就出色地完成了所有有关RPM的操作,其中也包括构造RPM软件包。命令rpm
--help会提供给您所有的选项清单按模式分别列出了所有选项的清单,但是如果要频繁和RPM软件包打交道,那么值得花点时间稍微细读一下rpm的手册页。
rpm的基本选项有:--install、--upgrade、--erase和--query。--query选项稍微有点复杂,因为它只用于启用其他选项;必须再给一个命令行标志来提出特定的问题。例如,如果您不是在构造软件包,那么您确实需要留意的只有几个选项:--install、--upgrade和--erase;标志--query能判断软件包的状态和内容,它也是一个不可或缺的选项。--query选项实际上只是让rpm进入了查询模式。您必须再给一个选项来提出您的特定问题。命令rpm --query --all会显示出系统已经安装的软件包的完整清单。
假定您因为最近发布了有关OpenSSH的一个新的安全补丁,需要安装它的新版本。首先,需要找到被更新的软件包。如果这个软件包是核心OS的一部分,那么它最有可能是在您发行版本的FTP站点上的一个副本;安全报告会告诉您到哪里能得到它。如果软件包比较含混,第一个要搜索的应该是查看一下rpmfind.net。这个web站点提供了很好的RPM搜索引擎,它能告诉您到哪儿能找到用于各种发行版本的各种RPM版本。
让我们看一个例子。假定您因为最近发布了有关OpenSSH的一个新的安全补丁,需要安装它的新版本。一旦您已经把软件包下载到了本地的计算机上,那么安装它只要一条命令rpm --upgrade就用新版本替换了老版本:

或许还没这么简单。我们在这儿看到,有若干其他软件包需要当前安装的OpenSSH版本,即2.9p2-7。rpm命令不让我们升级OpenSSH,因为改动可能会影响到别的软件包。始终都会发生这样的冲突,这也就是开发类似ATP和yum这样的系统的主要动机。在实际中,我们不必手工搞清依赖关系,而是继续只用rpm达到本例的目的。
或许还没这么简单。我们在这儿看到,有若干其他软件包需要当前安装的版本OpenSSH, 2.9p2-7。rpm命令不让我们升级OpenSSH,因为改动可能会影响到别的软件包。我们可以用--force选项强行升级,但是那往往是个糟糕的想法。这不是Windows,有了依赖关系的信息并不会挡道,而是会节省时间和精力。没有比因为升级使SSH连不上远程系统相反,我们要找到其余的软件包(我们在这个例子里所用的安全报告原来就列出了其他软件包——看到文档的力量了吧!)。这样的事情,更能毁掉系统管理员一个上午的时间。
相反,我们也要找到被依赖的软件包的更新版本。如果我们聪明的话,在尝试升级之前就已经能判断出会有其他软件包依赖OpenSSH:

我们也已经判断出别的软件包是以这样的方式来依赖OpenSSH的:
现在假定我们已经得到了所有软件包的更新后的副本。我们可以一次一个地来安装它们,但是rpm足够聪明,我们能一次把它们全装上。如果在命令行列出多个RPM,rpm会在安装它们之前根据依赖关系对它们进行排序。
# rpm --upgrade openssh-*
酷!看上去它成功了,确认一下:
# rpm --query openssh
openssh-2.9p2-12
注意,即使我们没有给出软件包完整的名字或者版本,rpm也能明白我们所说的是哪个软件包。
2311.53.2
3 dpkg:管理Debian的软件包
就像RPM软件包有个全能的rpm命令一样,Debian软件包也有dpkg命令。dpkg比较有用的选项有:--install、--remove、以及出色地完成了作为一个终端用户需要处理Debian软件包的所有任务,其中包括安装它们(--install选项),删除它们(--remove选项)。您还可以用dpkg -–l,它会列出您的系统上已经安装的软件包。注意,dpkg --install安装软件包之前会把系统上已经有的老版本删除掉。
假定Debian的安全小组最近发布了一个针对nvi的修正,给某个潜在的安全问题打上了补丁。在得到这个补丁之后,我们运行dpkg安装它。由此可见,它显示的信息要比rpm更多,准确地告诉了我们它所做的事情。
假定Debian的安全小组最近发布了一个针对nvi的修正,给某个潜在的安全问题打上了补丁。在得到这个补丁之后,我们运行dpkg安装它。由此可见,它显示的信息要比rpm更多,准确地告诉我们它所做的事情。

我们现在可以用dpkg -l来看看安装是否起作用了。-l标志接受一个可选的搜索模式,所以我们可以只搜索nvi:

Our installation seems to have gone smoothly.
我们现在可以用dpkg -l来看看安装是否起作用了。-l标志接受一个可选的搜索模式,所以我们可以只搜索nvi:
我们的安装操作似乎已经顺利完成了。
23.2.7
SystemImager
SystemImager(www.systemimager.org)是一种开放源代码的工具,它采取了一种有别于Kickstart或者YaST的方法。它会安装完整的操作系统映像(OS image),而不只是个别的软件包,它也比基于软件包的安装程序速度更快。此外,您还可以轻而易举地对系统的表现做出根本性的调整。SystemImager可以在SSH上运行,如果您正在一个有危险的环境中安装Linux的话,这就会有很大帮助了。迄今为止,在常用的安装程序中,它对PXE的支持做得最好。
SystemImager简单而且易于定制,但有些脆弱。它在安装期间不支持太多对系统的自动配置,对于每种系统映像来说,要求机器的同构性比较好。
SystemImager缺乏像Kickstart和YaST那样的硬件配置逻辑。把一个映像安装到多种类型的硬件上有时要做大量的调试工作。例如,采用SystemImager目前的版本,您必须为带有SCSI硬盘和IDE硬盘的系统提供独立的映像。SystemImager不能理解网络可以不和接口eth0相关的概念。它也不能处理X
Windows的配置;不过,XFree86第4版支持大多数自动配置任务,使得这个文件没有那么重要了。参考www.xfree86.org了解有关XFree86的更多知识。
既然您想要多少映像就可以有多少映像,所以一种做法是为您要支持的每种硬件都做一个不同的映像。虽然太多的映像维护起来简直就是一场噩梦,但是对于由同样的机器所形成的集群来说,SystemImager是准确重复安装的最简单的方法。
SystemImager有一个活跃的支持小组,而且SystemImager会很快同LUI合并,以形成“一套能够管理所有系统构造需求的完整应用软件”,LUI是源于IBM的一种安装程序。最初开发SystemImager的VA
Software公司不再提供商业支持,但是庞大的开放源代码界仍然会使用它。
SystemImager的工作原理
SystemImager提供了一个简单的SYSLINUX引导映像,您可以从一张软盘或者CD-ROM光盘来引导它,也可用通过PXE下载它。这个安装映像包含了一个单独的rc脚本,它从一台映像服务器得到并且执行安装脚本。这个安装脚本对主硬盘进行分区,然后第二次运行rsync来把系统映像从服务器复制到客户机上。
SystemImager仅仅完成最少数量的本地化工作:它设置主机名和IP地址(如果没有使用DHCP的话)、运行lilo、重新启动主机,然后留给您一台新安装好的(而且有可能)能够运行的计算机。
系统的映像是安装服务器上面的一个目录层次结构,用标准的文件控制命令可以对它进行修改。做修改要比采用基于软件包的系统更方便,因为后者要求您添加软件包或者插入安装后的脚本。遗憾的是,这个特性让它在草草进行的本地化上显得不够透明,而且没有文档说明。如果您没有辛辛苦苦地记录下来构造映像的过程,那么到了升级的时候您就没有多少希望能再现它们。
如果您要为个别的机器进行定制,那么就要向安装脚本里加上代码,实现您所做的改动。另一种做法是创建您自己的rc脚本,在第一次引导新系统的时候运行该脚本。例如,SystemImager的作者之一就编写了代码,从一个脚本支持SCSI和IDE的安装。
设置SystemImager
SystemImager的引导环境在下面的这个站点有文档说明:
http://systemimager.org/manual/html/theactualstep-by-stephowto.html。
SystemImager的脚本是短小的Perl或者shell脚本。它们都有很好的文档。
SystemImager希望您提供一个参考系统,用作模板——它的“重要客户机(golden client)”。您必须在这个客户机上安装SystemImager客户端软件,而在安装服务器(installation
server)上安装服务器端软件。这两类软件包都可以从SystemImager的主站www.systemimager.org上得到。
“重要客户机(golden client)”的配置会被一点儿不差地复制到新机器上,这乍看起来似乎会有问题,但实际上却不会。只要“重要客户机(golden client)”的内核包含您站点上所有硬件的驱动程序就行了,新机器不一定要一模一样。在实际中间,最大的问题出在硬盘(SCSI/IDE)和网络设备上。SystemImager要求网络接口是eth0;要改动它的话,需要修改SystemImager的安装脚本。
一旦您已经有了配置好的“重要客户机(golden client)”,那么就可以执行命令prepareclient。然后安装systemimager-server软件包,建立映像服务器(image
server)。SystemImager倾向于让DHCP服务器和映像服务器是同一台机器。使用makedhcpserver这个脚本来创建对应于SystemImager安装的DHCP服务器控制文件。参考18.2.2节了解有关rsync的更多信息。
在映像服务器上运行getimage创建安装映像。这个脚本使用rsync在服务器上安装“重要客户机(golden
client)”的映像,而且构造一个与之对应的安装脚本。它支持4种分配IP地址的方法:静态DHCP、动态DHCP、静态IP地址或者“replicant(复制)”(总是赋予相同的IP地址)。
getimage把安装脚本保存为/tftpboot/systemimager。这是一个有意思的选择,因为这个脚本是用rysnc而不是TFTP来取得的。或许SystemImager的开发者们认为,因为PXE的引导资料(用TFTP来取得的)也放在/tftpboot下,所以最好把所有的东西都放在一起。
需要将SystemImager的客户机添加到DHCP的配置里(或者要给它提供一张引导软盘),而且要在tftpboot目录下建好适当的链接,以便它们可以获得它们的基本网络信息。SystemImager的addclients命令会替您自动执行这些步骤。
要实际安装客户机,您要做的全部工作就是放入某种引导介质(参见mkautoinstallcd和mkautoinstalldiskette命令),或者启动一次PXE引导过程。
SystemImager带有一个叫做updateclient的工具,它能把一台客户机升级到“重要客户机(golden client)”的当前版本。它带的另一个工具pushupdate能够在服务器上运行,让所有的SystemImager客户机都执行updateclient。默认的rysnc例外清单相当谨慎,所以您可能不得不对它进行扩充,以期获得所要的行为。参考23.4节有关即时更新问题的讨论。
定制SystemImager安装
如果您的映像服务器和DHCP服务器是不同的机器,就需要定制安装过程,告诉SystemImager这个情况。在引导软盘上创建一个叫做local.cfg的文件,设置您需要改动的参数。这个软盘是一张标准的FAT软盘,所以您可以把它当作一个FAT卷来安装或者使用mtools读写这张软盘。local.cfg文件实际上只是一个shell脚本,由SystemImager层次结构中的rcS脚本运行。用环境变量来指定选项。例如,要指定您的映像服务器,把下面这行
export
IMAGESERVER=imageserver.toadranch.com
加入到local.cfg文件里即可。
目前还不支持用PXE来获得一个配置文件。如果您能把映像服务器的标识指定为一个可选的DHCP服务器就好了。否则,您必须研究引导映像中的rcS脚本(在映像服务器上的/tftpboot/initrd.gz里),修正这些问题。
服务器端可能也需要做某些定制,例如,如果您想要改变SystemImager划分磁盘的方式。






