ubuntu apt安装与dpkg安装相互之间的关系

0. 问题解释

在linux系统中,使用neofetch命令可以看到现在系统中使用dpkg, flatpak, snap安装的包的数量,那么使用apt安装的包被统计在什么位置了呢,使用apt的安装流程和使用flatpak的安装流程有什么关系和区别呢?

1. apt 安装的包在哪里?和 neofetch 的显示有什么关系?

一句话回答:neofetch 显示的 3332 (dpkg) 这个数量,基本上就包含了所有通过 apt 安装的包。

详细解释:

在 Debian、Ubuntu、Linux Mint 等系统中,软件包管理系统是分层的:

  • dpkg (Debian Package manager): 这是底层的核心工具。它负责直接 处理 .deb 软件包文件。它的功能包括:安装一个本地的 .deb 文件、卸载一个已安装的包、查询系统中已安装包的信息等。但是,dpkg 有一个巨大的"缺点":它不会自动处理依赖关系 。如果你想安装的包A需要包B,但你系统里没有包B,dpkg 就会报错并停止安装,需要你手动先去安装包B。

  • apt (Advanced Package Tool): 这是一个高层的、更智能的工具,它构建在 dpkg 之上。你可以把 apt 看作是 dpkg 的一个"智能管家"。apt 最重要的功能就是:

    • 自动解决依赖关系 :当你 apt install A 时,它会自动分析出A需要B,然后帮你把A和B都下载并安装好。
    • 管理软件源 (Repositories)apt 知道去哪里(网络上的服务器)下载软件包。这些信息记录在 /etc/apt/sources.list/etc/apt/sources.list.d/ 目录下的文件中。
    • 系统更新和升级apt updateapt upgrade 可以方便地更新整个系统的所有软件包。

所以,它们的关系是:apt 是前端指挥官,dpkg 是后端执行者。

当你运行 sudo apt install firefox 时,apt 会:

  1. 找到 firefox 的最新版本。
  2. 分析出 firefox 需要的所有依赖包。
  3. 从软件源服务器上把 firefox 和它所有依赖包的 .deb 文件都下载下来。
  4. 最后,apt 会按照正确的顺序,调用 dpkg 把这些下载好的 .deb 文件一个个安装到系统里。

因此,neofetch 通过查询 dpkg 的数据库得知系统里有多少个包,这个数字自然就代表了整个 apt/dpkg 系统所管理的包的总数。

结论:aptneofetch 里的 dpkg 数量最一致。Packages: 3332 (dpkg) 就是你通过 apt (以及其他可能直接使用 dpkg 的工具如 synaptic, gdebi 等) 安装的软件包总数。


2. apt 的安装过程具体是怎样的?

sudo apt install vlc 为例,具体过程如下:

  1. 锁定数据库apt 会首先锁定 dpkg 的数据库文件,防止在你安装时,有其他软件管理程序(比如系统自动更新)同时操作,导致冲突。
  2. 读取软件源列表apt 检查 /etc/apt/sources.list 和相关文件,确定可以从哪些服务器下载软件。
  3. 解析依赖关系apt 查看本地的软件包缓存信息(通过 apt update 更新),找到 vlc 包的元数据。元数据里写明了 vlc 依赖哪些其他的包(比如 libvlc-core, vlc-plugin-base 等)以及它们需要的版本。
  4. 构建依赖树apt 会递归地检查所有依赖包的依赖,直到构建出一个完整的"需要安装/更新的软件包列表"。它会对比这个列表和当前系统已安装的包,计算出最终需要执行的操作。
  5. 用户确认apt 会在终端显示将要安装哪些新包、更新哪些包、占用多少磁盘空间等信息,并询问你是否继续 [Y/n]
  6. 下载软件包 :在你确认后,apt 会从软件源服务器将所有需要的 .deb 文件下载到本地缓存目录,通常是 /var/cache/apt/archives/
  7. 调用 dpkg 安装 :这是关键一步。apt 会根据之前计算好的正确依赖顺序,依次调用 dpkg -i 命令来安装所有下载好的 .deb 文件。先安装被依赖的包,再安装依赖这些包的包。
  8. 配置和收尾dpkg 在安装过程中会运行包自带的配置脚本(比如创建用户、设置服务等)。全部安装完成后,apt 解除数据库锁定,安装过程结束。

