“Linux包管理:dpkg与apt”的版本间差异
| 第45行: | 第45行: | ||
==== 查询dpkg数据库 ====  | ==== 查询dpkg数据库 ====  | ||
显示所有已安装的Deb包“dpkg -l”:  | 显示所有已安装的Deb包“dpkg -l”:  | ||
[[File:dpkg查看数据库.png|800px]]  | : [[File:dpkg查看数据库.png|800px]]  | ||
每条记录的前三个字符为软件包的状态标识(Desired|Status|Err),后边依此是软件包名称、版本号、硬件平台和简单描述,其中  | 每条记录的前三个字符为软件包的状态标识(Desired|Status|Err),后边依此是软件包名称、版本号、硬件平台和简单描述,其中  | ||
# 第一字符,为期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括:  | # 第一字符,为期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括:  | ||
2021年5月23日 (日) 20:16的版本
dpkg
dpkg,即package manager for Debian(debian系统的包管理工具)。“dpkg is a tool to install, build, remove and manage Debian packages”,dpkg是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。
这个机制最早由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时能提供安装后的软件信息。派生于Debian的其它Linux distributions大多使用dpkg这个机制来管理,包括B2D,Ubuntu等。
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
 
相关文件
| 文件 | 说明 | 
|---|---|
| /etc/dpkg/dpkg.cfg | dpkg的配置文件 | 
| /var/log/dpkg.log | dpkg的日志文件 | 
| /var/lib/dpkg/available | 存放系统所有安装过的软件包信息 | 
| /var/lib/dpkg/status | 存放系统现在所有安装软件的状态信息 | 
| /var/lib/dpkg/info | 存放安装软件包控制目录的控制信息文件 | 
dpkg数据库
- dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单、依赖关系、软件状态等详细的内容;
 
相关文本文件通常在“/var/lib/dpkg 目录下,通常在:
- “status”文件中存储软件状态和控制信息
 - “info/”目录下备份控制文件,并在其下的;
- “.list”文件中记录安装文件清单;
 - “.md5sums”保存文件的 MD5 编码。
 
 
