热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

THEDEBIANWAY:Debian维护工具之Dpkg

THEDEBIANWAY:Debian维护工具之Dpkg--Linux发行版技术-Debian信息,下面是详情阅读。
本文的对Debian GNU/Linux 的Dpkg工具做了较为详细的描述, 希望Linux用户对于Debian 有个较为深刻的了解.
1. 声明

* 版本信息:

本文档的最新版本将张贴于: LinuxSir.Org论坛 Debian发行版讨论区 ;

也可以从 http://debian.linuxsir.org/ 获取.
* 反馈:

所有评论, 错误报告, 其他信息以及批评, 请邮寄到 etony@tom.com ;

或在LinuxSir.Org论坛 Debian发行版讨论区 张贴.
* 版权信息:

本文档的版权(c)2006-2007 归 etony C.F.AN 所有.

转载请注明源自 http://debian.linuxsir.org/ .

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

* 软件包名称(Package Name):
* 版本(Version Number):
* 修订号(Build Number):
* 平台(Architecture):
o i386
o all: 平台无关. 即适用于所有平台.比如文本, 网页, 图片, 媒体, pdf 等.

例如

* nano_1.3.10-2_i386.deb
o 软件包名称: nano
o 版本: 1.3.10
o 修订号: 2
o 平台: i386

4. 软件包处理

(注:本文的中的操作以nano为例)

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

* 列出软件包的内容:

tony@tony:~/doc/dpkg$ dpkg-deb -c nano_1.3.10-2_i386.deb |more
drwxr-xr-x root/root 0 2006-02-05 00:29:18 ./
drwxr-xr-x root/root 0 2006-02-05 00:29:07 ./etc/
-rw-r--r-- root/root 11887 2006-02-05 00:29:07 ./etc/nanorc
drwxr-xr-x root/root 0 2006-02-05 00:29:14 ./usr/
drwxr-xr-x root/root 0 2006-02-05 00:29:12 ./usr/share/
drwxr-xr-x root/root 0 2006-02-05 00:29:01 ./usr/share/doc/
drwxr-xr-x root/root 0 2006-02-05 00:29:15 ./usr/share/doc/nano/
-rw-r--r-- root/root 1847 2005-08-30 02:29:02 ./usr/share/doc/nano/AUTHORS
-rw-r--r-- root/root 2338 2005-03-20 05:33:13 ./usr/share/doc/nano/README
-rw-r--r-- root/root 3175 2005-11-21 17:36:11 ./usr/share/doc/nano/THANKS
-rw-r--r-- root/root 2206 2005-06-08 10:28:06 ./usr/share/doc/nano/TODO
-rw-r--r-- root/root 1066 2003-03-24 21:09:26 ./usr/share/doc/nano/UPGRADE
-rw-r--r-- root/root 35996 2005-11-22 05:45:07 ./usr/share/doc/nano/faq.html
... ...

* 查看软件包的信息

tony@tony:~/doc/dpkg$ dpkg-deb -I nano_1.3.10-2_i386.deb
new debian package, version 2.0.
size 477372 bytes: control archive= 2656 bytes.
12 bytes, 1 lines conffiles
714 bytes, 18 lines control
3529 bytes, 51 lines md5sums
613 bytes, 21 lines * postinst #!/bin/sh
160 bytes, 5 lines * postrm #!/bin/sh
379 bytes, 20 lines * preinst #!/bin/sh
288 bytes, 14 lines * prerm #!/bin/sh
Package: nano
Version: 1.3.10-2
Section: editors
Priority: important
Architecture: i386
Depends: libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)
Suggests: spell
Conflicts: nano-tiny (<= 1.0.0-1), pico
Replaces: pico
Provides: editor
Installed-Size: 1108
Maintainer: Jordi Mallach
Description: free Pico clone with some new features
GNU nano is a free replacement for Pico, the default Pine editor. Pine is
copyrighted under a restrictive licence, that makes it unsuitable for
Debian's main section. GNU nano is an effort to provide a Pico-like
editor, but also includes some features that were missing in the original,
such as 'search and replace', 'goto line' or internationalization support.

* 重新构建软件包

比如nano(1.3.10)需要满足以下依赖关系:

$ dpkg-deb -f nano_1.3.10-2_i386.deb depends //depends 为对应查询段

libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)

当系统不能满足依赖关系, 比如不能满足里来版本, 可以通过下边的方法处理, 当然这种情况下安装的nano并不一定运行正常, 这种方法可以应用于某些软件的变通安装.

$ mkdir nano //创建nano目录

$ dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN //解压控制文件

$ dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano //解压程序文件

$ vi ./nano/DEBIAN/control //修改控制信息

$ dpkg-deb -b nano nano_1.3.10-2_ill.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
... ...

每条记录对应一个软件包, 注意每条记录的第一, 二, 三个字符. 这就是软件包的状态标识, 后边依此是软件包名称, 版本号, 和简单描述.

* 第一字符为期望值,它包括:
o u 状态未知,这意味着软件包未安装,并且用户也未发出安装请求.
o i 用户请求安装软件包.
o r 用户请求卸载软件包.
o p 用户请求清除软件包.
o h 用户请求保持软件包版本锁定.
* 第二列,是软件包的当前状态.此列包括软件包的六种状态.
o n 软件包未安装.
o i 软件包安装并完成配置.
o c 软件包以前安装过,现在删除了,但是它的配置文件还留在系统中.
o u 软件包被解包,但还未配置.
o f 试图配置软件包,但是失败了.
o h 软件包安装,但是但是没有成功.
* 第三列标识错误状态,可以总结为四种状态. 第一种状态标识没有问题,为空. 其它三种符号则标识相应问题.
o h 软件包被强制保持,因为有其它软件包依赖需求,无法升级.
o r 软件包被破坏,可能需要重新安装才能正常使用(包括删除).
o x 软包件被破坏,并且被强制保持.

