前言

在 Debian 及其衍生的 Linux 系统(如 Ubuntu、Linux Mint 等)中,你会经常用到一个工具:apt。或许你还知道有一个 dpkg 工具,但不清楚二者的定位与使用场景。

本文将以模块化的结构,从基础概念、核心命令、操作流程到核心区别,一步步拆解 dpkg 与 apt 的差异与关联。相信看完后,可以帮助你彻底理清二者的逻辑,掌握它们的正确使用方法,让 Linux 软件包管理变得简单清晰。

我也不会,于是边学习边把有用的东西记下来的。

排版/纠错:豆包


基础概念

软件包

它不只是程序本身,还包含:

  • 安装 / 卸载脚本
  • 可执行文件
  • 配置文件
  • 依赖说明

dpkg

dpkg(Debian Package Management System)是 Debian 及其衍生系统的底层软件包处理工具

基础命令:

1. 安装软件

sudo dpkg -i 包名.deb
  • -i = install:安装本地 .deb

2. 普通卸载(保留配置)

sudo dpkg -r 包名
  • -r = remove:删除程序文件 → 保留配置 → 不处理依赖

3. 彻底卸载(连配置一起删)

sudo dpkg -P 包名
  • -P = purge:删除程序 + 配置 → 清理干净

4. 查询所有已安装的包

dpkg -l
  • -l = list:列出系统里所有已经装上的包

5. 查询某个包是否安装、详细信息

dpkg -s 包名
  • -s = status:看版本、是否安装、依赖等

6. 查看这个包装了哪些文件

dpkg -L 包名
  • -L = List files:看软件把文件装到了哪里

7. 查询某个文件属于哪个包

dpkg -S 文件路径
  • -S = Search:查文件属于哪个包,例如
dpkg -S /usr/bin/ls

apt

apt(Advanced Packaging Tool)是一个在 Debian 及其衍生系统的 Shell 前端软件包管理器

基础命令:

1. 更新软件源列表(必须常做)

sudo apt update

作用:去服务器拉取最新包清单,不更新软件本身

2. 升级所有可更新的软件

sudo apt upgrade

作用:更新所有已装软件 → 自动解决依赖

3. 安装软件

sudo apt install 包名

作用:自动下载 → 自动解决依赖 → 调用 dpkg 安装

4. 卸载软件(保留配置)

sudo apt remove 包名

作用:安全卸载 → 自动处理依赖 → 保留配置

5. 彻底卸载(删配置)

sudo apt purge 包名

6. 搜索软件(不知道包名时用)

apt search 关键词

7. 查看包详细信息

apt show 包名

8. 清理没用的依赖

sudo apt autoremove

作用:卸载那些不再被需要的依赖包

9. 清理下载缓存的 .deb

sudo apt clean

区别

两个工具的区别

dpkg = 包处理工具(Package Handler),只负责处理包,不会联网,不会自动解决依赖

apt = 包管理器(Package Manager),可以联网从软件源下载包,自动解决依赖,甚至升级整个系统。apt 最后调用 dpkg 完成实际操作。


dpkg 安装本地.deb文件及流程

可以使用以下命令安装包:

sudo dpkg -i 包名.deb

流程

  1. 必须提前下载好 .deb 文件
  2. dpkg 打开这个包,读取里面的:
    • 可执行文件
    • 配置文件
    • 依赖列表
  3. dpkg 检查系统里有没有这些依赖
    • 有 → 继续安装
    • 没有 → 直接报错,安装失败
  4. 把文件复制到系统对应目录
  5. 执行安装脚本
  6. 安装完成(或失败)

特点

  • 不联网
  • 不下载依赖
  • 缺依赖就装不上
  • 只做 “拆包、安装”

apt 安装本地.deb文件及流程

可以使用以下命令安装包:

sudo apt install 软件名

流程

  1. apt 先读 本地软件源缓存(知道每个软件对应哪个包、在哪下载)
  2. 查这个软件的依赖关系
  3. 计算:
    • 需要装哪些包
    • 哪些已经有了
    • 哪些缺少,需要下载
  4. 自动从互联网服务器下载所有缺失的 .deb 包
  5. 把这些包按顺序交给 dpkg
  6. dpkg 一个个安装
  7. 全部装完后,apt 做清理、配置

apt 做了 dpkg 不会做的事

  • 联网
  • 找依赖
  • 下载所有依赖包
  • 按正确顺序安装
  • 处理冲突
  • 更新软件列表

