Ubuntu 18.04 Server / 使用 apt 安装、删除和升级软件包

在 Ubuntu 18.04 Server 中,可用 apt update 刷新软件包索引,再用 apt install、apt remove 和 apt upgrade 安装、删除和升级软件包。刷新索引并不等于升级程序;删除软件包或执行整体升级之前,应先检查计划变更的内容。

APT 的作用与操作前检查

APT(Advanced Package Tool,高级软件包工具)是一组利用软件源中的软件包和依赖信息管理软件的工具。依赖是程序运行时还需要的库或其他软件包。以下示例针对 Ubuntu 18.04 的 APT 1.6 系列;实际版本和变更计划取决于软件源及已安装软件包的状态。

Ubuntu 18.04 LTS 的标准安全维护已于 2023 年 5 月结束。对于现有服务器,还应确认 Ubuntu Pro 扩展安全维护的覆盖情况或操作系统升级计划。更换镜像或运行 apt upgrade 不会延长支持期限。支持范围见Ubuntu 官方发布周期。

安装、删除和刷新索引通常需要 sudo 权限,搜索与查看信息则不需要。在生产服务器上,应先备份配置和重要数据,并考虑服务可能重启,安排合适的操作时间。初次操作建议不加自动确认的 -y,自己阅读变更列表。

apt 面向终端中的交互操作。自动化脚本如果需要输出和行为的兼容性,应优先考虑 apt-get 和 apt-cache。尤其是 apt upgrade 与 apt-get upgrade 的默认依赖处理方式并不相同。详见Ubuntu 18.04 apt 手册。

搜索并安装软件包

示例使用显示目录结构的 tree 软件包。在实际服务器上替换为需要的软件包名称,但应先查看说明与候选版本。

  1. 从软件源下载最新的软件包信息。如果出现错误,应先解决,再继续下一步。
sudo apt update
  1. 搜索软件包并查看详情。apt-cache policy 可区分已安装版本、候选版本及软件来源。
apt search tree
apt show tree
apt-cache policy tree

apt search 也会搜索描述,因此结果可能包括名称中没有 tree 的软件包。用 apt show 查看描述、依赖和大小,并比较 apt-cache policy 的 Installed 与 Candidate。如果没有候选版本,先检查软件源和索引刷新结果。查询方法见apt-cache 手册。

  1. 模拟安装,检查将要安装、升级或删除的软件包,然后再实际安装。
sudo apt-get --simulate install tree

--simulate 不会实际更改软件包,但计划只反映运行时的系统状态,因此实际安装前也要阅读确认画面。如果有意外删除,请停止并检查依赖和软件源配置。

sudo apt install tree
  1. 安装后,检查软件包登记状态以及可执行程序是否能运行。
dpkg-query -W tree
tree --version

第一条命令显示登记的软件包名称和版本,第二条显示可执行程序的版本信息。如果没有新版本需要安装,APT 可能提示已经是最新版本。必要依赖会同时安装。操作及模拟选项见apt-get 手册。

刷新索引与升级软件包

update 只刷新软件源索引,不更改已安装程序。可用以下命令检查升级对象。

sudo apt update
apt list --upgradable
apt list --installed

apt list --upgradable 显示可升级软件包,apt list --installed 显示已安装软件包。单独使用 apt list 可列出符合名称条件等要求的软件包,但输出可能很多。

常规整体更新可使用 sudo apt upgrade。Ubuntu 18.04 中的 apt upgrade 可以添加必要的新依赖,但不会删除已有软件包。默认的 apt-get upgrade 则连新软件包也不安装,因此可能保留部分更新。

sudo apt upgrade

sudo apt full-upgrade 可能为解决依赖而删除已有软件包。不要因为常规升级保留了某些软件包就立即执行;应先检查安装、删除计划及对重要服务的影响。它也不是将 Ubuntu 18.04 升级到另一 Ubuntu 发行版的命令。

如果仍有更新,可用 apt-mark showhold 检查有意锁定的软件包。若只更新部分软件包或仅应用安全更新,请参阅仅升级指定软件包或安全更新的方法。操作后再次检查 apt list --upgradable,并单独判断运行中的服务或内核是否需要重启。

删除软件包并清理依赖和缓存

