突然,服务器拒绝“apt update”,因为“执行 apt-key 时出现未知错误”

突然,服务器拒绝“apt update”,因为“执行 apt-key 时出现未知错误”

问题

更新:目前正在使用 strace 进行调查。问题似乎是访问存储库时出现 HTTP 400 错误

UPDATE2:服务器中出现更多奇怪的错误(.so lib 文件损坏,数据库引擎显示“未知错误”),因此此问题似乎是由于硬件错误造成的。

Unknown error executing apt-key

例如,apt update执行的一个片段:

[...]
Get:3 http://deb.debian.org/debian buster-updates InRelease [56,6 kB] 
[...]
Err:3 http://deb.debian.org/debian buster-updates InRelease
  Unknown error executing apt-key
[...]
W: GPG error: http://deb.debian.org/debian buster-updates InRelease: Unknown error executing apt-key
E: The repository 'http://deb.debian.org/debian buster-updates InRelease' is not signed.
[...]

这从很久以前开始就运作良好,并且在一夜之间就开始发生。没有对服务器做任何特别的事情。

我有其他配置几乎相同的服务器,它们工作正常。

我在 apt 和系统日志中没有看到相关条目。

我尝试过的

有一些帖子说我必须删除/var/lib/apt、检查可信密钥和类似的方法。没有一个起作用。

我检查了输出apt-key list:该列表几乎与另一台工作正常的服务器相同,另一台服务器只是 Jenkins 存储库多了一个密钥。

输出是这样的:

/etc/apt/trusted.gpg.d/debian-archive-bullseye-security-automatic.gpg
---------------------------------------------------------------------
pub   rsa4096 2021-01-17 [SC] [expires: 2029-01-15]
      AC53 0D52 0F2F 3269 F5E9  8313 A484 4904 4AAD 5C5D
uid           [ unknown] Debian Security Archive Automatic Signing Key (11/bullseye) <[email protected]>
sub   rsa4096 2021-01-17 [S] [expires: 2029-01-15]

/etc/apt/trusted.gpg.d/debian-archive-bullseye-stable.gpg
---------------------------------------------------------
pub   rsa4096 2021-02-13 [SC] [expires: 2029-02-11]
      A428 5295 FC7B 1A81 6000  62A9 605C 66F0 0D6C 9793
uid           [ unknown] Debian Stable Release Key (11/bullseye) <[email protected]>

/etc/apt/trusted.gpg.d/debian-archive-buster-automatic.gpg
----------------------------------------------------------
pub   rsa4096 2019-04-14 [SC] [expires: 2027-04-12]
      80D1 5823 B7FD 1561 F9F7  BCDD DC30 D7C2 3CBB ABEE
uid           [ unknown] Debian Archive Automatic Signing Key (10/buster) <[email protected]>
sub   rsa4096 2019-04-14 [S] [expires: 2027-04-12]

/etc/apt/trusted.gpg.d/debian-archive-buster-security-automatic.gpg
-------------------------------------------------------------------
pub   rsa4096 2019-04-14 [SC] [expires: 2027-04-12]
      5E61 B217 265D A980 7A23  C5FF 4DFA B270 CAA9 6DFA
uid           [ unknown] Debian Security Archive Automatic Signing Key (10/buster) <[email protected]>
sub   rsa4096 2019-04-14 [S] [expires: 2027-04-12]

因为我有其他配置几乎相同的服务器(相同的 Debian 10 操作系统、非常相似的安装包等),所以我拼命尝试将它们/var/lib/apt/ec/apt文件夹复制到这个有故障的服务器:错误仍然存​​在。

因为我怀疑GPG可能是错误的,所以我尝试重新安装它。我从 Debian 存储库下载了该软件包并使用 dpkg 安装:结果相同,问题仍然存在。

启用 apt 调试:与工作服务器有何不同

您可以启用 apt 调试。就我而言,我使用:

apt -o Debug::Acquire::http=false -o Debug::Hashes=true -o Debug::pkgAcquire::Auth=true -o Debug::sourceList=true  update

这很有趣。我已经评论了所有来源,但deb http://deb.debian.org/debian buster main contrib non-free.故障服务器产生:

# apt -o Debug::Acquire::http=false -o Debug::Hashes=true -o Debug::pkgAcquire::Auth=true -o Debug::sourceList=true  update
Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
201 URI Done: http://deb.debian.org/debian/dists/buster/InRelease
ReceivedHash:
        - SHA512:c65abc258e9ecc7e506133502add58d9c451bc11c3dd9bf7f23a0d58fb0f7747cc75bee22e58dece5af63f6a1cc7dd7c150a383fbd79ce23655c7aca6c32b78c
        - SHA256:45420bba913bb4d35b98319d893d9db2bc0c4034a12c65f07118dd36ee4cea86
        - SHA1:dcbc9207da6730f5a268f7c8f452ad62f0fd9705
        - MD5Sum:2f497e0885083bf377d7f5cafe9b1762
        - Checksum-FileSize:121570
