分类: LINUX
2009-09-06 09:49:30
以Debian的方式系列(IN THE DEBIAN WAY):
Debian 的软件包管理系统介绍
etony C.F.AN etony@tom.com
v0.0.1, 2006-3-22
本文档是针对 Debian 的软件包管理系统的一般性介绍.
1. 声明
本文档的最新版本将张贴于: LinuxSir.Org论坛 ;
也可以从 获取.
所有评论, 错误报告, 其他信息以及批评, 请邮寄到 ;
或在LinuxSir.Org论坛 张贴.
本文档的版权(c)2006-2007 归 etony C.F.AN 所有.
转载请注明源自 .
2. 我们为什么需要关软件包管理系统?
绝大多数人使用计算机的目的是应用, 没有人愿意每周都要花费大量的时间用于软件安装和排错. 如果那样的话, 一个管理大量计算机的管理员将痛不欲生.
一个优秀的软件包管理系统应当可以简化软件的安装和卸载.在安装时记录在系统中添加的文件和对系统所做的修改, 以便在以后可以将其卸载干净.
一个程序可能需要很多共享库支持, 或在运行时需要调用其它程序来协同完成作业.一个好的软件包管理系统,不仅能完成软件的安装, 还应该可以自动识别软件包的依赖问题, 并自动的给出解决方案,以确保软件,在完成安装后可以很好的运行.
由于程序的不断更新, 软件的平滑升级也需要一个优秀的软件包管理系统提供支持.
3. 有哪些著名的软件包管理系统?
目前在各 Linux 发行版中, 比较著名的软件包管理系统有(此处为泛泛而谈,并不严谨):
各种软件包管理系统见得比较, 参阅: .
4. Debian 软件包管理系统
如 果您接触过 Debian GNU/Linux 操作系统, 或对其有一定了解, 那么您一定会惊讶于 Debian 软件包管理系统的超级牛力(man apt-get). 事实上,问任何人 Debian 最重要的特性是什么,得到的回答十有八九是它的软件包管理系统。
5. Debian 软件包类型
在Debian中存在两种类型的软件包:
源 代码包, 包括一个描述源代码包的 .dsc 文件, 一个包含 gzip-tar 归档压缩格式的未经修改源码的 .orig.tar.gz 文件, 一个包含对源代码作Debian特有修改的 .diff.gz 文件. 可以使用 dpkg-source 打包和解压 debian 源码文档. 详见联机手册.
二 进制包以 .deb 扩展名来表示,这些文件通常称为DEB文件,其中包含可执行文件,文档,配置文件和版权信息及其它一些东西.可以使用 Debian 的 dpkg 工具解包(安装).但除去版权信息(和 changelog.Debian 文件)不讲,二进制包也可以是空的,这种软件包作为过渡包或关联包(也称虚拟包),它们的唯一的作用是用于满足依赖性.
一般而言, 我们只和二进制包打交道, 只有在某些特殊情况下才会求助于源代码包.
软件包命名约定
Debian软件包命名遵循下列约定:
6. 软件包的优先级
每个Debian软件包均被发布者指点了一个优先级,作为软件包管理系统的一个辅助参数,Debian策略定义了五种优先级:
系统正常运行所必需的软件包。这些软件包不能被移除,否则系统可能会崩溃, 一个只包含必需软件包的系统也许无法正常使用,但是它为系统管理员启动系统安装其它软件提供足够的功能.
任何在类Unix系统都会有的程序被划定为重要软件包,此类包构成基本系统. 这类包会影响其它软件包的运行.
这些软件包为用户提供了一个体积小而功能相对较全的系统。该级别的软件包(以及上面两个级别的软件包)组成了Debian的最小化安装。不包括大型应用软件
软件包包含了所有的你想要安装的文件, 即使对它们并不熟悉. 包括X窗口、完整的TeX发布版以及许多应用程序。注意可选软件包彼此间不应存在冲突。这包括 X11, 所有的 TeX 和许多应用程序.
该级别软件包可能与其它高级别软件包冲突,仅当你知道其用途时才会使用它们,或者有运行它们有专门要求,这些都使它们不适合定为"Optional"级。
在Debian系统上, 不同的优先级从两个方面来影响系统.首先,策略规定,任何高优先级的软件包都不能依赖于低优先级的软件包.这也暗示了用户可以将系统限定在某个优先级,如可选优先级,以确保没有安装任何附加级软件包.
在 新版本发布准备阶段,优先级的作用更显得重要.基础系统由必需级和重要级软件包组成,属于这类优先级的软件包首先被冻结,由于这些软件包是其它软件包所依 赖的,它们能保证整个架构的稳定,这是发布Debian新版本所必需的.接下来,标准级软件包被冻结,接着,在发布新版本之前对可选级和附加级软件包进行 冻结.
7. 软件包中都有些什么?
本文档以nano-tiny_1.2.4-5_i386.deb 软件包为例,进行示范.
$ ar -x nano-tiny_1.2.4-5_i386.deb
#apt-get -d install nano-tiny
$ls -l
-rw-r--r--
1 tony tony
1063 Mar 22 20:44 control.tar.gz
-rw-r--r--
1 tony tony 86530 Mar 22 20:44 data.tar.gz
-rw-r--r--
1 tony tony
4 Mar 22 20:44 debian-binary
-rw-r--r--
1 tony tony 87786 Mar 22 20:43 nano-tiny_1.2.4-5_i386.deb
这三个文件涵盖了软件包的所有功能,并且是根据内容拆分的:
这是Debian软件包的神奇所在。它包含所使用软件包格式的版本号
$ cat debian-binary
2.0
这是包含了软件包管理工具所需信息的tarball文件。
$ tar ztvf control.tar.gz
drwxr-xr-x root/root
0 2005-04-10 01:35:23 ./
-rwxr-xr-x root/root
263 2005-04-10 01:35:23 ./postinst
-rwxr-xr-x root/root
111 2005-04-10 01:35:23 ./prerm
-rw-r--r-- root/root
818 2005-04-10 01:35:23 ./control
-rw-r--r-- root/root
404 2005-04-10 01:35:23 ./md5sums
tarball文件data.tar.gz 包括这个Debian软件包的覆盖区,即root文件系统中的位置。用dpkg解包软件包,而不配置就等同于将这个tarball文件解压到/。
$ tar ztvf data.tar.gz
drwxr-xr-x root/root
0 2005-04-10 01:35:22 ./
drwxr-xr-x root/root
0 2005-04-10 01:35:22 ./bin/
-rwxr-xr-x root/root
35128 2005-04-10 01:35:22 ./bin/nano-tiny
drwxr-xr-x root/root
0 2005-04-10 01:35:17 ./usr/
drwxr-xr-x root/root
0 2005-04-10 01:35:21 ./usr/share/
drwxr-xr-x root/root
0 2005-04-10 01:35:21 ./usr/share/doc/
drwxr-xr-x root/root
0 2005-04-10 01:35:22 ./usr/share/doc/nano-tiny/
-rw-r--r-- root/root
501 2005-04-10 01:34:23 ./usr/share/doc/nano-tiny/copyright
-rw-r--r-- root/root
10269 2005-04-10 01:34:23 ./usr/share/doc/nano-tiny/changelog.Debian.gz
-rw-r--r-- root/root
53142 2004-06-28 10:36:22 ./usr/share/doc/nano-tiny/changelog.gz
drwxr-xr-x root/root
0 2005-04-10 01:35:21 ./usr/share/man/
drwxr-xr-x root/root
0 2005-04-10 01:35:22 ./usr/share/man/man1/
-rw-r--r-- root/root
1147 2005-04-10 01:34:23 ./usr/share/man/man1/nano-tiny.1.gz
drwxr-xr-x root/root
0 2005-04-10 01:35:21 ./usr/share/man/fr/
drwxr-xr-x root/root
0 2005-04-10 01:35:22 ./usr/share/man/fr/man1/
-rw-r--r-- root/root
1663 2005-04-10 01:34:23 ./usr/share/man/fr/man1/nano-tiny.1.gz
使 用ar和tar就可获取DEB软件包中的所有文件和数据. 这里选择使用ar和tar,而不仅仅是tar,可能会另您感到好奇,这是因为DEB文件是使用ar打包的,这样可以以节约空间,因为tar会存储每个文件 否认更多相关信息(比如权限,所有者,日期 ...),对于这三个文件这没有什么意义.
查看二进制包
less的预处理程序lesspipe能识别DEB文件,并可提取出有关文件的大多数的重要数据.可以考虑根据您使用的shell, 在启动脚本中设置这一变量。
$eval $(lessfile)
$less nano-tiny_1.2.4-5_i386.deb
在Debian的软件库中,mc软件包中的mc文件导航器,提供了一个用于访问DEB文件,以及查看它们的内容的虚拟文件系统。在mc中,您可以简单的定位您要查看的DEB文件,选中,键入回车。将会在./DEBIAN下找到控制文件,列表则是在./CONTENTS下。
Name
Size
MTime
/..
UP--DIR
/CONTENTS
0 Mar 22 21:01
/DEBIAN
0 Mar 22 21:01
INFO
1157 Mar 22 21:01
*INSTALL
424 Mar 22 21:01
8. 控制文件介绍
一 个Debian二进制包在提供控制信息的同时还包括有效数据(软件和所有的辅助文件). 控制信息包含在被称作控制文件的一系列文件中.这些文件的内容用于控制软件包管理器,存储关联数据,如依赖关系,并提供软件包的一般信息,如所包含软件的 描述等.Debian软件包格式明确指定如下控制文件, 除了第一个以外其余的都是可选的:
这个文件提供软件包的关联信息, 用于软件包管理器显示软件包的信息,以及用于安装前校验的依赖关系.这是唯一一个必需提供的文件。
$ apt-cache show nano-tiny 看到的就是这部分的内容
preinst脚本在安装或升级软件包以前执行。如果升级失败,老版本的preinst文件将会重作作为升级一部分的任何配置。
postinst脚本在解包之后,作为配置过程的一部分运行。
prerm脚本在软件包卸载以前执行。如果是软件包升级,老版的软件包的prerm脚本也会执行。
postrm脚本在软件包从系统中卸载以后执行。dpkg告知这个脚本软件包是否已被卸载或清除。当因为冲突或升级,软件包被其它软件包卸载时也会执行这个脚本。
在这个文件中提供软件包要安装的所有文件的MD5编码,可用于校验已安装的文件。
dpkg-deb可以在安装前从DEB文件中提取软件包的所有重要信息。
$dpkg-deb --control nano-tiny_1.2.4-5_i386.deb
DEBIAN
$ tree
.
|-- DEBIAN
|
|-- control
|
|-- md5sums
|
|-- postinst
|
`-- prerm
`-- nano-tiny_1.2.4-5_i386.deb
$ dpkg-deb --extract nano-tiny_1.2.4-5_i386.deb
./
$ tree
.
|-- bin
|
`-- nano-tiny
|-- nano-tiny_1.2.4-5_i386.deb
`-- usr
`-- share
|-- doc
|
`-- nano-tiny
|
|-- changelog.Debian.gz
|
|-- changelog.gz
|
`-- copyright
`-- man
|-- fr
|
`-- man1
|
`-- nano-tiny.1.gz
`-- man1
`-- nano-tiny.1.gz
9. 参考文档
软件
包管理是区分不同发行版的一大特征,如RedHat使用RPM软件包来管理软件,Debian使用Deb软件包来管理软件。apt-get是Debian
的Deb软件包管理工具,它的最低底层还是调用dpkg包管理程序,通过apt-get工具可使我们很好地解决软件包的依赖关系,方便软件的安装和升级。
它是Debian发行版的最大特色,一定要好好掌握。
要 使用好apt-get就要配置好一个名为sources.list的资源列表,资源列表指向Debian系统的软件库,apt-get会从该软件库安装各 种软件包。sources.list文件位于/etc/apt目录下,下面是Sarge、Etch和Sid三个版本的写法,你可任选一种,最好不要多版本 混用:
#sources.list for Sarge(stable):
deb stable main contrib non-free
deb stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src stable main contrib non-free
#deb-src stable/non-US main contrib non-free
#sources.list for Etch(testing):
deb testing main contrib non-free
deb testing/non-US main contrib non-free
deb http://security.debian.org testing/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src testing main contrib non-free
#deb-src testing/non-US main contrib non-free
#sources.list for Sid(unstable):
deb unstable main contrib non-free
deb unstable/non-US main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src unstable main contrib non-free
#deb-src unstable/non-US main contrib non-free
sources.list文
件的内容决定了Debian的版本。安全更新只存在于stable和testing版中,unstable没有安全更新。进入stable的软件都经过严
格的依赖测试和安全测试,所以如果你想系统稳定,用于工作,最好使用stable,如果你想使用最新版的软件,就使用testing或unstable。
Woody、Sarge和Sid是Debian
3.x三个版本中的代号,我们一般都是以代号来称呼debian不同版本。所有Debian发行版的代号全都取自电影Toy
Story,Woody是那个牛仔,Sarge是绿色塑胶军队的领导,Sid是破坏玩具的小孩。
apt-get update
更 新软件包信息库。在Debian中,软件包是通过一个数据库来管理的,通过这个数据库中可跟踪你系统中已安装、没有安装和现在可安装的软件包信息。 apt-get安装软件包时就是依靠这个数据库来解决软件包间的依赖关系,从而可自动安装相关软件。我们需定期运行该命令,从而保持数据库的信息为最新。
apt-get install package_name1 package_name2 package_name3 …
安 装软件包。如果软件包需其它软件包支持,apt-get会通过搜索软件包数据库找到这种依赖关系,一起下载相关软件。在一个命令行中可同时安装多个软件 包,中间用空格隔开即可。安装的软件包默认会存放在/var/cache/apt/archives目录下,以便以后重新安装。如果已安装的软件包损坏 了,你可通过–reinstall选项来重新安装。如:
# apt-get –reinstall install package_name
在需安装的软件包名后加一个减号会删除软件包,如:apt-get install package_name-。
只是下载软件,不解包和安装使用-d选项,如:
# apt-get -d install package_name
使用–dry-run选项可使apt-get在安装软件包前进行测试,如:
# apt-get install package_name –dry-run
Debian软件包的名字和软件名不同,所以在安装前如不知道软件包的名字,可到Debian的官方软件库查询,网址是:。或者用下面介绍的apt-cache search package_name命令来查询。
apt-get remove package_name1 package_name2 package_name3 …
删除软件包。如果你想删除没用的软件包,只要使用该命令即可。如果你想把该软件的配置文件也删除,可以用–purge选项,如:
# apt-get –purge remove package_name
类似地,在删除软件包名后加一个加号会安装软件包,如:apt-get remove package_name+。
apt-get source package_name1 package_name2 package_name3
下载软件包的的源码版本。
apt-get upgrade package_name1 package_name2 package_name3 …
软 件包升级功能是APT系统这么成功的主要原因。通过该命令,我们就可把软件升级到最版本。在使用该命令前,最好先运行apt-get update命令,以更新软件包数据库。但该方案不是更新系统最好的方法,一些包会因为包依赖问题而保留(kept back)一些旧的软件包。Debian提供了一个更好的升级方案,就是用dis-upgrade。下面一节会详细介绍。
apt-get dist-upgrade
更新整个Debian系统。可从网络或本地更新整个系统。它会重新安排好包的依赖性。如果有些包由于一些原因实在不能更新,我们可通过以下命令查询原因:
# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
用apt-show-versions -u可获得可升级软件包的列表。该命令还有一些有用的选项,可用-h选项查看详细帮助,了解更多功能。
apt-get clean
删除下载了的软件包,当我们通过apt-get安装软件包时,APT会把软件包下载到本地/var/cache/apt/archives/目录。该命令会删除该文件夹内的除锁住外的所有软件包。
apt-get autoclean
删除已下载的旧版本的软件包。该命令类似于上面的命令,但它会有选择地删除旧版本的软件包。
apt-get dselect-upgrade
通过dselect的“建议”和“推荐”功能更新系统。dselect是Debian中一个功能强大的包管理工具。它可帮助用户选择软件包来安装,其中一个有用功能是它会建议和推荐安装其它相关软件包。我们可在APT中使用它这个功能。
apt-get check
检查系统中已安装软件包的依赖性。
apt-get是命令行方式的dpkg前台程序,不喜欢命令行方式的朋友也可以试试aptitude和synaptic这两个软件包。aptitude是一个字符界面的dpkg前端程序,synaptic是一个GTK界面的dpkg前端程序。