排查 Ubuntu 上的 APT 常见问题

适用于:✔️ Linux VM

本文讨论并提供在使用 apt 命令行工具在 Microsoft azure 虚拟机(VM)上安装或更新应用程序时可能会遇到的常见问题的解决方案。

注意

不再提供对 Canonical Ubuntu 18.04 LTS 的标准支持。 如果受到影响,请参阅 Canonical Ubuntu 18.04 LTS 已于 2023 年 5 月 31 日停止标准支持,以查看可用的选项。

概述

Ubuntu 上的 apt(高级包工具)命令是一种可用于包管理的功能强大的工具。 借助该命令可以在 Ubuntu 系统上安装、移除、更新和管理软件包。 可用于 apt 搜索可用包、安装特定版本的包以及高效处理依赖项。 它通过提供命令行接口来与 APT 库交互来简化软件管理过程。

先决条件

方案 1:连接在 azure.archive.ubuntu.com 超时

方案 1 详细信息

apt 更新、升级或安装操作期间,连接最终超时。此外,还会收到类似于以下输出字符串之一的错误消息:

  • 输出 1

    Err:2 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 dns-root-data all 2023112702~ubuntu0.22.04.1
      Unable to connect to azure.archive.ubuntu.com:http:
    Ign:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 bind9 amd64 1:9.18.18-0ubuntu0.22.04.2
    Err:1 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 bind9-utils amd64 1:9.18.18-0ubuntu0.22.04.2
      Could not connect to azure.archive.ubuntu.com:80 (52.147.219.192), connection timed out
    Err:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 bind9 amd64 1:9.18.18-0ubuntu0.22.04.2
      Unable to connect to azure.archive.ubuntu.com:http:
    E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/b/bind9/bind9-utils_9.18.18-0ubuntu0.22.04.2_amd64.deb  Could not connect to azure.archive.ubuntu.com:80 (52.147.219.192), connection timed out
    E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/d/dns-root-data/dns-root-data_2023112702%7eubuntu0.22.04.1_all.deb  Unable to connect to azure.archive.ubuntu.com:http:
    E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/b/bind9/bind9_9.18.18-0ubuntu0.22.04.2_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http:
    E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
    
  • 输出 2

    W: Tried to start delayed item http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 distro-info-data all 0.52ubuntu0.7, but failed
    W: Tried to start delayed item http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 distro-info-data all 0.52ubuntu0.7, but failed
    W: Tried to start delayed item http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 distro-info-data all 0.52ubuntu0.7, but failed
    W: Tried to start delayed item http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 distro-info-data all 0.52ubuntu0.7, but failed
    W: Tried to start delayed item http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 distro-info-data all 0.52ubuntu0.7, but failed
    

以下部分概述了这些故障的潜在原因,并提供解决连接问题的解决方案。

原因 1:VM 配置为使用内部负载均衡器

如果为网络接口配置了出站连接,则内部负载均衡器不提供出站连接。

解决方案 1a:添加公共 IP 地址

为 VM 的网络接口添加公共 IP 地址。 有关详细信息,请参阅 将公共 IP 地址关联到虚拟机

解决方案 1b:使用外部负载均衡器

使用外部 Azure 负载均衡器而不是内部 Azure 负载均衡器。 有关详细信息,请参阅快速入门:使用 Azure 门户创建公共负载均衡器,以便对 VM 进行负载均衡

解决方案 1c:在子网上使用 NAT 网关

使用 VM 子网上的网络地址转换(NAT)网关进行出站访问。 有关详细信息,请参阅 Azure NAT 网关资源

解决方案 1d:使用内部基本负载均衡器

降级以使用内部基本负载均衡器而不是内部标准负载均衡器。

注意

此解决方案只是临时修复,因为负载均衡器的基本版本计划停用。 有关详细信息,请参阅 Azure 基本负载均衡器将于 2025 年 9 月 30 日停用 - 请升级到标准负载均衡器

解决方案 1e:使用 SNAT 规则

使用源网络地址转换(SNAT)规则。 有关详细信息,请参阅 将 SNAT 用于出站连接

原因 2:外部负载均衡器没有出站规则并禁用出站 SNAT

外部负载均衡器必须具有出站连接,才能访问 Ubuntu 存储库。

解决方案 2:配置出站规则或验证是否已启用出站 SNAT

