Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189730
  • 博文数量: 8
  • 博客积分: 1605
  • 博客等级: 上尉
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-05 10:28
文章分类

全部博文(8)

文章存档

2012年(1)

2011年(1)

2009年(1)

2008年(5)

分类: LINUX

2009-09-06 09:49:30

Debian 的软件包管理系统介绍



以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 发行版中, 比较著名的软件包管理系统有(此处为泛泛而谈,并不严谨):

  • RPM: Red Hat/Fedora, Suse, Mandriva 使用的是这类管理系统.
  • DEB: Debian 使用的是这类管理系统.
  • TGZ: SlackWare 使用的是这类管理系统.

各种软件包管理系统见得比较, 参阅: .

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软件包命名遵循下列约定: _<版本号>-.deb

6. 软件包的优先级

每个Debian软件包均被发布者指点了一个优先级,作为软件包管理系统的一个辅助参数,Debian策略定义了五种优先级:

  • required(必需)

系统正常运行所必需的软件包。这些软件包不能被移除,否则系统可能会崩溃, 一个只包含必需软件包的系统也许无法正常使用,但是它为系统管理员启动系统安装其它软件提供足够的功能.

  • important(重要)

任何在类Unix系统都会有的程序被划定为重要软件包,此类包构成基本系统. 这类包会影响其它软件包的运行.

  • standard(标准)

这些软件包为用户提供了一个体积小而功能相对较全的系统。该级别的软件包(以及上面两个级别的软件包)组成了Debian的最小化安装。不包括大型应用软件

  • optional(可选)

软件包包含了所有的你想要安装的文件, 即使对它们并不熟悉. 包括X窗口、完整的TeX发布版以及许多应用程序。注意可选软件包彼此间不应存在冲突。这包括 X11, 所有的 TeX 和许多应用程序.

  • extra(附加)

该级别软件包可能与其它高级别软件包冲突,仅当你知道其用途时才会使用它们,或者有运行它们有专门要求,这些都使它们不适合定为"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-binary

这是Debian软件包的神奇所在。它包含所使用软件包格式的版本号

$ cat debian-binary

2.0

  • control.tar.gz

这是包含了软件包管理工具所需信息的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

  • data.tar.gz

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软件包格式明确指定如下控制文件, 除了第一个以外其余的都是可选的:

  • contral

这个文件提供软件包的关联信息, 用于软件包管理器显示软件包的信息,以及用于安装前校验的依赖关系.这是唯一一个必需提供的文件。

$ apt-cache show nano-tiny 看到的就是这部分的内容

  • preinst

preinst脚本在安装或升级软件包以前执行。如果升级失败,老版本的preinst文件将会重作作为升级一部分的任何配置。

  • postinst

postinst脚本在解包之后,作为配置过程的一部分运行。

  • prerm

prerm脚本在软件包卸载以前执行。如果是软件包升级,老版的软件包的prerm脚本也会执行。

  • postrm

postrm脚本在软件包从系统中卸载以后执行。dpkg告知这个脚本软件包是否已被卸载或清除。当因为冲突或升级,软件包被其它软件包卸载时也会执行这个脚本。

  • md5sums

在这个文件中提供软件包要安装的所有文件的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前端程序。

是最早的Linux发行版之一。它能引起公众注意就因为它让安装与卸载软件非常简单。在其他发行版还陷在依赖性的泥潭里时,Debian用户因为有更好的包管理系统而免受这些困扰。
所有基于Debian的发行都使用这个包管理系统。Deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。这里要介绍的就是如何使用安装包处理软件来达到我们的目的。
用apt-get的第一步就是引入必需 的软件库,Debian的软件库也就是所有Debian软件包的集合,它们存在互联网上的一些公共站点上。把它们的地址加入,apt-get就能搜索到我 们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件,其格式如下:
deb [web或ftp地址] [发行版名字][main/contrib/non-free]
比如Ubuntu是一个基于Debian的发行,它的Sources.list可以是这样的:
deb breezy main restrcted
你可以自己加上自己的地址。apt-get.org 上面有一些不错的地址列表。
设好地址之后,就要把本机上的软件库跟网上的库同步(只是软件描述信息,不包含软件本身)。这样,本机上就有了一个可用的软件的清单,命令如下:
# apt-get update
运行成功之后,你就可以搜到在你的发行版中有哪些软件了,命令是apt-cache,运行这个命令是在本机是检索,而不连到网上。如:
# apt-cache search baseutils
这个命令可以列出baseutils这个软件包的情况,有还是没有,还有版本等。
看到库里有这个软件包后,就可以安装它:
# apt-get install baseutils
这时我们就可以看到apt-get的威 力了。如果baseutils依赖于某个另外的软件,或者一个运行库xyz.0.01.so,apt-get 会自动下载这个包(或含有这个库的软件包)。这叫做自动依赖性处理。通常,如果你只用Debian软件库内的软件,是不会发生找不到包或包版本不对的情况 的,除非用的是正在开发的Testing或Unstable版本。
卸载软件:
# apt-get remove baseutils
如果想看一下库里有多少软件:
# apt-cache stats
Total package names : 22502 (900k)
Normal packages: 17632
Pure virtual packages: 281

