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 的关系!

相关推荐
图扑可视化几秒前
3D 管道如何实现流动的?
运维·数字孪生·三维可视化·管道·3d管道
爱掉发的小李14 分钟前
Linux 环境下 Docker 安装与简单使用指南
java·linux·运维·c++·python·docker·php
༺๑Tobias๑༻22 分钟前
Linux下Redis常用命令
linux·前端·redis
我命由我123452 小时前
Windows 操作系统 - Windows 设置始终使用 Windows 照片查看器打开图片
运维·windows·经验分享·笔记·学习·操作系统·运维开发
乌萨奇也要立志学C++2 小时前
【Linux】linux基础开发工具(三) 版本控制器Git、调试器 - gdb/cgdb使用、一些实用的调试技巧
linux·git·elasticsearch
Ronin3052 小时前
【Linux系统】进程间通信:匿名管道
linux
liliangcsdn3 小时前
linux pip/conda 修改默认cache位置
linux·运维·pip
sky_share3 小时前
嵌入式相关书籍
linux
mortimer3 小时前
记一次网站服务器无缝扩容:利用软链接实现零停机数据迁移
linux·运维