dpkg 查询软件包信息完整流程

常用命令:

dpkg -l          # 列出所有已安装包
dpkg -s 包名     # 查看某个已安装包详情
dpkg -L 包名     # 查看这个包装了哪些文件

流程

  1. dpkg 会去本地数据库里找路径:/var/lib/dpkg/
  2. 只可以查已经安装的包
  3. 读取信息:
    • 版本
    • 安装状态
    • 依赖(只看已装的)
  4. 直接输出结果

特点

  • 不联网
  • 没有软件源
  • 看不到还没安装的包
  • 速度极快(只读本地文件)

dpkg 只查 “你电脑里已经有的”。


apt 查询软件包信息完整流程

常用命令:

apt list          # 列出所有可安装/已安装的包
apt show 包名     # 查看详细信息
apt search 关键词  # 搜索软件

流程

  1. apt 先读本地软件源缓存路径:/var/lib/apt/lists/
  2. 从缓存里找:
    • 这个包在不在软件源里
    • 最新版本是多少
    • 依赖是什么
    • 大小、描述、维护者
  3. 同时对比本地是否已安装
  4. 把信息整合后输出给你

特点

  • 不实时联网(用的是之前 apt update 缓存)
  • 能查没安装的包
  • 能查最新版本
  • 信息比 dpkg 更全

apt 查的是 “整个软件仓库里有什么 + 你装了什么”。


dpkg 卸载软件完整流程

命令:

  • 普通卸载(保留配置):dpkg -r 包名
  • 彻底卸载(删配置):dpkg -P 包名

流程

  1. 去本地数据库 /var/lib/dpkg/ 查看这个包是否已安装
  2. 只操作当前已安装的包,不联网、不查仓库
  3. 读取包内文件列表,把对应文件从系统里删除
  4. 不检查、不处理依赖
    • 不管别的软件是否需要它
  5. 普通卸载(-r):保留配置文件
  6. 彻底卸载(-P):连配置文件一起删掉
  7. 更新本地数据库,标记为 “已卸载”

特点

  • 只操作本地已安装包
  • 不处理依赖
  • 不联网
  • 底层暴力卸载

apt 卸载软件完整流程

命令:

  • 普通卸载:apt remove 包名
  • 彻底卸载:apt purge 包名

流程

  1. 从本地缓存和数据库中,找到这个包
  2. 检查依赖关系
    • 哪些包依赖它
    • 卸载后会不会导致系统损坏
  3. 自动处理不需要的依赖(安全前提下)
  4. 调用 dpkg 执行真正的卸载
  5. remove:保留配置
  6. purge:删除配置
  7. 更新本地状态

特点

  • 安全、智能
  • 处理依赖
  • 底层还是用 dpkg
  • 不会随便把系统搞崩

dpkg 更新完整流程

dpkg 没有更新功能

如果真要用 dpkg 进行更新,只能

  1. 自己手动下载新版 .deb
  2. 再用 dpkg -i 安装覆盖。

apt 更新完整流程

apt 更新分两条命令:

1. apt update(更新包列表)

流程

  1. 去软件源服务器
  2. 下载最新的包清单、版本号、依赖关系
  3. 保存到本地缓存 /var/lib/apt/lists/
  4. 对比已有包,告诉用户哪些可以升级
  5. 不更新任何软件本身

2. apt upgrade(更新软件)

流程

  1. 读取本地缓存里的最新版本
  2. 对比系统当前已安装的版本
  3. 找出所有需要升级的包
  4. 自动下载所有新版 .deb
  5. 自动处理依赖变化
  6. 按顺序调用 dpkg 安装
  7. 完成更新

结语

通过本文的梳理,相信你已经清晰掌握了 dpkg 与 apt 的核心差异与适用场景:dpkg 是 Debian 系系统的底层包处理工具,专注于本地.deb 包的拆包、安装、卸载与本地信息查询,不具备联网和自动解决依赖的能力;而 apt 是基于 dpkg 的上层包管理器,通过联网访问软件源、自动计算并下载依赖,完成安全的安装、升级、卸载与全量信息查询,是日常 Linux 系统操作的首选工具

二者并非对立关系,而是相辅相成的:apt 的所有底层操作最终都依赖 dpkg 完成,而 dpkg 则为 apt 提供了基础的包处理能力。