查询dpkg数据库
显示所有已安装的Deb包“dpkg -l”:
每条记录的前三个字符为软件包的状态标识(Desired|Status|Err),后边依此是软件包名称、版本号、硬件平台和简单描述,其中
- 第一字符,为期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括:
- u Unknown状态未知,这意味着软件包未安装,并且用户也未发出安装请求.
 - i Install用户请求安装软件包.
 - r Remove用户请求卸载软件包.
 - p Purge用户请求清除软件包.
 - h Hold用户请求保持软件包版本锁定.
 
 - 第二列,为软件包的当前状态(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触发器未决
 
 - 第三列标识错误状态,第一种状态标识“(none)”表示没有问题,其它符号则标识相应问题(Err?=(none)/Reinst-required (Status,Err: uppercase=bad))
- h 软件包被强制保持,因为有其它软件包依赖需求,无法升级.
 - r Reinst-required,软件包被破坏,可能需要重新安装才能正常使用(包括删除).
 - x 软包件被破坏,并且被强制保持.
 
 
dpkg 子命令
为了方便用户使用,dpkg不仅提供了大量的参数选项,同时也提供了许多子命令。比如:
dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon
dpkg 使用
安装
命令:
- dpkg -i package-name.deb:安装软件包,必须是deb包的完整名称(软件的安装可被拆分为两个对立的过程“解包”和“配置”);
- dpkg --unpack package-name.deb:解开软件包到系统目录但不配置;(“解包”)
 - dpkg --configure package-name.deb:配置软件包;(“配置”)
 
 - dpkg -c package-name.deb:列出 deb 包的内容
 
选项:
- -R,--recursive:递归地处理在指定目录中的指向特定目录中所匹配的所有安装包;
- 可以和 -i, -A, --install, --unpack 与--avail一起使用
 
 
移除
- dpkg -r package-name:移除软件包,但保留其配置文件
 - dpkg -P package-name:清除软件包的所有文件
 
查询
- dpkg -l package-name-pattern:查看系统中软件包名符合pattern模式的软件包
 - dpkg -L package-name:查看package-name对应的软件包安装的文件及目录
 - dpkg -p package-name:显示包的具体信息
 - dpkg -s package-name:查看package-name(已安装)对应的软件包信息
 - dpkg -S filename-search-pattern:从已经安装的软件包中查找包含filename的软件包名称
 
- (也可使用子命令dpkg-query来进行查询操作)
 
apt
dpkg时,已经解决掉了软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而apt这个工具解决了这样的问题。
linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg以存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。
原理
dpkg 采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源。
然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Debian系统中,使用软件源配置文件“/etc/apt/sources.list”列出最合适访问的镜像站点地址。
apt-get update的过程
- 执行“apt-get update”
 - 程序分析“/etc/apt/sources.list”
 - 自动连网寻找list中对应的“Packages/Sources/Release”列表文件,如果有更新则下载之,存入“/var/lib/apt/lists/”目录
 - 然后“apt-get install”相应的包 ,下载并安装
 
- “apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。
 - 使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。
 - 因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。【?服务器呢?也需要?任务?】
 
apt-get install的过程
apt 相关文件
| 命令 | 说明 | 
|---|---|
| var/lib/dpkg/available | 存放系统所有安装过的软件包信息 | 
| /etc/apt/sources.list | 记录软件源的地址
 (执行“sudo apt-get install xxx”时,系统就去这些站点下载软件包到本地并执行安装)  | 
| /var/cache/apt/archives | 已经下载到的软件包
 (用“apt-get install”安装软件时,软件包的临时存放路径)  | 
| /var/lib/apt/lists | 使用“apt-get update”命令会从“/etc/apt/sources.list”中下载软件列表,并保存到该目录 | 
更新源
apt的源文件由配置文件“/etc/apt/sources.list”指定:

源内容分为四部分,分别为(非上图例):
deb    ###   镜像地址                ###  版本代号    ###  限定词
deb    ###   http://mirrors.163.com/debian/  ###  wheezy     ###  main non-free contrib
- deb 表示软件的位置,deb-src 代表软件的源代码的位置;
 - 镜像地址,其目录结构如下:
 - 版本号
- oldstable:以前的稳定发行版
 - stable:现在的稳定发行版
- 对于每个debian来说,每个稳定发行版都会有一个代号,如debian 6叫做squeeze,debian 7叫做wheezy
 
 - testing:处于测试阶段的发行版
 - unstable:不稳定版本
 
 - 限定词
- main:Debian 里最基本及主要且符合自由软件规范的软件
 - contrib:自由软件(相对于non-free)
 - non-free:不属于自由软件范畴的软件
 
 
apt使用
apt-get
apt-get is the command-line tool for handling packages, and may be considered the user's "back-end" to other tools using the APT library. Several "front-end" interfaces exist, such as dselect(?), aptitude(?), synaptic(?) and wajig(?).
apt-get 是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。
用法: 
apt-get [选项] 命令
选项:
- -h:显示帮助信息;
 - -q:输出到日志,不显示进展;
 - -qq:不输出信息,错误除外;
 - -d:仅下载软件包,不执行安装操作;
 - -P:每一步操作都要求确认;
 - -s:模拟执行命令,不实际安装;
 - -y:所有问题都回答“yes”;
 - -v:显示附加信息;
 - -u:启动时下载新的软件包列表。
 - -c=?:阅读配置文件?;
 - -o=?:设置自定的配置选项,如“-o dir::cache=/tmp”;
 
常用命令:
| 命令 | 说明 | 
|---|---|
| apt-get update | 更新源
 (“aptitude update”)  | 
| apt-get dist-upgrade | 升级系统到相应的发行版(根据 source.list 的配置)
 (“aptitude dist-upgrade”)  | 
| apt-get upgrade | 更新所有已经安装的软件包
 (“aptitude upgrade”)  | 
| apt-get install package_name | 安装软件包
 (“aptitude install package_name”) 
  | 
| apt-get remove package_name | 卸载一个已安装的软件包(保留配置文件)
 (“aptitude remove package_name”)  | 
| apt-get purge package_name | 移除软件包(删除配置信息)
 (“aptitude purge package_name”) 
  | 
| apt-get check | 检查是否有损坏的依赖 | 
| apt-get autoclean | 清理已删除软件的.deb文件
 (“aptitude autoclean”) 
  | 
| apt-get clean | 清理已安装软件的备份(不影响软件使用)
 (“aptitude clean”)  | 
apt-cache
apt-cache performs a variety of operations on APT's package cache. apt-cache does not manipulate the state of the system but does provide operations to search and generate interesting output from the package metadata.
apt-cache:用于对apt的包缓存执行各种操作:
- “apt-cache depends packagename”:了解使用依赖
 - “apt-cache rdepends packagename”:是查看该包被哪些包依赖
 - “apt-cache search packagename”:搜索包
- 【aptitude search packagename】
 
 - “apt-cache show packagename”:获取包的相关信息,如说明、大小、版本等
- 【aptitude show packagename】
 
 - “apt-cache showpkg packagename”:显示软件包的大致信息
 
