速查表

apt 命令:在 Ubuntu 和 Debian 中安装、更新和删除软件包

更新于: · Skillaria.Top

apt 是 Ubuntu 和 Debian 的软件包管理器:sudo apt update 更新软件包列表,sudo apt upgrade 安装更新,sudo apt install 名称 安装软件包,sudo apt remove 删除它(purge 则连配置一起删除),apt autoremove 清理不再需要的依赖。apt search 和 apt show 用于查找软件包,sudo apt --fix-broken install 修复损坏的依赖。

apt 是 Ubuntu、Debian 及其衍生系统(Linux Mint、Pop!_OS)的标准软件包管理器。它从软件源下载程序,自动安装依赖,并且一条命令即可更新整个系统。下面按任务分组列出日常工作中需要的全部 apt 命令,并附上常见错误及解决办法。

apt 的工作原理

软件包是一个 .deb 归档文件,包含程序、元数据和依赖列表。软件源是存放软件包的服务器,其地址写在 /etc/apt/sources.list 和目录 /etc/apt/sources.list.d/ 中。apt 会在本地保存一份可用软件包列表,安装时以此为准,因此需要定期更新。

在底层,apt 调用 dpkg 来解压并登记软件包,但 dpkg 本身不解析依赖关系。apt-get 和 apt-cache 是功能相同的旧接口,输出稳定,适合在脚本中使用。apt 则是面向人工操作的较新封装:有进度条、彩色输出,命令也更短。

几乎所有会改变系统的命令都需要管理员权限,因此要通过 sudo 运行。搜索和查看信息则不需要。

速查表:常用 apt 命令

命令作用
sudo apt update从软件源更新软件包列表
sudo apt upgrade安装更新,不删除软件包
sudo apt full-upgrade必要时删除或替换软件包,完成更新
sudo apt install 软件包安装软件包及其依赖
sudo apt reinstall 软件包重新安装软件包
sudo apt remove 软件包删除软件包,保留配置文件
sudo apt purge 软件包删除软件包及其系统配置文件
sudo apt autoremove删除不再需要的依赖
apt search 关键词按名称和描述搜索软件包
apt show 软件包描述、版本、依赖、大小
apt list --installed已安装软件包列表
apt list --upgradable可以更新的软件包
apt policy 软件包已安装及可用的版本,以及来源
sudo apt clean清空已下载的 .deb 缓存
sudo apt --fix-broken install修复损坏的依赖关系

apt update 与 apt upgrade:如何更新系统

这是两个不同的操作,经常被混淆。apt update 不安装任何东西,只下载最新的软件包列表。apt upgrade 则依据这些列表,把已安装的程序升级到新版本。

$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
...
12 packages can be upgraded. Run 'apt list --upgradable' to see them.

$ apt list --upgradable
$ sudo apt upgrade

服务器上常用的组合是一行命令,并自动确认:

sudo apt update && sudo apt upgrade -y

upgrade 与 full-upgrade 的区别

apt upgrade 可以安装新的依赖,但绝不删除已安装的软件包。如果更新需要删除某些内容(例如更换内核或库的版本),这些软件包会被“保留”,输出中会出现 The following packages have been kept back 这一行。apt full-upgrade(相当于 apt-get dist-upgrade)允许删除,从而完成整个更新。在执行它之前,请仔细阅读 apt 将要删除的内容。

只更新某一个软件包

sudo apt install --only-upgrade nginx

如果软件包未安装,带有 --only-upgrade 的命令不会安装它,这可以防止误装。

apt install:安装软件包

sudo apt install nginx                 # 安装一个软件包
sudo apt install git curl htop         # 一次安装多个
sudo apt install -y docker.io          # 不询问 Y/n
sudo apt install nginx=1.24.0-2ubuntu7 # 指定具体版本
sudo apt install --no-install-recommends ffmpeg  # 不安装推荐的软件包
sudo apt install ./google-chrome-stable_current_amd64.deb  # 本地 .deb 文件

