适用于:✔️ 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。 为此,请执行以下操作:
验证防火墙策略中是否允许目标 URL。
如果安全套接字层(SSL)检查处于活动状态,请验证是否允许 IP 地址。
如果使用网络安全组(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_proxy
和 https_proxy
。 若要验证代理是否已配置,请运行以下命令。
重要
如果 Ubuntu VM 和 Ubuntu 存储库地址之间不存在代理服务器,请搜索并删除 /etc/apt/apt.conf 文件中的任何代理配置设置。
env | grep -i proxy
方案 2:“apt update”命令失败,并返回“无法提取 <URL> 470 状态代码 470”
方案 2 详细信息
尝试运行 apt update
命令时,系统会尝试从多个源(包括 azure.archive.ubuntu.com
和 packages.microsoft.com
) security.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 反馈社区。