ExpectedHash:

Err:1 http://deb.debian.org/debian buster InRelease
  Unknown error executing apt-key
Reading package lists... Done
W: GPG error: http://deb.debian.org/debian buster InRelease: Unknown error executing apt-key
E: The repository 'http://deb.debian.org/debian buster InRelease' is not signed.
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 -o Debug::Acquire::http=false -o Debug::Hashes=true -o Debug::pkgAcquire::Auth=true -o Debug::sourceList=true  update
0% [Working]201 URI Done: http://deb.debian.org/debian/dists/buster/InRelease
ReceivedHash:
ExpectedHash:

Hit:1 http://deb.debian.org/debian buster InRelease
0% [Working]201 URI Done: http://deb.debian.org/debian/dists/buster/InRelease
ReceivedHash:
ExpectedHash:

Signature verification succeeded: /var/lib/apt/lists/deb.debian.org_debian_dists_buster_InRelease
Got Codename: buster
Got Suite: oldstable
Expecting Dist: buster
Reading package lists... Done
Building dependency tree       
Reading state information... Done
All packages are up to date.

正如您所看到的,故障服务器似乎收到了一些哈希值,但没有预期的哈希值,而工作服务器根本没有哈希值?

其他来源又如何呢?如果我尝试使用deb http://deb.debian.org/debian buster-updates main contrib non-free,故障服务器会输出:

# apt -o Debug::Acquire::http=false -o Debug::Hashes=true -o Debug::pkgAcquire::Auth=true -o Debug::sourceList=true  update
Get:1 http://deb.debian.org/debian buster-updates InRelease [56,6 kB]
0% [1 InRelease 56,6 kB/56,6 kB 100%]201 URI Done: http://deb.debian.org/debian/dists/buster-updates/InRelease
ReceivedHash:
        - SHA512:3542a4de41bdffba0631f27efdf2dd69602b77b1dd7362285527d3e96d22daaae1165979fc83a740049e2c54de455f798c07f0120baeafd316dd2e9efd68faab
        - SHA256:65d8f69e329505a4abdc3968778e36adae20b8542eed9745c60c47bc90ea4c05
        - SHA1:e901931cf25b06819fe1a653b39621b5e42a0109
        - MD5Sum:db7403e0f919a66b1e05ed537962d333
        - Checksum-FileSize:56621
ExpectedHash:

Err:1 http://deb.debian.org/debian buster-updates InRelease
  Unknown error executing apt-key
Reading package lists... Done
W: GPG error: http://deb.debian.org/debian buster-updates InRelease: Unknown error executing apt-key
E: The repository 'http://deb.debian.org/debian buster-updates InRelease' is not signed.
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.

或多或少与以前相同的错误。它在 ReceivedHash 中包含多个键,但在 ExpectedHash 中包含空值。

工作服务器怎么样?它输出:

# apt -o Debug::Acquire::http=false -o Debug::Hashes=true -o Debug::pkgAcquire::Auth=true -o Debug::sourceList=true  update
Get:1 http://deb.debian.org/debian buster-updates InRelease [56,6 kB]
0% [1 InRelease 16,4 kB/56,6 kB 29%]201 URI Done: http://deb.debian.org/debian/dists/buster-updates/InRelease
ReceivedHash:
        - SHA512:3542a4de41bdffba0631f27efdf2dd69602b77b1dd7362285527d3e96d22daaae1165979fc83a740049e2c54de455f798c07f0120baeafd316dd2e9efd68faab
        - SHA256:65d8f69e329505a4abdc3968778e36adae20b8542eed9745c60c47bc90ea4c05
        - SHA1:e901931cf25b06819fe1a653b39621b5e42a0109
        - MD5Sum:db7403e0f919a66b1e05ed537962d333
        - Checksum-FileSize:56621
ExpectedHash:

0% [Working]201 URI Done: http://deb.debian.org/debian/dists/buster-updates/InRelease
ReceivedHash:
ExpectedHash:

Signature verification succeeded: /var/lib/apt/lists/partial/deb.debian.org_debian_dists_buster-updates_InRelease

....还有很多关于它下载的其他文件的其他行,但我想它们对这个问题并不感兴趣。

在这种情况下,工作服务器还会接收 ReceivedHash 中的哈希值和 ExpectedHash 中的空值。

