Chinaunix

标题: Debian 维护工具之 Dpkg [打印本页]

作者: hellwolf    时间: 2006-03-27 10:28
标题: Debian 维护工具之 Dpkg
1. 声明

2. dpkg 概述
在其 manpage 中, 这样描述:
dpkg - a medium-level package manager for Debian.
dpkg - Debian 的中级软件包管理器.
dpkg 是 Debian 软件包管理系统的中流砥柱, 负责安装卸载软件包, 配置, 以及维护已安装的软件包. 也是Debian系统中众多软件包管理工具的后端. 有关 dpkg 的更多介绍请参阅:
http://www.dpkg.org
dpkg 通过数据库来维护系统中软件, 这包括文件清单, 依赖关系, 软件状态, 等等详细的内容, 通常在/var/lib/dpkg目录下. 并确保系统与数据库的情况相一致.因此,dpkg在处理程序时非常健壮,和优秀.
dpkg 在处理软件包时, 首先要判断是否会引起系统的混乱, 当发现可能出现时, dpkg 将拒绝安装此软件, 而不是自作主张将软件装入系统, 然后把烂摊子扔给用户了之.
dpkg是一个庞大的家族, 不仅提供了大量的参数选项, 同时也提供了许多子命令比如:
dpkg-deb
dpkg-divert
dpkg-query
dpkg-split
dpkg-statoverride
start-stop-daemon
...
本文档不是 dpkg 的 manpage, 将不会对所有的参数和子命令加以介绍, 同时记住所有参数也是相当痛苦的事情, 在这里只对常用参数和命令做示例性介绍.
dpkg 涵盖了 dpkg 家族的大部分功能, 因此dpkg可以作为一个多合一(ALL-IN-ONE)的软件使用,以更好的使用 dpkg 家族的全部功能.
3. deb软件包命名规则:
Debian软件包命名遵循下列约定: _-_.deb

例如

4. 软件包处理
(注:本文的中的操作以nano为例)
dpkg-deb  : 用于处理本地Debian软件包. 可以提取从.deb文件中提取软件包信息和数据. 详细信息,请参阅 dpkg-deb 的联机手册.

5. 数据库查询
当前版本的 dpkg 使用文本文件来作为数据库.通称在 /var/lib/dpkg 目录下.
通称在 status 文件中存储软件状态,和控制信息. 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码.
体验使用数据库的时刻到了:
$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name       Version           Description
+++-===========-================-========================================
ii  aalib1     1.4p5-28          ascii art library - transitional package
ii  adduser    3.85              Add and remove users and groups
ii  alien      .63               install non-native packages with dpkg
... ...
每条记录对应一个软件包, 注意每条记录的第一, 二, 三个字符. 这就是软件包的状态标识, 后边依此是软件包名称, 版本号, 和简单描述.

也可以以统配符模式进行模糊查询, 比如我要查找以nano字符开始的所有软件包:
$ dpkg -l nano*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  nano           1.3.10-2       free Pico clone with some new features
pn  nano-tiny               (no description available)
un  nanoblogger             (no description available)
以上状态说明: 系统中安装了 nano 版本为 1.3.10-2;安装过 nano-tiny, 后来又清除了; 从未安装过nanoblogger.
如果觉得 dpkg 的参数过多, 不利于记忆的话, 完全可以使用 dpkg-query 进行 dpkg 数据库查询.
应用范例:

6. 安装软件包
运行下面的命令:
$dpkg -l nano
un  nano              (no description available)
     
当前 nano 的状态说明在系统中从未安装过 nano 软件包, 可以通过以下命令安装本地的 nano 包:
$dpkg-deb -e ./nano_1.3.10-2_i386.deb
当使用 dpkg 安装软件包时, 主要分为两个阶段: 首先解包; 然后运行postinst控制脚本(如果有的话),这就是所谓的配置阶段. 当完成软件包当解包后, dpkg 的--intall选项自动调用配置阶段. 注意, 操作时应当指定 .deb 文件的实际路径, 仅仅给出文件名无法找到对应文件.
这样, 软件的安装就可被拆分为两个对立的过程:

解包
运行
#dpkg --unpack nano_1.3.10-2_i386.deb

然后
$ dpkg -l nano
iU  nano           1.3.10-2       free Pico clone with some new features
说明此时系统中安装了nano 包, 但是未经配置.
解包可能包括一下步骤:

仅仅解包, 并不能确保软件可以正常运行.
配置
#dpkg --configure nano

$ dpkg -l nano
ii  nano           1.3.10-2       free Pico clone with some new features
如输出所示, nano 已经正常安装.
软件解包后, 还需要对其进行调整, 比如根据实际情况对配置文件进行修改. 这一步通常是在安装过程中自动进行的, 当然可以手动调用, 这次用到的是软件名, 而不是deb文件名.
通过命令 dpkg -L nano 可以得以验证
这一过程可能包括一下步骤:

如果想再次修改配置选项, 可以运行:
#dpkg-reconfigure nano
7. 软件卸载
在Debian中卸载和清除软件包是两个不同的概念.
不同之处在于软件包被删除(卸载)后,它的配置文件仍会留在系统中,只有清除时才会删除它们. 默认情况下, Debian 仅会做删除操作,
除非你明确指出, 才会将配置文件删除. 如果要清除软件包, 则在清除前将会隐含地执行删除操作.
要删除一个软件包,dpkg需要使用--remove选项将软件包卸载.与安装不同,删除只需要软件包名,而不是实际的deb文件名.
删除
#dpkg -r nano

运行
$dpkg -l nano
rc  nano    1.3.10-2     free Pico clone with some new features
清除
#dpkg -P nano

$dpkg -l nano
pn  nano                                          (no description available)
     
注意输出的状态: pn 这意味着软件包实际上是被清除了,但是在数据库中还有这个软件包的记录.因此,pn 明确指出以前安装过 nano, 在软件包数据库中出现过,并且现在已被完全清除.
8. 异常处理
有时,因为不能满足依赖关系, 或存在冲突, 文件会被覆盖, 或控制脚本中存在错误而安装失败. 在 stable 发行版中从不会存在这类问题(这被视为重大错误). 但是, 在运行 unstable 发行版的系统中,有时却是难免的.
处理文件冲突
dpkg 不会允许一个软件包覆盖属于其它软件包的文件.可以强制dpkg覆盖属于其它软件包的软件(使用 --force-overwrite), 但是这样做十分危险. 如果这只是暂时的冲突(在 unstable 中, 这种情况常有), 覆盖没有太大问题. 请注意, 遇到这种情况应该向软件包的维护者提交相关错误报告.
如果你使用的是非官方包, 或是通过 alien 或 checkinstall自己构建的软件包, 那么应该对包内文件改名, 或者放弃使用这类软件包.
处理在安装过程中控制脚本脚本出现了问题. 问题脚本是出现问题的另一原因. 如果, 软件包的 postinst 控制文件中有错误,那么就无法用 dpkg 完成对这个软件包的配置.
这种错误一定要作为严重问题向错误跟踪系统提交报告.象这种脚本的问题,自己对其进行调试, 以判断问题所在, 比如您可以简单的在脚本的第一行以后插入 set -x, 对其运行情况进行跟踪.除非必要, 您也应该拒绝使用这类软件包.
处理卸载过程中损坏的控制文件
当软件包的卸载脚本出现问题时.即使您可以强制删除控制脚本没有清除干净的文件,这也会妨碍dpkg正确的维护您的系统,从而有可能在系统中留下垃
圾文件.对于这类问题, 还没有太好的处理方法(强烈建议您提交错误报告), 唯有等待软件更新(或自行对软件包包修复).
然后借助更新包将相关文件卸载.
9. dpkg vs rpm

10. 参考文献

               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8057/showart_91339.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2