Single virtual packages: 1048
Mixed virtual packages: 172
Missing: 3369
...

把本机所有软件升级到最新版:
# apt-get upgrade
最后是最强力的--把整个发行版都升到新版本:
# apt-get dist-upgrade
升级时注意那些影响系统起动的东西,比如升级了内核,升级了grub或lilo等,这之后你应当重新运行grub或是lilo,让它们指向正确的位置,否则升级之后会工作不正常的。
用apt-get安装软件时,它会从网上(在sources.list里指的那个站点)下载所用的软件包,这个包将存在本机上,目录是:/var/cache/apt/archives/。时间长了,这里会变得非常巨大,占用大量的硬盘空间。要想清理这个目录,可以运行:
# apt-get clean
还有一个自动清理功能,它只清除那些没用的或者是不完整的软件包:
# apt-get autoclean
这样在重装某软件时就依然能使用已经下载好的,而不是再到网上去下载。
dpkg - 底层一些的包管理工具
用上apt(高级包管理工具)之后,一般是不需要处理单个的deb文件的。如果需要,就要用dpkg命令。比如想自己装gedit:
# dpkg -i gedit-2.12.1.deb
卸载:
# dpkg -r gedit
这里只写名字即可。还可以加上--purge(-P)标志:
# dpkg -P gedit
这会连同gedit的配置文件一起删除,只用-r的话是不删除配置文件的。
如果不想安装一个deb包,但想看一下它里面有什么文件:
# dpkg -c gedit-2.12.1.deb
如果想多看点信息:
# dpkg -I gedit-2.12.1.deb
也可以用通配符来列出机器上的软件:
# dpkg -l gcc*
这会列出所有gcc开头的软件包:
Desired=Unknown/Install/Remove/Purge/Hold
Status=Not/Installed/Config-files/Unpacked/Failed-config/.

/ Err?=(none)/Hold/Reinst-required/X=both-problems
/ Name Version Description
+++-===============-==============-========================
ii gcc 4.0.1-3 The GNU C compiler
ii gcc-3.3-base 3.3.6-8ubuntu1 The GNU Compiler Colletio
un gcc-3.5 none (no description available)

其中,第1个 i 表示希望安装,第2个 i 表示已经安装,第3个字段是问题(如果有)(这3个字的含义可以看上面那3行,desired, status, err),后面是名字,版本和描述。un就表示,Unknown, not-installed。
如果想看某包是否已经安装:
# dpkg -s gedit
如果想看某软件都有哪些文件,都装到了什么地方:
# dpkg -L gedit
如果只想看其中的某些文件,就加上Grep:
# dpkg -L gedit grep png
当然还有aptitude和Aptitude,前者是终端上运行的带菜单的工具,后者是X窗口上运行的图形化的程序。
还有,列出某包的详情:apt-cache show gedit
一些强制的命令:dpkg --force-help






Debian软件包管理系统会自动管理软件的依赖关系,使我们在安装软件时方便了很多,不用理会复杂的软件依赖关系,这也是Debian发行版的一大特色。但了解软件包的依赖关系对你熟悉Linux和进行系统开发是很有好处的,所以 Debian也提供了工具帮我们生成软件包的依赖关系图。操作步骤如下,首先,安装相关的工具:
  apt-get install apt-rdepends springgraph

  用以下命令生成软件包的依赖关系图:

  apt-rdepends -d anjuta | springgraph > anjuta.png

  这样就生成了anjuta软件包的依赖关系图anjuta.png
阅读(6716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~