APT、apt-get、apt-cache 和 apt

1,253 阅读7分钟

在鼓捣 Debian 系 Linux 的过程中,使用到了各种 apt- 命令来处理软件安装,但对它们之间的区别还有些迷糊。因此花费了一些精力对 Debian 系 Linux 软件包管理的相关知识进行整理,并写下这篇笔记作为整理过程的记录。


从 APT 之前谈起

在 APT 等 Linux 软件包管理工具出现之前,在 Linux 上安装软件着实不是一件轻松的事。

首先必须获取到软件的源代码:可以前往软件官网获取打包好的源代码压缩包,也可以前往软件所在的仓库通过 Git 等版本控制工具获取源代码。

然后必须获取到该软件需要的编译工具,并依据编译工具进行对应操作(以 GNU 编译工具为例):

  1. 找到 configure 脚本文件并运行,以确认在当前系统环境下软件可以成功编译(例如确认系统已安装所需依赖)
  2. configure 脚本运行成功后,将产生对应本系统的 Makefile 文件,该文件中包含在本系统编译整个软件所需的指令
  3. 接下来需要使用工具 make,它将按照 Makefile 文件的指示,主导软件的编译过程
  4. 在软件编译成功后使用 make install 来进行最终的安装

然而上述操作仅仅是基础流程,在实际的编译过程中还会涉及到许多问题,例如软件安装位置的选择(该软件是某一用户专用,还是所有用户都需要使用?),软件编译的具体配置(通过不同编译配置可以对得到的软件进行自定义),更不要说噩梦般的软件依赖处理(需要先找到本软件依赖软件的源代码,并先对依赖软件完成编译安装,还得小心依赖冲突)。

# 以编译 Git 为例(仅作演示, 不可在实际环境中使用)
wget https://github.com/git/git/archive/refs/tags/v2.31.1.tar.gz -O git.tar.gz
tar xvf git.tar.gz
cd git-*
mkdir -p $HOME/local
make configure
./configure --prefix=$HOME/local
make
make install

除了软件的安装外,软件的更新和卸载也同样繁琐。

APT 的到来

为了解决 Linux 下软件管理步骤繁复的问题,Debian 开发了著名的 dpkg(Debian Packager)来简化软件的安装、更新和移除流程,然后又在 dpkg 的基础上开发了 APT(Advanced Packaging Tool),实现了 Debian 系 Linux 极具特色的软件包管理方式:只需要在终端输入一条命令(例如 sudo apt-get install git),就可以实现软件的安装、更新和移除,并且由于整个系统中的软件包都被纳入到 APT 的管理之下,出现软件依赖问题的几率也大大降低了。

接下来是对 Debian 软件包管理体系的一些简单介绍。但由于 Debian 软件包管理体系实际上是一个非常庞大的主题,介绍中只会涉及到我认为入门终端用户,想要使用 APT 在 Debian 系 Linux 上进行基本软件管理所需的入门知识。

  1. Debian 维护了一个软件仓库,在这个仓库中存放有大量预先基于 dpkg 处理好的软件及软件依赖
  2. 软件仓库中所有软件的信息被记录在一张表中(仅类比,非实际实现),当仓库中的软件发生变动时(例如更新、新增或移除),该表也会对应变化
  3. Debian 终端用户获取到远程软件仓库的记录表,从而知晓当前软件仓库中软件的情况
  4. 当终端用户需要某一软件时,会去查询本地保存的记录表,若记录表中存在对应软件,用户会向远程软件仓库发起下载请求
  5. 软件在用户本地安装成功后,相关信息将被保存起来统一管理

关于 apt-

在非常浅层地介绍了 Debian 软件包管理体系后,接下来要介绍的是各个功能对应的命令行工具,也就是我们搜索在 Debian 系 Linux 下安装某软件教程时,经常看到的以 apt- 为前缀的命令。

  • 同步远程仓库中的记录表:sudo apt-get update
  • 将本地所有软件包更新至远程仓库最新版本:sudo apt-get upgrade
  • 在软件仓库中搜索某一软件包:apt-cache search <package>
  • 查看软件包具体信息:apt-cache show <package>
  • 安装软件包:sudo apt-get install <package>
  • 卸载软件包:sudo apt-get remove <package>

