Внезапно сервер отказывается выполнять ‘apt update’ из-за ‘Неизвестной ошибки при выполнении apt-key’

Вопрос или проблема

Проблема

ОБНОВЛЕНИЕ: В настоящее время исследую с помощью strace. Проблема, кажется, является ошибкой HTTP 400 при доступе к репозиторию

ОБНОВЛЕНИЕ2: Больше странных ошибок на сервере (поврежденный файл .so, движок базы данных отображает ‘Неизвестная ошибка’), так что, похоже, эта проблема связана с аппаратной ошибкой.

Неизвестная ошибка при выполнении 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
  Неизвестная ошибка при выполнении apt-key
[...]
W: Ошибка GPG: http://deb.debian.org/debian buster-updates InRelease: Неизвестная ошибка при выполнении apt-key
E: Репозиторий 'http://deb.debian.org/debian buster-updates InRelease' не подписан.
[...]

Это работало идеально долгое время и начало происходить неожиданно. Ничего особенного не было сделано с сервером.

У меня есть другие серверы с почти такой же конфигурацией, и они работают нормально.

Я не вижу никаких релевантных записей в журналах 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] [истекает: 2029-01-15]
      AC53 0D52 0F2F 3269 F5E9  8313 A484 4904 4AAD 5C5D
uid           [ неизвестно] Автоматический ключ подписи безопасности Debian (11/bullseye) <[email protected]>
sub   rsa4096 2021-01-17 [S] [истекает: 2029-01-15]

/etc/apt/trusted.gpg.d/debian-archive-bullseye-stable.gpg
---------------------------------------------------------
pub   rsa4096 2021-02-13 [SC] [истекает: 2029-02-11]
      A428 5295 FC7B 1A81 6000  62A9 605C 66F0 0D6C 9793
uid           [ неизвестно] Ключ стабильного релиза Debian (11/bullseye) <[email protected]>

/etc/apt/trusted.gpg.d/debian-archive-buster-automatic.gpg
----------------------------------------------------------
pub   rsa4096 2019-04-14 [SC] [истекает: 2027-04-12]
      80D1 5823 B7FD 1561 F9F7  BCDD DC30 D7C2 3CBB ABEE
uid           [ неизвестно] Автоматический ключ подписи архивов Debian (10/buster) <[email protected]>
sub   rsa4096 2019-04-14 [S] [истекает: 2027-04-12]

/etc/apt/trusted.gpg.d/debian-archive-buster-security-automatic.gpg
-------------------------------------------------------------------
pub   rsa4096 2019-04-14 [SC] [истекает: 2027-04-12]
      5E61 B217 265D A980 7A23  C5FF 4DFA B270 CAA9 6DFA
uid           [ неизвестно] Автоматический ключ подписи безопасности Debian (10/buster) <[email protected]>
sub   rsa4096 2019-04-14 [S] [истекает: 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
  Неизвестная ошибка при выполнении apt-key
Чтение списков пакетов... Готово
W: Ошибка GPG: http://deb.debian.org/debian buster InRelease: Неизвестная ошибка при выполнении apt-key
E: Репозиторий 'http://deb.debian.org/debian buster InRelease' не подписан.
N: Обновление из такого репозитория не может быть выполнено безопасно, и поэтому по умолчанию отключено.
N: См. man-страницу apt-secure(8) для получения информации о создании репозиториев и конфигурации пользователя.

Однако работающие серверы выводят:

# apt -o Debug::Acquire::http=false -o Debug::Hashes=true -o Debug::pkgAcquire::Auth=true -o Debug::sourceList=true  update
0% [Работает]201 URI Done: http://deb.debian.org/debian/dists/buster/InRelease
ReceivedHash:
ExpectedHash:

Hit:1 http://deb.debian.org/debian buster InRelease
0% [Работает]201 URI Done: http://deb.debian.org/debian/dists/buster/InRelease
ReceivedHash:
ExpectedHash:

Проверка подписи прошла успешно: /var/lib/apt/lists/deb.debian.org_debian_dists_buster_InRelease
Получено Кодовое имя: buster
Получено Версия: oldstable
Ожидание Dist: buster
Чтение списков пакетов... Готово
Формирование дерева зависимостей       
Чтение информации о состоянии... Готово
Все пакеты актуальны.

Как видите, неисправный сервер, похоже, получает некоторые контрольные суммы и не имеет ожидаемой контрольной суммы, в то время как работающий сервер не имеет вообще никаких контрольных сумм?

Что насчет других источников? Если я попробую с 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
  Неизвестная ошибка при выполнении apt-key
Чтение списков пакетов... Готово
W: Ошибка GPG: http://deb.debian.org/debian buster-updates InRelease: Неизвестная ошибка при выполнении apt-key
E: Репозиторий 'http://deb.debian.org/debian buster-updates InRelease' не подписан.
N: Обновление из такого репозитория не может быть выполнено безопасно, и поэтому по умолчанию отключено.
N: См. man-страницу apt-secure(8) для получения информации о создании репозиториев и конфигурации пользователя.

Больше или меньше та же ошибка, что и раньше. Она включает несколько ключей в 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% [Работает]201 URI Done: http://deb.debian.org/debian/dists/buster-updates/InRelease
ReceivedHash:
ExpectedHash:

Проверка подписи прошла успешно: /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% [Работает])   = 18% [Работает]", 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 Конфигурация\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)? Или какие другие проверки я могу сделать, чтобы определить корень проблемы?

Вы можете быть жертвой ошибки зеркалирования репозитория. Или веб-фильтр (если он есть на вашем сайте) может блокировать доступ системы к репозиторию Debian. deb.debian.org является редиректором GeoIP, который пытается подключить вас к репозиторию Debian, который находится ближе всего к вам. Веб-фильтр может не иметь полного знания обо всех адресах, на которые редиректор может вас отправить.