根据需要保留的配置和删除范围选择方法。以下命令是不同的选项,并不是需要全部依次执行的步骤。

命令 删除范围
apt remove tree 删除软件包,通常保留由软件包管理的配置文件。
apt purge tree 删除软件包及其管理的配置文件,并不表示会删除用户主目录内的所有文件。
apt autoremove 删除自动安装、目前已被判断为不再需要的依赖软件包。

例如删除 tree 时,应先模拟检查所有将被删除的对象,再执行实际删除。表中实际更改系统的命令应像下面示例一样加上 sudo。

sudo apt-get --simulate remove tree
sudo apt remove tree

如果还要删除配置,确认有必要后再选择 sudo apt purge tree。误用 remove 删除的软件包可用 sudo apt install tree 重装,但 purge 删除的自定义配置未必能靠重装恢复,因此需要备份。

清理依赖前也应先检查列表。如果包含直接使用的工具或运行所必需的软件包,请勿继续。

sudo apt-get --simulate autoremove
sudo apt autoremove

对于虽被列为自动删除候选、但仍要使用的软件包,可用 sudo apt-mark manual PACKAGE 标记为手动安装。将 PACKAGE 替换为实际名称。该标记不能修复其他依赖问题。详见apt-mark 手册。

若要保留已安装程序、只清理下载的软件包文件,可用 sudo apt clean。sudo apt autoclean 会清理已无法再下载的软件包缓存文件。它们不像 autoremove 那样删除已安装软件包。

检查软件源并更换镜像

Ubuntu 18.04 通常通过 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 中的单独文件配置软件源。下载慢或某个镜像失败时,应先确认错误中的主机与实际配置文件。

cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

选择镜像请使用Ubuntu 官方软件包仓库镜像列表,这与安装 ISO 的 CD 镜像列表不同。除地理位置外,还要检查同步状态及是否提供 bionic,不能认定某个镜像永远最快。

  1. 备份实际要编辑的文件。如果下面的备份名已经存在,请用其他名称保留原来的备份。
sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.backup
  1. 用默认编辑器打开文件,只修改相应 Ubuntu 镜像的地址部分。如果配置在单独文件中,应备份并修改那个文件。
sudoedit /etc/apt/sources.list

以下只是单行格式示例,不要用它覆盖整个文件。更换镜像时,应保留所需的 bionic、bionic-updates 等发行版区段,以及原有 main、universe 等组件。不要一并替换 security、Ubuntu Pro 或第三方软件源地址。

deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
  1. 保存后重新刷新索引,检查所需软件包的候选版本和来源。如果仍有错误,不要继续安装或升级。
sudo apt update
apt-cache policy tree

软件源格式见Ubuntu 18.04 sources.list 手册。即使出现 404,也不能将 bionic 改成其他 Ubuntu 版本的代号。应先确认镜像提供范围及当前支持的软件源路径。

错误排查与恢复范围

  • 找不到软件包:检查名称拼写、apt update 错误、所需的软件源组件与支持的架构。命令无法让软件源中不存在的软件包自动出现。
  • 锁定错误:确认是否有其他 apt、dpkg 操作或自动更新正在运行,并等待其正常完成。不要先删除锁文件或强制终止进程。
  • 签名或 Release 文件错误:检查软件源地址、发行版、密钥配置和服务器时间。不要通过关闭认证检查或未经信任验证就添加软件源来绕过问题。

如果此前的软件包操作确实中断,且没有其他管理任务运行,可按以下顺序处理未完成配置并检查依赖修复计划。第一条命令会实际执行待完成配置,应阅读输出;第二条只显示修复计划。

sudo dpkg --configure -a
sudo apt-get --simulate --fix-broken install

只有确认需要修复、且计划中没有意外删除重要软件包时,才执行 sudo apt --fix-broken install。不要对成因不同的错误反复套用修复命令。

若只想撤销镜像更换,请还原保存的配置文件并重新刷新索引。如果修改的是其他文件,就使用相应备份。

sudo cp -a /etc/apt/sources.list.backup /etc/apt/sources.list
sudo apt update

这只恢复软件源设置,不会回退已经安装、删除或升级的软件包,也不会恢复服务数据。生产服务器如需撤销软件包变更,应使用预先另行准备的配置与数据备份或快照,并按照服务的恢复步骤操作。