1, 简介
dpkg - package manager for Debian (debian 系统的包管理工具).
dpkg is a tool to install, build, remove and manage Debian packages,dpkg 是 Debian 的一个底层包管理工具, 主要用于对已下载到本地和已安装的软件包进行管理.
dpkg 这个机制最早由 Debian Linux 社区所开发出来的, 通过 dpkg 的机制, Debian 提供的软件就能够简单的安装起来, 同时能提供安装后的软件信息, 实在非常不错. 只要派生于 Debian 的其它 Linux distributions 大多使用 dpkg 这个机制来管理, 包括 B2D,Ubuntu 等.
2,deb 软件包名规则
格式为: Package_Version-Build_Architecture.deb
如: nano_1.3.10-2_i386.deb
* 软件包名称 (Package Name): nano
* 版本 (Version Number):1.3.10
* 修订号 (Build Number):2
* 平台 (Architecture):i386
3,dpkg 软件包相关文件介绍
/etc/dpkg/dpkg.cfg dpkg 包管理软件的配置文件 [Configuration file with default options]
/var/log/dpkg.log dpkg 包管理软件的日志文件 [Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)]
/var/lib/dpkg/available 存放系统所有安装过的软件包信息 [List of available packages.]
/var/lib/dpkg/status 存放系统现在所有安装软件的状态信息
/var/lib/dpkg/info 记安装软件包控制目录的控制信息文件
4,dpkg 数据库
dpkg 使用文本文件作为数据库来维护系统中软件, 包括文件清单, 依赖关系, 软件状态, 等等详细的内容, 通常在 /var/lib/dpkg 目录下. 通常在 status 文件中存储软件状态和控制信息. 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码.
例: 查询 dpkg 数据库 (显示所有已安装的 Deb 包).
[email protected]:~$ dpkg -l
期望状态 = 未知 (u)/ 安装 (i)/ 删除 (r)/ 清除 (p)/ 保持 (h)
| 状态 = 未安装 (n)/ 已安装 (i)/ 仅存配置 (c)/ 仅解压缩 (U)/ 配置失败 (F)/ 不完全安装 (H)/ 触发器等待 (W)/ 触发器未决 (T)
|/ 错误?=(无)/ 须重装 (R) (状态, 错误: 大写 = 故障)
||/ 名称 版本 体系结构: 描述
- +++-==============-============-============-=================================
- ii a11y-profile-m 0.1.10-0ubun amd64 Accessibility Profile Manager - U
- ii account-plugin 0.12+16.04.2 all GNOME Control Center account plug
- ii account-plugin 0.12+16.04.2 all GNOME Control Center account plug
- ii account-plugin 0.12+16.04.2 all GNOME Control Center account plug
- ii accountsservic 0.6.40-2ubun amd64 query and manipulate user account
- ii acl 2.2.52-3 amd64 Access control list utilities
- ii acpi-support 0.142 amd64 scripts for handling many ACPI ev
- ii acpid 1:2.0.26-1ub amd64 Advanced Configuration and Power
- ii activity-log-m 0.9.7-0ubunt amd64 blacklist configuration user inte
- ii adduser 3.113+nmu3ub all add and remove users and groups
- ii adium-theme-ub 0.3.4-0ubunt all Adium message style for Ubuntu
- ii gir1.2-pango-1 1.38.1-1 amd64 ..............................
- ..............................................................................
如上图, 每条记录对应一个软件包, 注意每条记录的第一, 二, 三个字符, 这就是软件包的状态标识, 后边依此是软件包名称, 版本号和简单描述.
1) 第一字符为期望值 (Desired=Unknown/Install/Remove/Purge/Hold), 它包括:
u Unknown 状态未知, 这意味着软件包未安装, 并且用户也未发出安装请求.
i Install 用户请求安装软件包.
r Remove 用户请求卸载软件包.
p Purge 用户请求清除软件包.
h Hold 用户请求保持软件包版本锁定.
2) 第二列, 是软件包的当前状态 (Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)
n Not 软件包未安装.
i Inst 软件包安装并完成配置.
c Conf-files 软件包以前安装过, 现在删除了, 但是它的配置文件还留在系统中.
u Unpacked 软件包被解包, 但还未配置.
f halF-conf 试图配置软件包, 但是失败了.
h Half-inst 软件包安装, 但是但是没有成功.
w trig-aWait 触发器等待
t Trig-pend 触发器未决
3) 第三列标识错误状态, 第一种状态标识没有问题, 为空. 其它符号则标识相应问题 (Err?=(none)/Reinst-required (Status,Err: uppercase=bad))
h 软件包被强制保持, 因为有其它软件包依赖需求, 无法升级.
r Reinst-required, 软件包被破坏, 可能需要重新安装才能正常使用 (包括删除).
x 软包件被破坏, 并且被强制保持.
案例说明:
ii -- 表示系统正常安装了该软件
pn -- 表示安装了该软件, 后来又清除了
un -- 表示从未安装过该软件
iu -- 表示安装了该软件, 但是未配置
rc -- 该软件已被删除, 但配置文件仍在
5,dpkg 子命令
为了方便用户使用, dpkg 不仅提供了大量的参数选项, 同时也提供了许多子命令.
比如:
dpkg-deb,dpkg-divert,dpkg-query,dpkg-split,dpkg-statoverride,start-stop-daemon
这里将不会对 dpkg 的命令作详细说明, 如需了解可自行查阅资料.
三, dpkg 使用手册
1, 安装
1) 安装相关命令
- dpkg -i package-name.deb // --install, 安装软件包, 必须是 deb 包的完整名称.(软件的安装可被拆分为两个对立的过程 "解包" 和 "配置")
- dpkg --unpack package-name.deb // "解包": 解开软件包到系统目录但不配置, 如果和 - R 一起使用, 参数可以是一个目录
- dpkg --configure package-name.deb //"配置": 配置软件包
- dpkg -c package-name.deb // 列出 deb 包的内容
2) 安装相关选项
-R, --recursive Recursively handle all regular files matching pattern *.deb found at specified directories and all of its
subdirectories. This can be used with -i, -A, --install, --unpack and --avail actions(递归地指向特定目录的所有安装包, 可以结合 - i,
-A, --install, --unpack 与 --avail 一起使用)
2, 移除软件包
- dpkg -r package-name // --remove, 移除软件包, 但保留其配置文件
- dpkg -P package-name // --purge, 清除软件包的所有文件 (removes everything, including conffiles)
3, 查询
- dpkg -l package-name-pattern # --list, 查看系统中软件包名符合 pattern 模式的软件包
- dpkg -L package-name # --listfiles, 查看 package-name 对应的软件包安装的文件及目录
- dpkg -p package-name # --print-avail, 显示包的具体信息
- dpkg -s package-name # --status, 查看 package-name(已安装) 对应的软件包信息
- dpkg -S filename-search-pattern # --search, 从已经安装的软件包中查找包含 filename 的软件包名称
例 1: 列出系统上安装的与 dpkg 相关的软件包
dpkg -l \*dpkg*
例 2: 查看 dpkg 软件包安装到系统中的文件
dpkg -L dpkg
更多 dpkg 的使用方法可在命令行里使用 man dpkg 来查阅 或直接使用 dpkg --help.
三, apt
1,apt 简介
虽然我们在使用 dpkg 时, 已经解决掉了 软件安装过程中的大量问题, 但是当依赖关系不满足时, 仍然需要手动解决, 而 apt 这个工具解决了这样的问题, Linux distribution 先将软件放置到对应的服务器中, 然后分析软件的依赖关系, 并且记录下来, 然后当客户端有安装软件需求时, 通过清单列表与本地的 dpkg 已存在的软件数据相比较, 就能从网络端获取所有需要的具有依赖属性的软件了.
2, 工作原理
Ubuntu 采用集中式的软件仓库机制, 将各式各样的软件包分门别类地存放在软件仓库中, 进行有效地组织和管理. 然后, 将软件仓库置于许许多多的镜像服务器中, 并保持基本一致. 这样, 所有的 Ubuntu 用户随时都能获得最新版本的安装软件包. 因此, 对于用户, 这些镜像服务器就是他们的软件源.
然而, 由于每位用户所处的网络环境不同, 不可能随意地访问各镜像站点. 为了能够有选择地访问, 在 Ubuntu 系统中, 使用软件源配置文件 / etc/apt/sources.list 列出最合适访问的镜像站点地址.
例 1:apt-get 的更新过程
) 执行 apt-get update
) 程序分析 / etc/apt/sources.list
) 自动连网寻找 list 中对应的 Packages/Sources/Release 列表文件, 如果有更新则下载之, 存入 / var/lib/apt/lists / 目录
) 然后 apt-get install 相应的包 , 下载并安装.
即使这样, 软件源配置文件只是告知 Ubuntu 系统可以访问的镜像站点地址, 但那些镜像站点具体都拥有什么软件资源并不清楚. 若每安装一个软件包, 就在服务器上寻找一遍, 效率是很低的. 因而, 就有必要为这些软件资源列个清单 (建立索引文件), 以便本地主机查询.
用户可以使用 "apt-get update" 命令刷新软件源, 建立更新软件包列表. 在 Ubuntu Linux 中,"apt-get update" 命令会扫描每一个软件源服务器, 并为该服务器所具有软件包资源建立索引文件, 存放在本地的 / var/lib/apt/lists / 目录中. 使用 apt-get 执行安装, 更新操作时, 都将依据这些索引文件, 向软件源服务器申请资源. 因此, 在计算机设备空闲时, 经常使用 "apt-get update" 命令刷新软件源, 是一个好的习惯.
例 2:apt-get install 原理图
3,apt 相关文件
var/lib/dpkg/available 文件的内容是软件包的描述信息, 该软件包括当前系统所使用的 Debian 安装源中的所有软件包, 其中包括当前系统中已安装的和未安装的软件包.
/etc/apt/sources.list 记录软件源的地址 (当你执行 sudo apt-get install xxx 时, Ubuntu 就去这些站点下载软件包到本地并执行安装)
/var/cache/apt/archives 已经下载到的软件包都放在这里 (用 apt-get install 安装软件时, 软件包的临时存放路径)
/var/lib/apt/lists 使用 apt-get update 命令会从 / etc/apt/sources.list 中下载软件列表, 并保存到该目录.
来源: http://www.bubuko.com/infodetail-3100609.html