Файл InRelease можно скачать вручную с помощью простого:

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

или

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

На сколько я вижу, результирующий файл не изменился с 2022-09-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

Если вы получите что-то другое, это может быть страница уведомления от вашего локального прокси веб-фильтра (если он есть на вашем сайте), или, возможно, сайт-репозиторий, к которому вы в конечном итоге подключаетесь, имел сбой диска и еще не полностью обновил этот файл, что может привести к неполному файлу. Ваш strace указывает, что stat() системный вызов возвращает st_size=56621, так что, похоже, вы получаете неполный или другой файл.

Если результирующий файл выглядит как HTML-документ, переименуйте его в что-то.html и просмотрите его в веб-браузере. Если это уведомление от локального веб-фильтра, возможно, вам придется связаться с администратором этого фильтра. Если это другая веб-страница с ошибкой HTML, репозиторий deb.debian.org, на который вы указываете, может страдать от какой-то ошибки.

Если вы не можете дождаться, когда репозиторий будет исправлен, вы всегда можете перейти на https://www.debian.org/mirror/list и выбрать один или два зеркала, близких к вам, временно настроить ваш sources.list, чтобы использовать их вместо deb.debian.org, и попробовать обойти неисправный репозиторий.

После перезагрузки с помощью диска восстановления я использовал fsck для проверки файловой системы EXT4: было несколько сотен ошибок.

Затем я переустановил все установленные пакеты, чтобы исправить любые поврежденные бинарные файлы.

После этого ошибка apt исчезла. Это была ошибка из-за поврежденного файла, связанного с некоторым пакетом, используемым apt.

ОБНОВЛЕНИЕ
SSD умирал, и в конце концов мне пришлось переключиться на другой сервер. Резервные копии сработали, никаких данных не было потеряно в ходе этого инцидента.

У меня была эта Неизвестная ошибка при выполнении apt-key после установки файла в /etc/apt/trusted.gpg.d в системе, у которой был UMASK 077 в /etc/login.defs, поэтому файл был создан как 700, и, по-видимому, apt-key не может его прочитать, потому что он не выполняется от имени пользователя root. chmod 644 /etc/apt/trusted.gpg.d/<file>.asc исправило это.

Ответ или решение

Ситуация, описанная вами, представляет собой сложную проблему, связанную с обновлением пакетов на сервере Debian, вызванную ошибкой в работе apt-key. Возможно, это связано как с программными конфликтами, так и с аппаратными неполадками. Давайте подробно разберем все этапы диагностики и возможные решения данной проблемы.

1. Понимание проблемы

Ошибка Unknown error executing apt-key, возникшая при попытке выполнить команду apt update, может быть вызвана несколькими причинами. Основные из них:

  • Повреждение ключей GPG: Ключи, используемые для подписи репозиториев, могут быть повреждены.
  • Сетевые проблемы: Ошибка 400, полученная при подключении к репозиторию, свидетельствует о проблемах с HTTP-запросами.
  • Аппаратные сбои: Указание на возможные сбои оборудования может означать, что файловая система повреждена или есть сбои с памятью.

2. Диагностика

Сначала необходимо выявить суть проблемы, используя различные методы:

2.1 Проверка состояния файловой системы

Запустите команду fsck для проверки и исправления возможных ошибок в файловой системе:

fsck /dev/sdX

Замените /dev/sdX на соответствующее имя вашего диска. Это может помочь в исправлении повреждений на диске, которые могут вызывать ошибки в GPG ключах и в работе apt.

2.2 Изучение логов

Проверьте системные логи (/var/log/syslog, /var/log/apt/term.log) на наличие других ошибок, которые могут указывать на проблемы с системными библиотеками или сетью.

2.3 Проверка состояния репозиториев

Используйте curl или wget для загрузки InRelease файла напрямую:

curl -I http://deb.debian.org/debian/dists/buster/InRelease

Это покажет, какой ответ возвращает сервер при запросе.

2.4 Проверка GPG ключей

Убедитесь, что ваши ключи GPG не повреждены. Попробуйте перепроверить их:

apt-key list

Если ключи повреждены, их можно переустановить или обновить.

3. Решение проблемы

После диагностики, если вы подтвердили, что аппаратные сбои становятся причиной ошибок в работе apt, необходимо предпринять следующие шаги:

3.1 Восстановление системы

Если вы заметили, что файловая система сильно повреждена или получила много ошибок, попробуйте восстановить пакеты, выполнив:

dpkg --configure -a
apt --fix-broken install

Это восстановит поврежденные пакеты на вашем сервере.

3.2 Переустановка ключей GPG

Если ключи не работают, попробуйте удалить их и переустановить необходимые ключи для репозиториев.

3.3 Смена репозиториев

Если ошибка 400 все еще возникает, попробуйте временно изменить репозиторий на другой, выбирая его из списка зеркал на официальном сайте Debian.

3.4 Замена оборудования

Если все предыдущие шаги оказались неэффективными, возможно, ваше оборудование действительно может быть неисправно. В этом случае стоит рассмотреть замену диска или использование резервной системы.

4. Подведем итоги

Проблемы с apt и apt-key могут возникать по причинам, начиная от поврежденной файловой системы, заканчивая отсутствием необходимых ключей. Глубокая диагностика, начиная с проверки файловой системы и сетевых конфигураций, и соответствующие меры по восстановлению данных являются ключевыми шагами в решении данной проблемы. Если ваши усилия не приводят к успеху, возможно, стоит обратиться за профессиональной поддержкой для более детальной проверки оборудования.

Оцените материал
Добавить комментарий

Капча загружается...