执行下表中列出的一个或多个操作。

操作 指南
设置出站规则。 配置出站规则
启用出站 SNAT。 将 SNAT 用于出站连接

原因 3:Azure 防火墙或虚拟设备位于虚拟网络和 Internet 之间

Azure 防火墙或虚拟设备可能充当 Azure 虚拟网络和 Internet 之间的保护屏障。 此屏障强制实施安全策略,并提供通过将所有流量发送到防火墙来控制和监视流量的功能。 在这种情况下,防火墙会阻止与 Ubuntu 存储库的通信。

解决方案 3:确保允许 Ubuntu 地址

确保 azure.archive.ubuntu.com 可以完全访问任何其他存储库 URL。 为此,请执行以下操作:

  1. 验证防火墙策略中是否允许目标 URL。

  2. 如果安全套接字层(SSL)检查处于活动状态,请验证是否允许 IP 地址。

  3. 如果使用网络安全组(NSG),请确保将 Ubuntu IP 地址和端口 80 和 443 添加到网络接口 NSG 或子网 NSG 的出站规则允许列表。 这些例外应优先于 Block_Internet_Access_outbound 规则。 此外,请参阅 检查应用于虚拟机流量的安全规则。

原因 4:VM 已连接到专用子网

专用子网不提供默认出站访问,增强了安全性。 若要启用 VM 访问 Internet 的出站连接,必须显式授予出站访问权限。 有关详细信息,请参阅 “添加专用子网”功能

解决方案 4:为子网提供出站连接

建议使用 NAT 网关为子网中的 VM 提供出站连接。 有关详细信息,请参阅 什么是 Azure NAT 网关?

原因 5:代理用于通信

Internet 通信通过影响与 Ubuntu 存储库通信的客户代理。

解决方案 5:修复代理配置设置

如果在 Ubuntu VM 和 Ubuntu 存储库之间的 azure Microsoft配置代理服务器,请使用 /etc/apt/apt.conf 文件中的正确代理配置设置,如以下代码片段所示。

重要

如果配置的代理服务器具有专用 IP 地址,请确保它在 Azure 公共地址空间中具有连接性。

Acquire::http::Proxy "http://[username]:[password]@ [proxy-web-or-IP-address]:[port-number]";
Acquire::https::Proxy "http://[username]:[password]@ [proxy-web-or-IP-address]:[port-number]";

此外,对于 Ubuntu 和其他类似 Unix 的操作系统,可以使用环境变量为 HTTP 和 HTTPS 流量设置代理。 相关的环境变量是 http_proxyhttps_proxy。 若要验证代理是否已配置,请运行以下命令。

重要

如果 Ubuntu VM 和 Ubuntu 存储库地址之间不存在代理服务器,请搜索并删除 /etc/apt/apt.conf 文件中的任何代理配置设置

env | grep -i proxy

方案 2:“apt update”命令失败,并返回“无法提取 <URL> 470 状态代码 470”

方案 2 详细信息

