Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

failed to commit transaction: invalid or corrupted package

Ошибка error: failed to commit transaction (invalid or corrupted package (PGP signature)) появляется, когда pacman не может проверить или распаковать скачанный пакет. Причина почти всегда одна из трёх: битый файл в кэше /var/cache/pacman/pkg, зеркало отдаёт повреждённые файлы или на диске кончилось место. Лечится это за несколько шагов: удали повреждённый пакет из кэша, обнови базы командой pacman -Syy и повтори pacman -Syu. Если ошибка осталась, смени зеркало и проверь диск.

Что значит «failed to commit transaction (invalid or corrupted package)»

Pacman работает так: скачивает пакет с зеркала в /var/cache/pacman/pkg, проверяет контрольную сумму по базе repo.db, проверяет PGP-подпись, потом распаковывает файлы в систему. Сбой на любом из этих этапов прерывает транзакцию, и pacman показывает одну из ошибок:

error: failed to commit transaction (invalid or corrupted package (PGP signature))
error: failed to commit transaction (unexpected error)
error: failed to retrieve some files

Первая строка говорит, что пакет не прошёл проверку подписи или контрольной суммы. Вторая означает сбой при распаковке. Третья появляется, когда pacman вообще не смог скачать файлы с зеркала. Дальше разберём каждую причину по порядку.

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

Почему pacman ругается на повреждённый пакет

Битый файл в кэше

Скачивание прервалось на середине: пропал интернет, выключили питание, диск заполнился во время загрузки. Зеркало могло отдать мусор вместо пакета. В кэше остался недокачанный или повреждённый файл, и pacman упорно пытается его использовать.

Зеркало отстало от базы

Зеркала синхронизируются с основными репозиториями не одновременно. Если зеркало отдаёт старые файлы пакетов, а база repo.db уже новая, контрольные суммы не сойдутся. Частичная синхронизация зеркала даёт тот же эффект.

Полный диск

Если на /var или на корневом разделе не осталось места, pacman не может распаковать пакет. Ошибка при этом выглядит как unexpected error или падение с No space left on device.

Ошибки файловой системы

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

Проблема с PGP-подписью

Отдельный случай: пакет скачан нормально, но подпись не проходит из-за проблем с ключами pacman. Это не повреждение файла, а недоверие к подписи. Проверить просто: если пакет скачивается заново, file показывает нормальный архив, а ошибка про подпись остаётся, дело в ключах. Обнови их командой pacman-key --refresh-keys и повтори обновление. Разбор этого случая есть в статье «GPG: unknown public key, чиним pacman-key».

Как починить: удали битый пакет из кэша и повтори обновление

Самый частый случай, повреждённый файл в кэше. Удали его и попробуй снова.

# очистить кэш от старых версий пакетов
pacman -Sc

# или удалить конкретный пакет, на котором падает обновление
rm /var/cache/pacman/pkg/<имя-пакета>-*

# повторить обновление
pacman -Syu

pacman -Sc удаляет из кэша пакеты, которые уже не установлены, и старые версии установленных. Установленные версии остаются. Если хочешь вычистить кэш полностью, используй pacman -Scc, но учти: переустановка пакета потом потребует повторного скачивания.

Если не помнишь точное имя пакета, посмотри вывод pacman -Syu: имя стоит в строке перед ошибкой. Удалять можно и несколько файлов сразу, подставив общую маску имени.

Что делать, если повторное обновление снова падает

Если после чистки кэша ошибка осталась, принудительно обнови базы репозиториев:

pacman -Syy

Обычный pacman -Sy обновляет базы, только если они устарели. -Syy перекачивает их принудительно, даже если pacman считает их свежими. Это помогает, когда база на твоей машине рассинхронизировалась с зеркалом.

Важно: не обновляй базы отдельно от системы. pacman -Sy без последующего pacman -Su приводит к частичному обновлению, а это прямой путь к поломке. Подробнее в статье «Частичное обновление pacman».

Как сменить зеркало на рабочее

Если базы свежие, а пакеты всё равно не скачиваются, виновато зеркало. Открой список зеркал:

nano /etc/pacman.d/mirrorlist

Поставь первым зеркало geo.mirror.pkgbuild.com. Оно официальное и обычно самое надёжное. Или отсортируй зеркала по скорости автоматически:

pacman -S reflector
reflector --latest 10 --protocol https --sort rate

Reflector выберет десять свежих зеркал с HTTPS и запишет их в mirrorlist, отсортировав по скорости. После смены зеркала снова выполни pacman -Syyu. Настройка зеркал разобрана подробнее в статье «Настройка mirrorlist в Arch Linux».

Что делать, если pacman пишет «failed to retrieve some files»

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

Проверь сеть:

ping -c 3 archlinux.org

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

pacman -Syu

Иногда помогает просто повторить команду: зеркало могло временно отдать ошибку 503 или 404. Если ошибка повторяется на одном и том же зеркале, оно ненадёжное, убери его из mirrorlist.

Как проверить диск и файловую систему

Проверь, хватает ли места:

df -h / /var

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