安装时 apt 会列出将要添加的软件包及占用的空间,并要求确认。-y 参数会自动回答“是”——适合脚本和 Dockerfile,但在交互操作中最好仔细阅读列表。

默认情况下,apt 不仅安装必需的依赖(Depends),还会安装推荐的依赖(Recommends)。在服务器和容器中,--no-install-recommends 可以明显减小体积。

安装 .deb 文件:apt 还是 dpkg -i

下载好的 .deb 最好用 apt install ./文件.deb 安装——路径必须以 ./ 开头或使用完整路径,否则 apt 会在软件源中查找同名软件包。与 dpkg -i 不同,apt 会自动下载缺少的依赖。如果你已经用 dpkg 安装了软件包并遇到依赖错误,可以用 sudo apt --fix-broken install 修复。

sudo dpkg -i package.deb
sudo apt --fix-broken install

apt remove、purge 与 autoremove:删除软件包

命令程序/etc 中的配置依赖
apt remove删除保留保留
apt purge删除删除保留
apt autoremove——删除不再需要的依赖
sudo apt remove nginx
sudo apt purge nginx            # 同上,并删除配置
sudo apt autoremove             # 清理残留的依赖
sudo apt autoremove --purge     # 清理残留依赖及其配置

如果你打算以后还要用这个程序,并保留其设置,使用 remove。如果想从零开始彻底重装,使用 purge。注意:用户主目录中的文件(例如 ~/.config)不会被任何这些命令删除。

要找出已经删除、但仍保留了配置的软件包,它们的状态是 rc:

dpkg -l | grep '^rc'

搜索软件包与查看信息

apt search postgresql          # 按名称和描述搜索
apt search --names-only '^php8' # 仅按名称搜索,支持正则表达式
apt show htop                  # 版本、大小、依赖、描述
apt policy docker.io           # 有哪些可用版本,来自哪里
apt list --installed | grep python3
apt-cache depends curl         # 该软件包依赖什么
apt-cache rdepends libssl3     # 哪些软件包依赖它

某个文件属于哪个软件包

$ dpkg -S /usr/bin/curl
curl: /usr/bin/curl

$ dpkg -L curl        # 该软件包安装了哪些文件

如果系统中还没有某个命令,Ubuntu 在你尝试运行它时会提示需要安装的软件包(消息 Command 'tree' not found, but can be installed with: sudo apt install tree)。要在未安装的软件包中按文件查找,可以使用 apt-file:先执行 sudo apt-file update,再运行 apt-file search bin/dig。

锁定版本:apt-mark hold

有时某个软件包不能更新——例如生产环境中的数据库或内核版本只能手动更改。这时可以将软件包“冻结”:

sudo apt-mark hold postgresql-16
apt-mark showhold
sudo apt-mark unhold postgresql-16

另一对有用的命令是 apt-mark manual 和 apt-mark auto。作为依赖安装的软件包会被标记为自动,一旦不再需要,就会被 autoremove 删除。标记为 manual 可以保护软件包不被删除。

软件源:如何添加以及它们位于哪里