访问存储库时出现 400 错误

好吧,让我们深入研究一下。让我们使用strace.这是有趣的部分:

lchown("/var/lib/apt/lists/partial/deb.debian.org_debian_dists_buster-updates_InRelease", 100, 0) = 0
lstat("/var/lib/apt/lists/partial/deb.debian.org_debian_dists_buster-updates_InRelease", {st_mode=S_IFREG|0644, st_size=56621, ...}) = 0
chmod("/var/lib/apt/lists/partial/deb.debian.org_debian_dists_buster-updates_InRelease", 0600) = 0
rt_sigprocmask(SIG_BLOCK, [WINCH], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
0% [Working])   = 18% [Working]", 18
write(1, "\33[0m", 4)                   = 4
select(11, [5 6], [10], NULL, {tv_sec=0, tv_usec=500000}) = 1 (out [10], left {tv_sec=0, tv_usec=499997})
write(10, "601 Configuration\nConfig-Item: A"..., 11121) = 11121
select(7, [5 6], [], NULL, {tv_sec=0, tv_usec=499997}) = 1 (in [6], left {tv_sec=0, tv_usec=364398})
read(6, "400 URI Failure\nMessage: Unknown"..., 64000) = 148
stat("/var/lib/apt/lists/partial/deb.debian.org_debian_dists_buster-updates_InRelease", {st_mode=S_IFREG|0600, st_size=56621, ...}) = 0
getuid()                                = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 7
connect(7, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = 0
sendto(7, "\2\0\0\0\0\0\0\0\5\0\0\0root\0", 17, MSG_NOSIGNAL, NULL, 0) = 17
poll([{fd=7, events=POLLIN|POLLERR|POLLHUP}], 1, 5000) = 1 ([{fd=7, revents=POLLIN}])

具体来说,这一行:

read(6, "400 URI Failure\nMessage: Unknown"..., 64000) = 148

传输过程中似乎出现错误。

现在做什么?

如何深入了解 HTTP 错误?我可以使用apt-key来模仿返回400的请求吗?我能做些什么来解决这个问题(除了忽略 GPG 标志检查)?或者我还可以做哪些其他检查来找到问题的根本原因?

答案1

您可能是存储库镜像错误的受害者。或者 Web 过滤器(如果您的站点有)可能会阻止系统访问 Debian 存储库。deb.debian.org是一个 GeoIP 重定向器,它尝试将您连接到离您最近的 Debian 存储库。 Web 过滤器可能不完全了解重定向器可能发送给您的所有地址。

InRelease 文件可以通过简单的手动下载:

wget http://ftp.debian.org/debian/dists/buster/InRelease

或者

curl http://ftp.debian.org/debian/dists/buster/InRelease > InRelease

据我所知,自 2022 年 9 月 10 日以来,生成的文件没有发生变化,大小应该正好是 121570 字节。这与 Debian 10.12 于当天发布的事实相符,并且该版本标记为Debian 10 向长期支持的过渡。

生成的文件应该是 PGP 签名的文本文件,其开头为:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Origin: Debian
Label: Debian
Suite: oldstable
Version: 10.13
Codename: buster
Changelogs: http://metadata.ftp-master.debian.org/changelogs/@CHANGEPATH@_changelog
Date: Sat, 10 Sep 2022 11:30:54 UTC
Acquire-By-Hash: yes

如果您得到不同的结果,则可能是来自本地 Web 过滤器代理(如果您的站点有)的通知页面,或者您最终连接到的镜像站点可能出现磁盘故障并且尚未完全重新镜像该文件,可能会导致文件不完整。您的 strace 表明stat()系统调用正在返回st_size=56621,因此您似乎得到了不完整或不同的文件。

如果生成的文件看起来是 HTML 文件,请将其重命名为something.html并使用 Web 浏览器查看它。如果是来自本地 Web 过滤器的通知,您可能需要联系该过滤器的管理员。如果是其他 HTML 错误页面,存储库deb.debian.org会指出您可能遇到某种错误。

如果您等不及存储库得到修复,您可以随时访问https://www.debian.org/mirror/list并选择一两个靠近您的镜像,暂时将您配置sources.list为使用它们而不是deb.debian.org,然后尝试解决有问题的存储库。

答案2

使用救援磁盘重新启动后,我用来fsck检查 EXT4 文件系统:有数百个错误。

然后,我重新安装了每个已安装的软件包以修复任何损坏的二进制文件。

之后,apt错误就消失了。这是由于与apt.

更新SSD快要死了,最后我不得不切换到另一台服务器。备份有效,在此事件中没有数据受到损害。

相关内容