apt 包管理器
APT(Advanced Package Tool)是Ubuntu(以及其他基于Debian衍生的Linux发行版)中最核心的命令行包管理工具,几乎所有软件的安装、更新、卸载都离不开它。在底层,APT实际上是调用dpkg来完成实际的软件包操作,但APT在其之上提供了依赖解析、软件源管理、在线下载等高级功能,极大简化了软件包管理的操作。
注意:早期Debian/Ubuntu中APT的命令是apt-get和apt-cache等,但在Ubuntu 16.04之后情况发生了变化,这一版本中引入了更直接的apt命令(但旧版命令仍可用),它整合了apt-get和apt-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。