尝试运行 apt update 命令时,系统会尝试从多个源(包括 azure.archive.ubuntu.compackages.microsoft.comsecurity.ubuntu.com提取包信息。 但是,该命令返回“无法提取 <URL> 470 状态代码 470”错误消息,如以下示例所示:

Err: 3 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease
  470  status code 470[IP: 23.101.248.31 80]
Err: 4 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease
  470  status code 470[IP: 23.101.248.31 80]
Ign:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease
Err:6 https://packages.microsoft.com/ubuntu/20.04/prod focal Release
  Could not handshake: The TLS connection was not properly terminated. [IP: 52.230.121.169  443]
Reading package lists...

[stderr]
E: The repository 'http://security.ubuntu.com/ubuntu focal-security InRelease' is no longer signed.
E: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease 470 status code 470 [IP: 91.189.91.82 80]
E: The repository 'http://security.ubuntu.com/ubuntu focal InRelease' is no longer signed.
E: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal/InRelease 470 status code 470 [IP: 23.101.248.31 80

原因:防火墙或 NSG 阻止所需的 URL

来自 Ubuntu 系统的流量通过虚拟设备(防火墙)路由,但此设备拒绝访问某些 URL,从而导致与包更新和安装相关的问题。

或者,NSG 可能会阻止端口 80 或 443 上的出站连接。

解决方案:允许防火墙配置上的所需 URL

使用包管理系统(例如 apt 在 Ubuntu 中)时,请确保允许通过防火墙访问所有必需的 URL 和域。

如果使用 NSG,请确保将 Ubuntu IP 地址和端口 80 和 443 添加到网络接口 NSG 或子网 NSG 的出站规则允许列表。 这些例外应优先于 Block_Internet_Access_outbound 规则。

方案 3:签名验证期间出错

方案 3 详细信息

运行 apt update 命令时,系统会尝试从多个源(包括 azure.archive.ubuntu.com 和第三方存储库)提取包信息,例如 download.opensuse.org。 但是,命令失败,如以下控制台输出所示:

sudo apt update
Hit:1 http://azure.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease
Get:5 http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04  InRelease [1262 B]
Err:5 http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04  InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4D64390375060AA4
Fetched 1262 B in 1s (1142 B/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
16 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04  InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4D64390375060AA4
W: Failed to fetch http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4D64390375060AA4
W: Some index files failed to download. They have been ignored, or old ones used instead.
root@ubu24vmlbe:/etc/apt# 

原因:第三方存储库缺少 GPG 密钥

在 /etc/apt/sources.list 文件或 /etc/apt/sources.list.d/ 文件夹中添加了新的第三方存储库,但它缺少用于验证存储库中包真实性的公钥文件。 在 Ubuntu 中,存储库通常使用 GPG 密钥来确保下载的包来自受信任的源,并且不会被篡改。

解决方案:为第三方存储库添加 GPG 密钥

将新存储库添加到 Ubuntu 系统时,通常需要导入与该存储库关联的 GPG 密钥,以确保系统信任来自该源的包。

如果要将此存储库添加到系统,请确保密钥实际上是来自受信任的源,例如官方网站或受信任的社区成员。 验证 GPG 密钥的真实性后,可以通过运行 apt-key 命令或将其 置于 /etc/apt/trusted.gpg.d/ 文件夹中,将其添加到系统中,如以下命令中所示:

重要

由于此存储库是第三方存储库,因此应验证提供的 GPG 密钥的真实性。 若要获取存储库的正确 GPG 密钥,请参阅文档或咨询与第三方存储库关联的官方源。 使用不正确的或未经授权的 GPG 密钥可能会给系统带来安全风险。

sudo curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_22.04/Release.key | sudo tee /etc/apt/trusted.gpg.d/devel_kubic_libcontainers_unstable.gpg > /dev/null

通过运行 curl 提取 GPG 密钥后,也可以通过运行 gpg --dearmor 命令将 GPG 密钥转换为适合 APT 的格式,然后将其直接 保存到 /etc/apt/trusted.gpg.d/ 文件夹中。 此替代方法可确保系统在不依赖 apt-key 命令的情况下安全地管理和信任 GPG 密钥:

curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_22.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/devel_kubic_libcontainers_unstable.gpg > /dev/null

注意

如果找不到此第三方存储库的正确 GPG 密钥,建议从 /etc/apt/sources.list 文件或 /etc/apt/sources.list.d/ 文件夹中删除存储库条目。 此操作可确保 apt update 命令正常运行并降低遇到与 GPG 键相关的错误的风险。 确定安全性的优先级,并且仅从具有有效 GPG 密钥的受信任源添加存储库。

方案 4:出现“解决”azure.archive.ubuntu.com“的临时故障”错误消息

方案 4 详细信息

运行 apt update 命令时,系统会尝试从多个源(包括 azure.archive.ubuntu.com) 提取包信息。 但是,在包的更新或安装过程中,会收到“临时失败解决'azure.archive.ubuntu.com'”错误消息,如以下输出所示:

Ign:4 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease
Err:1 http://azure.archive.ubuntu.com/ubuntu jammy InRelease
  Temporary failure resolving 'azure.archive.ubuntu.com'
Err:2 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease
  Temporary failure resolving 'azure.archive.ubuntu.com'
Err:3 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease
  Temporary failure resolving 'azure.archive.ubuntu.com'
Err:4 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease
  Temporary failure resolving 'azure.archive.ubuntu.com'
Reading package lists... Done              
Building dependency tree... Done
Reading state information... Done
16 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/dists/jammy/InRelease  Temporary failure resolving 'azure.archive.ubuntu.com'
W: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease  Temporary failure resolving 'azure.archive.ubuntu.com'
W: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease  Temporary failure resolving 'azure.archive.ubuntu.com'
W: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/dists/jammy-security/InRelease  Temporary failure resolving 'azure.archive.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.

原因:自定义 DNS 无法解析 Ubuntu 存储库

你使用的是未正常运行的自定义域名系统(DNS)解析程序。 或者,受影响的 VM 位于与 DNS 服务器位于不同的子网上。

解决方案:验证和更新 DNS 解析程序

验证自定义 DNS 解析程序是否实际上是问题的原因。 可以尝试在网络接口级别切换回 Azure 提供的默认 DNS 服务器。 有关详细信息,请参阅更改 DNS 服务器

如果 Azure DNS 按预期工作,请验证内部域名,并确保可以在端口 53 上访问它。

如果 DNS 服务器位于 Azure 上,但驻留在不同的子网中,请确保其具有正确的用户定义的路由(UDR),以访问受影响 VM 的子网。

方案 5:内核安装过程中出现“dpkg:错误处理包”错误消息

方案 5 详细信息

尝试通过运行以下命令 apt 安装或重新安装内核时,将显示类似于以下文本的错误消息:

Processing triggers for linux-image-5.4.0-1051-azure (5.4.0-1051.53) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-5.4.0-1051-azure
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
/usr/sbin/grub-mkconfig: 34: /etc/default/grub: Syntax error: EOF in backquote substitution
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 2
dpkg: error processing package linux-image-5.4.0-1051-azure (--configure):
 installed linux-image-5.4.0-1051-azure package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 linux-image-5.4.0-1051-azure
E: Sub-process /usr/bin/dpkg returned an error code (1)

原因:/etc/default/grub 中存在语法错误

/etc/default/grub 配置文件中的语法错误存在。 linux-image-5.4.0-1051-azure 包的安装后脚本在尝试分析配置时可能会遇到此错误。

解决方案:修复 /etc/default/grub 中的语法错误

在 /etc/default/grub 文件中查找任何语法错误,尤其是在安装后脚本可能遇到的行周围。 修复找到的任何语法错误。 此文件的语法对于 GRand Unified Bootloader(GRUB)的正确运行至关重要。

在以下示例中,行中 GRUB_CMDLINE_LINUX 缺少右引号会导致 GRUB 配置文件中的语法错误:

# cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="    # <---

若要更正此特定错误,请在行尾添加右引号。 更正后的行应类似于以下代码:

GRUB_CMDLINE_LINUX=" "

更正 GRUB 配置文件中的语法错误后,请重试重新安装内核包。

方案 6:“存储库'http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-armhf/Packages 焦点发布'没有发布文件”

方案 6 详细信息

运行 apt update 命令时,系统会尝试从多个源中提取包信息。 但是,收到有关缺少 Release 文件的错误消息,如以下输出所示:

Ign:1 http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-armhf/Packages focal InRelease
Hit:2 http://azure.archive.ubuntu.com/ubuntu focal InRelease                   
Hit:3 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease           
Hit:4 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease
Hit:5 http://azure.archive.ubuntu.com/ubuntu focal-security InRelease
Hit:6 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease
Err:7 http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-armhf/Packages focal Release
  404  Not Found [IP: 91.189.91.83 80]
Reading package lists... Done
E: The repository 'http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-armhf/Packages focal Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

原因:apt 工具指向 x86_64 虚拟机上的 ARM 处理器体系结构包

apt 命令将搜索命令下载存储库数据时定义 APT::Architectures 的所有体系结构。

在此方案中,你将运行x86_64 VM,但 /etc/apt/sources.list 文件中的两行引用 ARM 处理器体系结构:

sudo cat  /etc/apt/sources.list | grep -i armhf
deb http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-armhf/Packages focal main
deb-src  http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-armhf/Packages focal main

如果任何应用程序自动编辑 sources.list 文件或添加 /etc/apt/sources.list.d/ 文件夹下的存储库,然后包括 armhf 存储库,则会发生相同的错误。

解决方案:从 sources.list 中删除或注释掉 armhf 信息

删除或注释掉引用 /etc/apt/sources.list 文件或 /etc/apt/sources.list.d/*.list 中的 ARM 处理器体系结构的行。

第三方联系人免责声明

Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区