debian包管理工具,Debian软件包
Debian软件包管理系统
Debian软件包管理系统可能是类Unix系统上最复杂的软件包管理系统。Debian的机制是网络透明的(也就是他可以通过网络透明的在远程设备上安装包),Debian也是第一个使用这种打包系统的发行版。RH是最新的类似Debian的软件功能,但是Slackware Linux还没有达到真正网络透明的程度。熟悉其他操作系统的用户,比如Windows,可能会想到Windows Update,但是Debian的机制会更强大。这一部分将详细讨论Debian的包管理机制。
技术总结
Debian的包管理系统可以分为几层。最底层是实际的软件包管理系统,最高层是用来自动处理软件包定位和获取软件包安装过程的各种用户友好的界面程序。下表列出了要调用的主要程序:
基于目的的程序
Dpkn/a实际上安装和管理软件包。
Apt-get dpkg管理软件包的源列表,获取要安装的软件包。
Dselect apt-get,dpkg允许用户从源列表文件中选择要安装的软件包。
TaskApt-Get,dpkg允许用户选择要安装的任务(本地包组)。
下一节将详细讨论Debian的包管理程序。出于演示的目的,Debian的程序将与RH和Slackware中的等效程序进行比较。这只是一个比较,我们的目的不是判断任何一个系统是否最优。Debian系统相当复杂,我们这样做只是为了方便我们的讨论。
使用dpkg程序
Dpkg是Debian软件包管理系统的关键。这个程序负责debian包存档文件(Deb扩展)的实际解包和安装,并负责管理与包管理相关的各种数据库。
我们可以使用dpkg手动安装单独的软件包。举个例子,也许我们会从某个网站下载一个deb文件,用dpkg来安装,或者我们会从光盘安装一个软件包。同样,我们也可以使用dpkg来移除某个软件包。我们还可以使用dpkg来执行查询命令,比如列出某个包安装的文件,或者定位包含指定文件的包。
这个时候我们可能已经意识到dpkg程序和rpm程序在本质上是类似的。通过rpm程序,我们可以安装和卸载软件包,或者对软件包(包括已安装和未安装的软件包)执行各种查询命令。Slackware会通过各种程序(Install PKG,Upgradepkg,Removepkg)完成照片部分的功能。
Slackware使用/var/log/package目录中的简单文本文件来存储关于软件包和文件之间关系的各种信息。RH是另一个极端。它将各种信息存储在二进制数据库中,但我们只能通过rpm命令来访问它。Debian的dpkg处于中间状态:一个软件包安装的文件列表存储在一个数据库中,但是这个软件包的信息存储在/var/lib/dpkg/available文件中,所以安装的软件包的信息存储在/var/lib/dpkg/info目录中。在一些程序上,我们可以查看一些信息的相关文件,但这并不一定要使用dpkg工具来完成(虽然我们会发现dpkg工具会更方便)。
dpkg和rpm的一个主要区别是,dpkg维护一个实际可用但尚未安装的软件包列表,即/var/lib/dpkg/available file。(其实RH也提供了一个名为rpmdb的软件包来提供类似的功能,但是这个软件包比较难用)。这个列表是以CD或者其他定性内容来组织的,这种组织结构可以完成各种查询请求。(例如,用户可以查询未安装软件包的文档信息)。这是相当方便的,因为这意味着我们不需要deb包本身来获取一个包的信息;如果我们使用rpm命令,我们必须实际安装这个软件包,并使用rpm -qp命令进行相应的查询。
Debian的软件包管理系统和RH的RPM系统的另一个主要区别是它们的软件包依赖性的解决方案。RPM可以跟踪依赖关系,即一个包依赖于另一个包。例如,OpenSSH包依赖于OpenSSL包。如果使用RPM,reliance只是一个是或否的建议。然而,dpkg工具可以支持几种类型的依赖关系,例如“必需的”、“推荐的”和“建议的”。这种额外的记录活动可以使软件包很容易与最终用户的依赖性信息进行交互。当我们安装一个Debian软件包时,记得仔细检查软件包的依赖关系,因为我们会遗漏一些推荐或建议的功能。
使用apt-get程序
apt-get程序建立在dpkg程序的基础上,管理包的源代码,提供了前面提到的大部分网络透明性。我们可以认为这个程序提供了dpkg程序的来源。dpkg安装的软件包应该是从一个地方获取的,apt-get就是这个地方。apt-get的另一个主要职责是跟踪软件包之间的依赖关系(比如哪个软件包需要另一个)。
管理源媒体
通常,用户会从安装光盘或网络上的安装仓库(如FTP站点)安装Debian。这些安装介质构成了Debian软件包的集合,apt-get监控这些介质并跟踪每个源可用的软件包列表。当用户想要安装一个新的软件包时,他只需执行apt-get来定位软件包,并将其传递给dpkg进行安装。找到这个包可能意味着回到FTP站点,或者提示用户插入安装CD,或者其他什么。
践踏可用软件包的能力是一个主要的便利。比如rpm的系统就相当短视,RPM不会看任何不直接坐在他面前的文件。相反,Debian的apt-get可以更好地看到可用软件包的范围,无需麻烦用户自己下载就可以获取软件包。RH也有一个类似的系统叫做up2date,但是它只知道RH维护的软件包仓库的信息。Debian的apt-get有一个更加灵活的包源列表。我们也可以把up2date看成只能处理一个包源的apt-get的兄弟。
apt-get使用的源媒体列表由一些助手维护。存储源列表的文件是/etc /etc/apt/sources.list该文件应该包含各种源,如CD、FTP或HTTP站点等。这个文件的内容可以很容易地被一些助手管理,比如apt-cdrom,它可以搜索Debian包CD并在/etc /etc/apt/sources.list中创建适当的内容
使用apt-get
在Debian系统上维护软件包时,很多用户大部分时间都在使用apt-get。它最适合快速简单地安装我们在安装系统时没有安装的软件包,或者在软件包修改或增强时将当前软件包更新到较新的版本。不过其实apt-get还是挺先进的,可以把整个系统更新到新版本。稍后将更详细地讨论apt-get的这些特性。
使用dselect程序
Dselect是一个基于菜单的界面,因此您可以选择我们要安装的软件包。实际上,这个程序是在Debian的安装过程中调用的,这样用户就可以修改包列表来满足自己的要求。这个程序也可以在调整安装后运行选定的列表。
这个程序只是apt-get和dpkg维护的软件包列表内容的一个视图。也就是说,apt-get维护一个软件包源列表,而dpkg维护一个可用软件包列表(由源代码编译)。Dselect程序简单地显示所有可用软件包的列表,指示已经安装的软件包,并允许用户标记可用的软件包以便安装,或者标记已安装的软件包以便删除。可用软件包的菜单还包含关于每个软件包的依赖性的信息,并帮助用户选择软件包来解决依赖性。
当用户做出选择并退出dselect时,apt-get(后面跟着dpkg)将根据用户的选择运行安装和删除实际的软件包。RH和Slackware没有与dselect类似的程序。
使用tasksel程序
Tasksel程序类似于dselect,但它不允许用户选择要安装的软件包,而是允许用户选择任务。在Debian的术语中,任务本质上是软件包的集合。比如X Window系统的XFree86实现,实际上由很多不同的软件包组成,包括核心软件、各种显卡的驱动模块、字体文件等。Debian有一个任务的概念,允许设计一个发行版来分组软件包集合,比如把XFree86放到一个虚拟包中。当用户选择一个任务时,他实际上选择了一个包含几个Debian deb包的集合。
tasksel程序非常简单,他自己使用apt-get,然后使用dpkg来处理组成任务的软件包的安装。但是,dselect、RH和Slackware不提供类似的功能。
到处游荡
在上面的部分中,我们简要讨论了构成Debian软件包管理系统的各种程序所提供的功能。下面几节将会更深入地讨论,并演示Debian软件包管理系统中的一些常见用法。但是每一个程序都是相当复杂的,所以我们需要查看Debian GNU/Linux提供的手册和其他文档进行更详细的讨论。
在下面的问题中,我们将着重从整体上演示使用Debian软件包管理系统的最常用的方法,而不会关注单个程序的机制。现在,我们已经很好地掌握了像dpkg和rpm这样的工具在做什么(解包文件,记录它们在数据库中的安装位置以便以后删除,以及运行脚本)。为了避免重复我们将从手册页中获得的信息,我们将重点关注发布版本,而不仅仅是这些工具。
使用Debian系统维护软件包
即使我们可以通过阅读手册来学习如何使用它们,Debian的包管理工具将提供比我们从手册中立即得到的更强大和灵活的功能。下面的每一节都将关注一个特定的常见任务,并标出该任务的通常过程,这反过来将帮助我们从知道如何运行这些程序过渡到知道何时运行它们。这里很重要的一点是,我们应该记住Debian软件包管理系统有不止一个解决方案。通常,Debian软件包可以在两个级别上管理:dpkg级别,apt-get和dselect级别。这一部分将讨论每一种情况,主要演示包管理的机制,并说明何时以及为什么我们应该使用每一个级别。
使用dpkg
Debian的dpkg工具是包管理系统中最底层的工具。他在单个软件包的级别上操作,并且可以执行经典的软件包命令,例如安装、删除和各种查询。下面的列表列出了dpkg提供的最常见的操作。有关更多详细信息,我们需要参考手册页和其他文档。
命令相应的RPM命令功能
安装一个Debian软件包
Dpkg -r文件名rpm -e文件名删除已安装的软件包
Dpkg -l rpm -qa列出了所有安装的软件包
Dpkg -l package rpm -q package检查是否已经安装了软件包,并打印出完整的名称
Dpkg -L包rpm -ql包列出了软件包安装的文件。
Dpkg -S文件rpm -qf文件标识包含特定文件的已安装软件包。
Dpkg -p package None确定指定的软件是否可以用于安装。
有趣的通用表达式
通用表达式是指类似星号(*)的通配符扩展名,用于匹配特定模式。Debian的dpkg程序和大多数包管理程序一样,在传递的参数中支持通用表达式。例如,要列出名称中带有“libc”的所有已安装软件包,我们可以使用以下命令:
$ dpkg -l *libc
这里的星号类似于Shell中文件名的一般表达式,所以接下来我们会得到一个名称中带有“libc”的软件包列表。这是一件相当方便的事情。
使用apt-get管理包源代码
在我们的Debian系统上使用dpkg程序管理软件包的唯一问题是,这是一项相当辛苦的工作。是的,如果我们想安装一个指定的软件包,我们必须首先找到这个软件包。这将导致CD被插入或装入。如果这个包不在我们第一次检查的CD上,我们需要多次这样做。或者从网站或FTP站点下载该软件包。即使我们所做的只是安装一个在安装过程中忘记选择的软件包,我们也必须使用CD或URL来定位这个软件包。另外,我们还要和这个软件包所依赖的其他软件包作斗争。
鉴于这些情况,Debian GNU/Linux包含了apt-get,它将为我们管理安装介质。因为apt-get维护了一个包含软件包的媒体源列表和一个实际可用的软件包列表,所以我们要做的就是要求apt-get定位并安装我们需要的软件包。下表列出了apt-get最常见的用法。更详细的信息可以查阅相关手册。
功能命令
Apt-get install package从可用软件包列表中查找并安装指定的软件包。
Apt-get remove package卸载指定的软件包及其相关的依赖项。
Apt-get update刷新可用软件包列表(在源列表更新后)
Apt-get upgrade当有新版本可用时,更新我们系统上使用的软件包。
apt的前两个功能——安装和删除软件包——非常简单。只要输入apt-get install foo,apt-get就会在他们的源码列表和可用软件包列表中寻找名为foo的Debian存档文件。如果找到一个,将会安装归档文件,并且所有相关的依赖项都将得到解决。相反,apt-get remove foo会卸载这个包。不过剩下的两个作用就没那么明显了。
更新已安装的软件包。
关于上面列出的apt-get的功能,值得注意的一点是,更新不仅仅在指定的软件包上工作。相反,它是一个全局命令,用可用的更新更新所有软件包。起初,这似乎有一些更严格的限制,因为它将很难更新单个软件包。但是仔细想想,一旦我们自动更新系统本身,就不需要担心个别软件包了,所以这在实践中不是问题。
更新可用软件包列表
上面列表中另一个不明显的命令是update命令。这个命令不同于我们刚刚描述的升级命令。update命令更新可用软件包的列表,但实际上并不更新任何软件包。通常,当我们更新/etc/apt/sources.list文件或FTP或网站更新其可用软件包列表时,我们需要运行apt-get update。一旦apt-get知道已安装的软件包有更新,upgrade命令就可以完成升级。
使用dselect和tasksel管理软件包
有时,也许我们需要一次安装许多软件包,或者我们不确定给定软件包的名称。有时我们甚至不知道满足特定需求的软件包是否存在。Dselect和tasksel工具可以解决这种情况。
使用dselect
Dselect程序是Debian GNU/Linux系统中的第一个包管理程序,因为它是在安装过程中用来选择单个包的工具。Dselect程序只是一个基于菜单的前端程序,集成了我们到现在讨论的所有功能。
管理员可以使用dselect程序浏览所有可用软件包的列表,并可以立即看到哪些软件包已安装,哪些软件包未安装。通过更改选择列表,可以安装或删除许多软件包。在这种情况下,dselect可能比apt-get更方便地管理单个软件包。
使用任务选择
任务只是软件包的列表。例如,XFree86 task包含许多单独的软件包,如库、显卡驱动程序和字体。安装完成后,tasksel程序可用于安装其他任务。
例如,可能一个系统最初被配置为服务器,所以没有安装XFree86。如果该系统将再次用作桌面系统,我们将不得不安装XFree86软件包。当然,这可以用apt-get手动完成,但是会涉及到很多软件包。所以也许使用dselect来选择所有要安装的包更容易,但即使这样我们也必须在包列表中搜索它们。但是如果使用tasksel,那么整个XFree86软件包,也就是XFree86 task,就可以快速轻松的安装了。
配置Debian软件包
包管理系统必须善于安装、升级和卸载文件。它们中的大多数也具有管理配置文件的功能,尽管它们的支持程度不同。例如,RH的RPM系统允许软件包的创建者设计一些文件作为配置文件。以后管理这些文件时,RPM会非常小心地保存它们,并且永远不会覆盖系统管理员定制的文件。然后,Debian系统包含了更多的配置支持。
Debian附带了debconf包。这个软件包是库和一些实用程序的集合,它实现了一个协议,软件包的设计者可以用它来管理他们的软件包配置。协议是控制程序员之间通信的标准。debconf协议允许软件包的创建者以标准的方式向用户提问。Debconf实用程序和用户前端接口收集必要的软件包配置信息,并将其传递给软件包中包含的安装脚本。这个脚本可以做任何必要的事情,比如生成配置文件。
使用debconf软件包的一个例子是X Window系统。XFree86需要很多信息来配置X服务器,使其与用户的硬件配合工作。RH为他的安装写了一个名为Xconfigurator的程序,但是Debian用的是debconf工具。这两个程序有很大的相似之处,至少它们都是基于菜单的用户界面,它们会问类似的问题,生成类似的文件。
使用debconf重新配置软件包
并且用户系统管理员通常需要在安装后重新配置软件包。例如,一个工作站更新了一个新的显卡,需要重新配置XFree86。针对这种情况,debconf提供了两个工具:dpkg-preconfigure和dpkg-reconfigure。还有第三个工具:debconf-show,它将显示一个软件包的当前配置信息。
两个配置命令dpkg-preconfigure和dpkg-reconfigure非常相似。本质上,dpkg-preconfigure是用来在软件包安装之前收集相应的信息,在安装过程中是最重要的。其实大部分用户都不会直接给他打电话。但是,dpkg-reconfigure执行类似的任务,但是可以配置已安装的程序。例如,dpkg-reconfigure xserver-common命令可以在重置显卡后重新配置工作站。类似地,debconf-show xserver-common可以显示XFree86使用的配置变量及其当前值。
配置debconf
debconf程序本身也有一些配置选项。的主要组件是/etc/apt/apt.conf.d目录和/etc/debconf.conf文件。下面我们将分别讨论每个问题。但是,大多数用户不需要经常处理这些文件。而我们只需要知道它们的存在,也许有一天我们会用到它们。
/etc/apt/apt.conf.d目录是apt包管理系统在调用apt工具时作为钩子运行程序。这个目录包含一些文件,这些文件的内容将被包管理工具在其操作中使用。
/etc/debconf.conf文件配置debconf系统本身。这个文件实际上指定了存储配置信息的数据库文件的路径。Debconf系统通过在一个独立于软件包内容的数据库中记录软件包使用debconf与用户交互的问题的答案,来记忆上一个问题的答案。如果某个软件包被删除或重新安装(或只是升级),debconf将从其数据库中检索配置信息,并使用这些值重新运行配置脚本。要覆盖这个操作,我们可以使用dpkg-reconfigure程序。
更新系统
到目前为止,我们已经讨论了许多工具,它们提供了使用Debian软件包管理系统的各种方法。正如我们已经注意到的,总的来说,这个系统和其他系统差不多,虽然Debian的可能是一个更丰富更先进的系统。然而,还有一个我们没有涉及到的便利,这就是Debian通过包管理系统进行更新和升级的能力。
对于大多数发行版来说,升级是一个集中的过程。我们通常必须从软盘或光盘启动,运行特定用途的程序,并从安装介质更新我们的系统。然而,Debian系统的处理方式完全不同。
这里的关键是可用软件包的列表。大多数时候,我们可能会配置我们的系统使用一个相当稳定的源集,但偶尔也会包含一些Bug修复、安全修复等等。在这种情况下,我们可以通过类似下面的方法用新的软件包更新我们的安装:
1如果需要,可以更新/etc/apt/sources.list以反映新媒体。例如,我们可能得到一个包含更新包的CD,需要使用apt-cdrom命令来添加这个新CD。
运行apt-get update命令,使apt-get知道更新的软件包。
3运行apt-get upgrade命令,让apt-get获取并安装可用的更新包。
当我们需要做的只是更新一些软件包时,这样的过程可以很好地工作。不过,其实我们不妨把我们的Debian系统更新到一个新的版本。当我们希望这样做时,这种情况与我们前面讨论的情况没有太大的不同。我们只需要用新版本替换当前安装的软件包。唯一不同的是更新的范围:在一个主要版本的更新中,大量(可能是全部)软件包进行连续的变更,通常是每个软件包的主要变更。
管理如此完整的更新并不容易。大多数发行版只是制作新的光盘,我们必须重启系统来更新它们。但是,对于Debian系统,我们可以通过以下过程来实现:
1更新etc/apt/sources.list,删除对当前发布版本的媒体的所有引用,并添加新的主版本的实体内容。(例如,更新网络安装的URL或添加新本地安装的新CD)
2运行apt-get update以更新可用软件包及其版本的列表。
运行apt-get dist-upgrade来更新发布版本。这个命令会让apt-get进入另一种合适的安装模式,对整个系统更新中会出现的各种复杂依赖进行切片。
4更新完成后,重新启动系统以完成安装过程。
我们可以清楚地看到,整个发行版的更新过程类似于之前处理特定版本的小更新的过程。当然,系统也需要重启(比如我们更新内核的话)。然而,这是一个优雅的过程。
操作Debian软件包档案
我们看过的所有软件包一定都来自某个地方,所以很自然的我们会问这些软件包是怎么被创造出来的。也许有一天我们希望或者需要检查一个Debian软件包的内容,或者从中提取一个特定的文件,或者对它进行非常基础的处理。为了支持这些任务,Debian包含了一个名为dpkg-deb的程序来管理各个Debian包。下表列出了dpkg-deb程序的用法。更详细的内容可以参考相关手册页。
命令类似RPM命令功能
Dpkg-deb -build rpm -ba创建一个新的软件包
Dpkg-deb -info文件名rpm -qpi从软件包中提取一般信息。
Dpkg-deb-contents文件名rpm-qpl显示软件包的内容
如上表所示,dpkg-deb的功能或多或少类似于RPM。然而,实际创建归档文件时的操作本质上是不同的。实际上,RPM包是由包含在。spec文件,它包含从一个源包创建一个二进制RPM包所需的所有信息。
相反,Debian的软件包是由dpkg-deb -build命令组织的,该命令通过收集当前目录的内容并处理DEBIAN目录中的名称控件名称来创建软件包。事实上,Debian创建软件包的方法更类似于Slackware,而不是RH。
管理源代码
有些读者也会想知道Debian是否支持源码软件包,就像RH的RPM支持src.rpm文件一样。答案是肯定的。因为debian的软件包是为了简单地将内容存档在一个特定的目录中而创建的,所以创建一个包含源代码的Deb是一件非常简单的事情。但是并没有所谓的Debian源码软件包的概念。Debian软件包的源代码以标准tar包的形式发布,其中包含了为Debian GNU/Linux构建软件包所必需的源代码和补丁。
安装非Debian软件包
前面提到过,可能我们找到的某个特定程序的包是RPM包格式而不是Debian包格式。所以Debian用户经常处于一个恼人的情况,然而,他们想安装一个二进制软件包,它是以非Debian格式分发的。
为了解决这个问题,Debian GNU/Linux包含了一个不同的程序。这是一个可以在不同打包格式之间转换的工具。例如,他允许debian用户将RPM文件转换成Debian Deb文件。然后用户就可以在自己的Debian系统上安装这个包了(当然这里假设他满足包之间的依赖关系)。但由于每个软件包的格式都有一个自记规则,所以有些软件包无法正确处理。这不是一个完美的解决方案,但确实很有帮助。
机制和用户界面
正如我们到目前为止所注意到的,Debian的软件包管理系统与RH或Slackware有本质的不同。但是RH或者Slackware已经或多或少的自动处理了软件包的实际安装过程,Debian system却把它带到了另一个层面。
最好的证明方法是比较Debian GNU/Linux和RH的安装过程。在安装RH的过程中,用户从一组安装类中进行选择,如服务器、工作站或桌面。这些选项是为所选安装类别定制的安装包列表模板。用户可以在安装后进行修改,但当时是从光盘或网络上定位或获取某个软件包,手动安装。
Debian GNU/Linux采用了类似的方法,但并不完全相同。Debian的安装程序只安装最简单的一套软件包,只能启动系统。然后,将提示用户使用dselect程序从一个可用软件包列表中构建一个要安装的软件包列表。在任何时候,只有可用软件包列表的子集安装在系统上。这种方法还使得在有缺陷修复时更容易更新系统,或者更新到新版本。这个过程很自然。
当然,所有这些灵活性都是有代价的,那就是复杂性。一些人喜欢apt-get和它的便利,而另一些人认为RPM是最好的打包格式。当然,其他人遵循KISS的哲学(保持简单,愚蠢),喜欢Slackware的机制。每个系统都有自己不同的拥护者,尽管它们有许多重叠的功能。当然,最后每个用户都会选择自己认为最好的。