也可以以统配符模式进行模糊查询, 比如我要查找以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 数据库查询.

应用范例:

* 查询系统中属于nano的文件:

$ dpkg --listfiles nano

or

$ dpkg-query -L nano

* 查看软件nano的详细信息:

$ dpkg -s nano

or

$ dpkg-query -s nano

* 查看系统中软件包状态, 支持模糊查询:

$ dpkg -l

or

$dpkg-query -l

* 查看某个文件的归属包:

$ dpkg-query -S nano

or

$ dpkg -S nano

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
* dpkg --configure

解包

运行

#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 包, 但是未经配置.

解包可能包括一下步骤:

* 将控制文件解压到临时目录.
* 运行 preinst(如果有的话). 通常为停止相关服务.
* 解压配置文件到 /etc 目录, 并添加.dpkg-new 后缀, 以防止冲突.
* 解压 data.tar.gz 到系统根目录,(--root=dir).
* 将控制文件解压到 /var/lib/dpkg/info 目录并添加软件名前缀. 对数据库进行更新.
* 数据库中将软件包的状态设置为"unpacked".

仅仅解包, 并不能确保软件可以正常运行.

配置

#dpkg --configure nano

$ dpkg -l nano
ii nano 1.3.10-2 free Pico clone with some new features

如输出所示, nano 已经正常安装.

软件解包后, 还需要对其进行调整, 比如根据实际情况对配置文件进行修改. 这一步通常是在安装过程中自动进行的, 当然可以手动调用, 这次用到的是软件名, 而不是deb文件名.

通过命令 dpkg -L nano 可以得以验证

这一过程可能包括一下步骤:

* 询问对配置文件的处理方法, 覆盖当前版本, 还是不做处理.(当软件升级时会碰到这种情况)
* 运行 postinst 脚本
* 将软件包标记为 "installed"

如果想再次修改配置选项, 可以运行:

#dpkg-reconfigure nano

7. 软件卸载

在Debian中卸载和清除软件包是两个不同的概念. 不同之处在于软件包被删除(卸载)后,它的配置文件仍会留在系统中,只有清除时才会删除它们. 默认情况下, Debian 仅会做删除操作, 除非你明确指出, 才会将配置文件删除. 如果要清除软件包, 则在清除前将会隐含地执行删除操作.

要删除一个软件包,dpkg需要使用--remove选项将软件包卸载.与安装不同,删除只需要软件包名,而不是实际的deb文件名.

删除

#dpkg -r nano

* 首先运行 prerm 脚本(如果有的话).
* 然后, 保留配置文件, 其他文件全部删除.
* 删除 /var/lib/dpkg/info 目录下软件包的所有配置文件, 保留postrm和list文件.
* 最后, dpkg 在数据库中将软件状态修改为删除.

运行

$dpkg -l nano

rc nano 1.3.10-2 free Pico clone with some new features

清除

#dpkg -P nano

* 删除所有的文件. 所有的文件都被解除了(从系统中删除了).
* 运行postrm脚本.如果还存在,运行postrm脚本.
* 删除 postrm 和 list 文件.保留的两个文件,从系统中解除postfix.postrm和postfix.files.
* 在dpkg的数据库中将软件包标记为未安装

$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

* 列出系统中安装的软件包
o rpm -qa
o dpkg --list
* 列出软件包信息
o rpm -qi pkgname
o dpkg --status pkgname
* 列出一个包所安装的文件
o rpm -ql pkgname
o dpkg --listfiles pkgname
* 列出本地包文件的信息
o rpm -qpi file.rpm
o dpkg --info file.deb
* 列出本地包文件所含文件
o rpm -qpl file.rpm
o dpkg --contents file.deb
* 安装本地包
o rpm -i file.rpm
o dpkg --install file.deb
* 从系统中清除包
o rpm -E pkgname
o dpkg --purge pkgname
* 查询文件归属
o rpm -qf file
o dpkg --search file

10. 参考文献

* Debian参考手册
* Debian常见文件解答
* APT and Dpkg 快速参考表; 也可从 apt-dpkg-ref_5_all.deb 包中获取.
* dpkg vs rpm
* Debian GNU/Linux Anwenderhandbuch
* pkg 软件维护工具工具
推荐阅读
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
  • 如何将CentOS8转换为CentOSStream
    CentOS Stream是一个持续交付的Linux发行版,它在RHEL之前处于领先地位。它将具有滚动发布,即不断进行更改。CentOS将成为一个上游版本,它将具有测试补丁和更新。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 本文讲述了孙悟空写给白骨精的信件引发的思考和反省。孙悟空在信中对自己的行为进行了反思,认识到自己胡闹的行为并没有给他带来实际的收获。他也揭示了西天取经的真相,认为这是玉皇、菩萨设下的一场陷阱。他还提到了师傅的虚伪和对自己的实心话,以及自己作为师傅准备提拔的对象而被派下来锻炼的经历。他认为路上的九九八十一难也都是菩萨算计好的,唐僧并没有真正的危险。最后,他提到了观音菩萨在关键时刻的指导。这封信件引发了孙悟空对自己行为的思考和反省,对西天取经的目的和自己的角色有了更深入的认识。 ... [详细]
  • Windows2003 IIS上设置301定向,实现不带www域名跳转带www域名的方法
    打开IIS,建一个网站,主机头用不带www的域名,随便指向一个目录。然后在这个网站上点右键,属性--主目录--重定向到URL如图ÿ ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
author-avatar
dushearer304
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有