findmnt /

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

umount /dev/nvme0n1p2
fsck /dev/nvme0n1p2

Подставь свой раздел вместо nvme0n1p2. Для btrfs вместо fsck используется btrfs check.

Как проверить скачанный пакет вручную

Прежде чем менять зеркала, посмотри, что реально лежит в кэше. Имя пакета для проверки возьми из вывода ошибки, pacman пишет его в строке перед failed to commit transaction:

file /var/cache/pacman/pkg/<имя-пакета>-*.pkg.tar.zst

Нормальный пакет определяется как Zstandard compressed data. Если file показывает HTML document или просто data, зеркало отдало мусор, а не пакет. Содержимое архива можно проверить так:

bsdtar -tf /var/cache/pacman/pkg/<имя-пакета>-*.pkg.tar.zst

Команда выведет список файлов внутри пакета. Если архив битый, bsdtar упадёт с ошибкой. Если bsdtar отработал без ошибок, а pacman всё равно падает, проблема не в архиве, а в распаковке: месте на диске или файловой системе. Целостность уже установленных файлов проверяется командой:

pacman -Qkk

Она сверяет контрольные суммы всех установленных пакетов и покажет, какие файлы повреждены.

Что делать, если пакет целый, но установка падает

Бывает, что архив скачан нормально, но pacman не может записать конкретный файл. Частая причина, конфликт с существующим файлом, который не принадлежит ни одному пакету, или ручная правка файлов пакета. Ошибка при этом выглядит как file exists in filesystem. Разбор этого случая есть в статье «exists on filesystem: конфликт файлов в pacman».

Что делать, если транзакция прервалась на середине

Если обновление упало в процессе распаковки, часть пакетов могла обновиться, часть нет. Не паникуй и не переустанавливай систему. Сначала повтори обновление:

pacman -Syu

Pacman продолжит с того места, где остановился. Если pacman жалуется на заблокированную базу (unable to lock database), удали файл блокировки:

rm /var/lib/pacman/db.lck

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

pacman -Syyu

В крайнем случае, когда повреждена локальная база в /var/lib/pacman/local, проще переустановить затронутые пакеты, чем восстанавливать базу вручную. После восстановления проверь систему:

pacman -Qkk

И посмотри журнал pacman, чтобы понять, что именно пошло не так:

tail -n 100 /var/log/pacman.log

Строки [ALPM] upgraded в журнале показывают, какие пакеты успели обновиться до сбоя. Если после повторного pacman -Syu pacman не видит проблем, система в порядке.

Как предотвратить появление ошибки

Большинство причин этой ошибки лечится профилактикой.

Держи mirrorlist свежим

Раз в пару месяцев прогоняй reflector, чтобы зеркала в списке были живыми и быстрыми:

reflector --latest 10 --protocol https --sort rate

Чисти кэш после обновлений

pacman -Sc после каждого обновления убирает старые версии пакетов. Кэш не разрастается, а битые файлы не копятся.

Следи за местом на диске

Проверяй df -h / /var перед крупными обновлениями. Полный диск, частая причина падения транзакции на распаковке.

Не прерывай обновление

Если обновление идёт долго, не выключай питание и не закрывай терминал. Прерванное скачивание оставляет битый файл в кэше. Для долгих обновлений используй tmux или screen, чтобы сессия пережила разрыв SSH.

Проверяй статус зеркал

На странице статуса зеркал Arch Linux видно, какие зеркала отстали от синхронизации. Если твоё зеркало в списке отстающих, замени его заранее, до того как оно отдаст битые файлы.

Частые вопросы

Опасна ли ошибка «invalid or corrupted package (PGP signature)»?

Нет. Это значит, что пакет не прошёл проверку подписи или контрольной суммы. Система при этом не повреждена, просто обновление не применилось. Удали пакет из кэша и повтори обновление.

Можно ли просто удалить пакет из кэша и не менять зеркало?

Да, в большинстве случаев этого достаточно. Битый файл в кэше, самая частая причина. Меняй зеркало только если после чистки кэша и pacman -Syy ошибка повторяется.

Почему после смены зеркала ошибка всё равно появляется?

Значит, проблема не в зеркале. Проверь место на диске (df -h / /var) и целостность файловой системы. Если диск в порядке, смотри в сторону PGP-ключей.

Что делать, если pacman пишет «unable to lock database»?

Удали файл блокировки /var/lib/pacman/db.lck и повтори команду. Файл остаётся после прерванной транзакции и не даёт запустить новую.

Нужно ли переустанавливать систему после такой ошибки?

Нет. Ошибка транзакции не ломает систему. Достаточно повторить pacman -Syu, а при необходимости проверить целостность командой pacman -Qkk.

Полезные ресурсы

Заключение

Ошибка failed to commit transaction (invalid or corrupted package) почти всегда лечится за пару минут: удали битый файл из кэша, обнови базы и повтори обновление. Если не помогло, смени зеркало и проверь диск. Система при этом не страдает, а после успешного обновления проверь целостность командой pacman -Qkk, чтобы убедиться, что всё на месте.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max