apt 又是什么?

不知道朋友们发现没有,即便只是进行最基础的 Debian 软件包管理操作,就已经涉及到两条命令(apt-getapt-cache),更不必说想要查看本地已经安装软件包时,还需要请出 dpkg(dpkg -l)这样底层的工具。

这正是 apt- 系列命令存在的一个小瑕疵:对只进行基础的软件包管理操作而言,apt- 系列命令的粒度稍微有些过细了,对新手终端用户有些不太友好。

这时候我们的新手之友,apt 命令就闪亮登场了!

apt 命令手册页的简介中十分直接地表达了:

It is intended as an end user interface and enables some options better suited for interactive usage by default compared to more specialized APT tools like apt-get(8) and apt-cache(8).

从上述表达中我们可以得知:设计 apt 命令就是为了给终端用户提供较传统 apt- 命令更好的软件包管理体验

apt 的优点

那么为了提升终端用户进行软件包管理时的体验, apt 命令做了那些设计呢?

apt 命令首先就将分散在 apt-getapt-cache 的基础操作统一包含了起来

操作apt-apt
同步远程仓库中的记录表sudo apt-get updatesudo apt update
将本地所有软件包更新至远程仓库最新版本sudo apt-get upgradesudo apt upgrade
在软件仓库中搜索某一软件包apt-cache search <package>apt search <package>
查看软件包具体信息apt-cache show <package>apt show <package>
安装软件包sudo apt-get install <package>sudo apt install <package>
卸载软件包sudo apt-get remove <package>sudo apt remove <package>

除此之外,apt 还补充了一些软件包管理常用的操作:

  • 查看已安装软件包:apt list --installed
  • 查看可更新软件包: apt list --upgradeable

不止于此,apt 还在原有 apt- 的基础上,对一些操作进行了一定优化

  • 同步远程仓库中的记录表后告知是否有软件包可更新

    提示.png

  • 安装和删除软件时提供进度条

    进度条.png

apt 的不足

apt 专为终端用户设计,对于基础的 Debian 软件包管理操作,在交互性上相对传统的 apt- 命令有了一定的提升,但这也限制了 apt 的使用场景。

apt 命令手册页有这样一段提醒:

The apt(8) commandline is designed as an end-user tool and it may change behavior between versions. While it tries not to break backward compatibility this is not guaranteed either if a change seems beneficial for interactive use.

All features of apt(8) are available in dedicated APT tools like apt-get(8) and apt-cache(8) as well. apt(8) just changes the default value of some options (see apt.conf(5) and specifically the Binary scope). So you should prefer using these commands (potentially with some additional options enabled) in your scripts as they keep backward compatibility as much as possible.

从上述表达中我们可以得知:apt 命令专为终端用户设计,并且会为了提升交互性牺牲向后兼容性,因此在脚本等场景下,应当使用更强调向后兼容性的传统 apt- 命令。

除此之外,apt 作为一个志在简化基础软件包管理操作的命令,对于许多高级操作,例如使用 apt-mark 固定软件包版本,是完全没有涉及的。因此如果想要深度使用 APT,还是需要认真仔细地学习 apt- 系列命令

总结:好多 apt 呀

笔记到这里即将告一段落了,大家有没有被各种 apt 绕晕呢?我们在最后总结一下吧:

  • APT(Advanced Packaging Tool):Debian 系 Linux 特有的软件包管理体系,相较于先前的从源码开始编译软件,极大地方便了在 Linux 下对软件进行管理
  • apt-:以 apt-getapt-cache 为代表,它们是 Debian 软件包管理体系中各种功能对应的命令行工具
  • apt:在原有 apt-getapt-cache 基础上,对基础软件包管理操作进行简化和优化,专为新手终端用户设计的命令行工具