3. apt install 与自己安装 .deb 包 (dpkg -i) 的异同

这是一个非常核心的区别,直接体现了高层和底层工具的差异。

相同点
  • 最终执行者相同 :无论是 apt 还是你手动用 dpkg,最终将文件解压并安装到系统里的都是 dpkg 这个程序。
  • 包格式相同 :两者处理的都是 .deb 格式的软件包。
  • 安装后状态相同 :一旦安装成功,包的信息都会被记录在 dpkg 的数据库中,neofetch 都能统计到,你也可以用 dpkg -lapt list --installed 查到它。
不同点
特性 sudo apt install <包名> sudo dpkg -i <文件名.deb>
软件包来源 自动从配置好的在线软件源下载。 手动 需要你先通过浏览器或其他方式下载好 .deb 文件到本地。
依赖关系处理 自动处理。会自动下载并安装所有缺失的依赖包。这是其最大优势。 不处理 。如果缺少依赖,安装会直接失败并报错。你需要手动去寻找并安装所有依赖项。
便利性 非常高。一条命令解决所有问题,是日常使用的首选。 较低。通常只用于安装软件源里没有的软件(比如Google Chrome, VS Code的官网deb包)。
版本管理 简单 。可以通过 apt upgrade 统一更新所有通过 apt 安装的包。 复杂 。你手动安装的包不会被 apt upgrade 自动更新。你需要自己去官网下载新版的 .deb 文件再手动安装一次来升级。
命令对象 操作的是包名 (e.g., vlc)。 操作的是本地文件名 (e.g., vlc_3.0.18-2_amd64.deb)。

一个典型的例子:

你从官网下载了 google-chrome-stable_current_amd64.deb

  1. 你尝试 sudo dpkg -i google-chrome-stable_current_amd64.deb
  2. 系统可能会报错,提示缺少 libu2f-udev 等依赖。dpkg 安装失败。
  3. 这时,有一个绝佳的修复命令:sudo apt -f install。这个命令的作用是让 apt 介入,自动修复(fix-broken)依赖关系。apt 会发现 Chrome 已经"部分安装"但缺少依赖,于是它会自动从软件源里下载并安装 libu2f-udev 等所有缺失的依赖。依赖装好后,dpkg 会被再次调用来完成 Chrome 的配置。

希望这个详细的解释能帮助你彻底理解 aptdpkg 的关系!

相关推荐
Nimsolax11 小时前
Linux线程控制
linux
代码的余温11 小时前
Web服务器VS应用服务器:核心差异解析
运维·服务器·前端
Light6011 小时前
领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度(一气呵成)
linux·spring boot·pdf·gpcl6/ghostpcl·s3/oss·权限与审计·异步与进度
a.30211 小时前
OpenCV(cv2)学习笔记:从模板匹配入门到常用函数
数据库·ubuntu·ssh
WWZZ202511 小时前
视觉SLAM第10讲:后端2(滑动窗口与位子图优化)
c++·人工智能·后端·算法·ubuntu·机器人·自动驾驶
YuTaoShao12 小时前
【LeetCode 每日一题】36. 有效的数独
linux·算法·leetcode
NiKo_W12 小时前
Linux 开发工具(1)
linux·运维·服务器
笑口常开xpr12 小时前
Linux动静态库开发基础:静态库与动态库的编译构建、链接使用及问题排查
linux·c语言·动态库·静态库
艾莉丝努力练剑13 小时前
【C++】类和对象(下):初始化列表、类型转换、Static、友元、内部类、匿名对象/有名对象、优化
linux·运维·c++·经验分享
风_峰13 小时前
PuTTY软件访问ZYNQ板卡的Linux系统
linux·服务器·嵌入式硬件·fpga开发