apt 包管理器

APT(Advanced Package Tool)是Ubuntu(以及其他基于Debian衍生的Linux发行版)中最核心的命令行包管理工具,几乎所有软件的安装、更新、卸载都离不开它。在底层,APT实际上是调用dpkg来完成实际的软件包操作,但APT在其之上提供了依赖解析、软件源管理、在线下载等高级功能,极大简化了软件包管理的操作。

注意:早期Debian/Ubuntu中APT的命令是apt-getapt-cache等,但在Ubuntu 16.04之后情况发生了变化,这一版本中引入了更直接的apt命令(但旧版命令仍可用),它整合了apt-getapt-cache中的常用功能,并能提供更友好的输出,日常操作中推荐使用apt命令。不过在编写Shell脚本时,官方仍建议使用apt-get,因为它的输出格式更稳定,不会随版本变化。

软件源配置

在使用APT之前,我们需要先了解软件源的概念。软件源是一个类似Maven Central、DockerHub的远程仓库,区别是APT源维护的是.deb软件包文件,APT会从软件源中获取软件包信息和下载地址,软件源的配置文件位于主配置文件/etc/apt/sources.list以及其它源配置文件夹/etc/apt/sources.list.d/目录下。

Ubuntu默认使用官方软件源,国内用户访问速度可能较慢,通常会替换为国内镜像源(如阿里云、清华大学等)。以Ubuntu 22.04和阿里云镜像源为例,我们可以按照如下配置/etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

修改软件源配置后,我们还需要执行apt update命令更新本地的软件包索引,否则APT仍会使用旧的索引信息。

更新软件包索引

执行以下命令更新APT内全部软件包索引。

apt update

apt update命令会从所有已配置的软件源中拉取最新的软件包索引信息,并缓存到本地。这个命令不会安装或升级任何软件包,它只是刷新本地的索引数据。我们在安装软件之前通常最佳实践都是先执行一次apt update,以确保获取到的是最新版本的软件包信息。

执行后终端会输出每个软件源的拉取状态,最后会提示有多少个软件包可以升级。

安装软件包

基本安装

apt install nginx

上面命令安装了nginx软件包,APT会自动解析并安装它所依赖的所有软件包。执行后APT会列出将要安装的软件包列表以及需要的磁盘空间,并询问用户是否确认安装。

如果想跳过确认步骤(例如在脚本中使用),可以加上-y参数。

apt install -y nginx

安装指定版本

有时候我们需要安装某个软件包的特定版本,可以使用=指定版本号。

apt install nginx=1.18.0-6ubuntu14.4

如果不确定软件源中有哪些可用版本,可以使用apt list命令查看。

apt list -a nginx

同时安装多个软件包

apt install支持一次安装多个软件包,软件包名之间用空格分隔即可。

apt install nginx curl vim

安装本地deb文件

APT也可以直接安装本地的.deb文件,相比dpkg -i命令,APT的优势在于它会试图自动解决依赖问题。

apt install ./package.deb

注意路径前面需要加上./或使用绝对路径,否则APT会将其当作软件源中的包名来查找。

升级软件包

升级所有可升级的软件包

apt upgrade

apt upgrade会将系统中所有已安装的软件包升级到最新版本,不过相比后面介绍的apt full-upgrade,它的行为比较保守,只升级软件包版本,不会删除已安装的包,也不会安装新的依赖包。如果某个软件包的升级需要删除其他包或安装新依赖,apt upgrade会跳过它。

完整升级

apt full-upgrade

apt full-upgrade(等同于曾经的apt-get dist-upgrade)在apt upgrade的基础上更加激进,如果升级某个包需要删除其他包或安装新的依赖,它也会执行,在进行系统大版本升级时会用到这个命令,不过这种操作也同样伴随着较大的风险。

升级单个软件包

如果只想升级某个特定的软件包,直接对其执行apt install即可,APT会自动将其升级到最新版本。

apt install --only-upgrade nginx

--only-upgrade参数表示只在软件包已安装的情况下才执行升级,如果未安装则不会安装它。

卸载软件包

基本卸载

apt remove nginx

apt remove会卸载指定的软件包,但保留其配置文件。保留配置文件的好处是,如果将来重新安装该软件包,之前的配置可以直接复用。

彻底卸载

apt purge nginx

apt purge会卸载软件包并同时删除其配置文件,是一次彻底的清理。如果确定以后不再需要这个软件,推荐使用purge而不是remove

自动清理不再需要的依赖

apt autoremove

当我们卸载某个软件包后,它之前自动安装的依赖包可能不再被任何软件需要了,这些"孤儿"包会占用磁盘空间。apt autoremove命令用于自动清理这些不再需要的依赖包,当然不清理通常没有任何问题(清理反而有极小概率出问题),如果你有系统“洁癖”可以在卸载软件包后执行。

查询软件包信息

搜索软件包

apt search nginx

apt search会在软件包名和描述中搜索关键字,输出所有匹配的软件包,搜索结果中已安装的包会标注[installed]

查看软件包详细信息

apt show nginx

apt show命令用于显示某个软件包的详细信息,包括版本号、大小、依赖关系、维护者、描述等。

列出已安装的软件包

apt list --installed

该命令会列出系统中所有已安装的软件包。由于输出通常很长,我们可以结合grep命令过滤。

apt list --installed | grep nginx

列出可升级的软件包

apt list --upgradable

该命令列出所有有新版本可用但尚未升级的软件包,方便我们在执行apt upgrade之前了解将要升级的内容。

清理缓存

APT在下载软件包时会将.deb文件缓存到/var/cache/apt/archives/目录中,长期使用后这个目录可能会占用一定磁盘空间。

清理已下载的包缓存

apt clean

apt clean会清空/var/cache/apt/archives/目录中的所有缓存文件,释放磁盘空间。

清理过时的包缓存

apt autoclean

apt autoclean只会删除那些已经无法从软件源下载到的旧版本缓存包(即软件源中已经不存在的版本),保留当前版本的缓存。相比apt clean,这个命令更加温和。

其他实用操作

修复依赖问题

有时候由于各种原因(如手动使用dpkg安装包、安装过程中断等),系统中可能出现依赖关系损坏的情况,此时可以使用以下命令尝试修复。

apt --fix-broken install

该命令会尝试修复损坏的依赖关系,安装缺失的依赖包。

使用模拟模式

apt install -s nginx

-s参数(即--simulate)表示模拟执行,APT会输出将要执行的操作但不会实际执行。这在我们不确定某个操作会产生什么影响时非常有用,尤其是在生产环境中。

查看软件包依赖关系

apt depends nginx

该命令可以查看某个软件包的依赖关系,了解它需要哪些其他软件包才能正常运行。

apt rdepends nginx

反过来,apt rdepends可以查看哪些软件包依赖了指定的包。

apt和apt-get的区别

前面提到apt系列命令是apt-get系列的现代化版本,下面表格简单对比了两者的常用命令。

功能 apt apt-get
更新索引 apt update apt-get update
安装软件 apt install apt-get install
卸载软件 apt remove apt-get remove
彻底卸载 apt purge apt-get purge
升级软件 apt upgrade apt-get upgrade
完整升级 apt full-upgrade apt-get dist-upgrade
搜索软件 apt search apt-cache search
查看信息 apt show apt-cache show
清理依赖 apt autoremove apt-get autoremove
列出软件 apt list 无直接等价命令

总体来说,两者在功能上大部分是一致的。日常交互使用推荐apt,编写脚本时目前还是推荐使用apt-get

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。