软件源列表位于 /etc/apt/sources.list 以及 /etc/apt/sources.list.d/*.list 文件中。在 Ubuntu 24.04 和 Debian 12 及以上版本中,越来越多地使用扩展名为 .sources 的 deb822 格式(例如 /etc/apt/sources.list.d/ubuntu.sources)。

带密钥的第三方软件源

现代的做法是把软件源的密钥单独保存,并通过 signed-by 与之关联。apt-key 命令已被弃用,在新版本中已删除。

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce

Ubuntu 中的 PPA

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo add-apt-repository --remove ppa:deadsnakes/ppa

PPA 是 Launchpad 上的个人软件源。只添加你信任的 PPA:其中的软件包以 root 权限安装。

缓存与磁盘空间

已下载的软件包保存在 /var/cache/apt/archives/ 中。在小容量磁盘和 Docker 镜像中,应定期清理缓存。

du -sh /var/cache/apt/archives
sudo apt clean          # 删除全部 .deb 缓存
sudo apt autoclean      # 只删除过期的版本

在 Dockerfile 中,习惯把安装写在同一层,并立即删除软件包列表:

RUN apt-get update \
 && apt-get install -y --no-install-recommends curl ca-certificates \
 && rm -rf /var/lib/apt/lists/*

在脚本中使用 apt-get 而不是 apt:apt 的命令行接口并不稳定,它会明确给出警告(WARNING: apt does not have a stable CLI interface)。为了让安装程序不弹出提问,可以加上 DEBIAN_FRONTEND=noninteractive。

常见 apt 错误及解决办法

Could not get lock /var/lib/dpkg/lock-frontend

已有其他进程在操作软件包:另一个终端中的 apt、“软件中心”,或后台的自动更新 unattended-upgrades。请等待几分钟,并检查是谁占用了锁:

ps aux | grep -E 'apt|dpkg'

只要进程仍在运行,就不要手动删除锁文件:被中断的安装可能让系统处于不一致的状态。如果进程确实已经卡死或被终止,等它结束后执行 sudo dpkg --configure -a。

Unable to locate package

apt 找不到该软件包。最常见的原因是:在新系统上没有先执行 sudo apt update,软件包名拼写有误,或者软件包位于未启用的组件中(在 Ubuntu 中是 universe)。启用该组件的命令是 sudo add-apt-repository universe。

Unmet dependencies / held broken packages

依赖关系不匹配——通常是手动安装 .deb 之后,或者混用了不同发行版版本的软件源。

sudo apt --fix-broken install
sudo dpkg --configure -a
apt policy 出问题的软件包

dpkg was interrupted

安装被中断了(关闭了终端,或停电)。提示信息本身就给出了解决办法:sudo dpkg --configure -a。

apt update 时出现 NO_PUBKEY

第三方软件源缺少签名密钥,或密钥已经过期。从项目官网下载最新的密钥,保存到 /etc/apt/keyrings/,并在 signed-by 中指定,方法与上面的 Docker 示例相同。

自动安全更新

Ubuntu Server 默认安装了 unattended-upgrades 软件包,它会自动安装安全更新。检查并启用它的方法:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
cat /var/log/unattended-upgrades/unattended-upgrades.log

更新后是否需要重启,可以看文件 /var/run/reboot-required:如果它存在,说明内核或关键库已经更新。

总结

基本的 apt 操作可以归结为一个简单的循环:操作前先执行 update,用 install 安装,用 upgrade 升级,用 remove 或 purge 删除,并用 autoremove 清理。管理版本可以用 apt policy 和 apt-mark hold;出现故障时使用 --fix-broken install 和 dpkg --configure -a;在脚本中则使用 apt-get。软件包管理的实际操作会在 Linux 课程中详细讲解。

常见问题

apt 与 apt-get 有什么区别?

它们是同一个软件包系统的两种接口。apt 更适合在终端中手动使用(有进度条、彩色输出、命令更短),而 apt-get 输出稳定,推荐用于脚本和 Dockerfile。

每次安装前都需要执行 apt update 吗?

如果软件包列表很久没有更新,建议执行。否则 apt 可能找不到软件包,或尝试下载镜像上已经不存在的版本,并报 404 错误。

如何查看 apt 的安装和删除历史?

历史记录保存在 /var/log/apt/history.log 中(旧记录在 history.log.N.gz 压缩文件中),而详细的 dpkg 日志位于 /var/log/dpkg.log。

如何把软件包回退到之前的版本?

用 apt policy 软件包 查看可用版本,然后执行 sudo apt install 软件包=版本 安装所需版本,并用 apt-mark hold 锁定,以免下次更新又升级到新版本。

在 CentOS 或 Fedora 中可以使用 apt 吗?

不可以。这些系统使用不同的软件包格式(rpm)以及各自的管理器 dnf 和 yum。apt 适用于 Debian、Ubuntu 及其衍生发行版。

通过视频学习本主题

课程“Linux: с нуля до уверенного администрирования”结合实践详细讲解了这一主题。

前往课程