Как исправить поврежденные пакеты в Linux

Linuxpackages Broken

Менеджеры пакетов Linux, такие как Apt и DNF, чрезвычайно мощные и интуитивно понятные, но это не значит, что все может идти гладко. Иногда установка пакета идет не так, и вам остается только собирать осколки. Менеджеры пакетов имеют возможность исправлять поврежденные пакеты и пропускать поврежденные обновления, чтобы вернуть вашу систему к рабочему состоянию и избежать проблем в будущем.

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

Содержание

  • Исправление поврежденных пакетов в Ubuntu/Mint/Debian
  • Исправление поврежденных пакетов в Fedora/CentOS/RHEL
  • Исправление поврежденных пакетов в Arch
  • Часто задаваемые вопросы

Исправление поврежденных пакетов в Ubuntu/Mint/Debian

Apt имеет несколько флагов для исправления отсутствующих зависимостей или пакетов, которые сломались по той или иной причине во время установки. Распространенное использование здесь будет заключаться в установке стороннего .deb и обнаружении, что у него есть зависимости, о которых вы не знали. Эти зависимости, вероятно, не будут подтянуты сами по себе, и dpkg будет жаловаться, что не может разрешить зависимости. В любом случае, вы можете попробовать следующие шаги:

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

Linuxpackages Fixmissing

  1. Выполните обновление, чтобы убедиться, что нет более новых версий необходимых пакетов:
sudo apt --fix-missing update
  1. Заставьте Apt искать и исправлять любые отсутствующие зависимости или поврежденные пакеты, когда вы снова попытаетесь установить проблемный пакет. Это установит любые отсутствующие зависимости и исправит существующие установки:
sudo apt install-f

Исправление проблем с конфигурацией DPKG

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

Linuxpackages Configuredpkg

  1. Начните с попытки заставить dpkg перенастроить любые поврежденные или частично настроенные пакеты:
sudodpkg--configure-a
  1. Если это не решает проблему, примите более решительный подход. Начните с перечисления любых пакетов, которые dpkg пометил как требующие переустановки:
sudodpkg-l|grep ^..r

Вышеуказанная команда покажет вам пакеты, которые вызывают проблемы. Для следующего шага проверьте и убедитесь, что пакеты, помеченные для переустановки, действительно повреждены. Выполните sudo apt reinstall и обратите внимание на то, какие пакеты не удалось переустановить.

  1. Для каждого пакета, который не удалось переустановить, получите имя и принудительно удалите поврежденный пакет:
sudodpkg--remove--force-remove-reinstreq[имя пакета]
  1. Dpkg теперь должен быть чистым. Выполните очистку с помощью Apt:
sudo apt clean &&sudo apt update

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

Постоянная блокировка DPKG

Существует менее распространенная проблема с блокировками dpkg, которые мешают вам что-либо делать. Каждый раз, когда вы пытаетесь использовать Apt или dpkg, вы получаете ошибку, говорящую, что другое приложение уже использует его… когда это не так.

Легко удалить файл блокировки, который мешает вам использовать Apt и вернуться к тому, что вам нужно. Иногда эти файлы блокировки остаются на месте после ошибки установки или отключения питания, сбивая процесс и не позволяя файлу быть удаленным автоматически. В этом случае вам нужно сделать это самостоятельно.

sudorm/var/lib/apt/lists/lock

Для надежности удалите блокировку в кэше.

sudorm/var/cache/apt/archives/lock

Предупреждение: Перед удалением этой блокировки убедитесь, что она не используется. В Ubuntu есть обновлятор, который запускается вместе с системой и блокирует DPKG/APT, когда он ищет обновления. Если вы не уверены, работает ли обновлятор, нажмите клавишу Win, чтобы открыть Центр активности, и введите “Обновление программного обеспечения”, затем нажмите Enter, чтобы открыть его.

Linuxpackages Ubuntuupdater

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

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

Исправление поврежденных пакетов в Fedora/CentOS/RHEL

Исправление поврежденных пакетов в Fedora/CentOS/RHEL — это менее распространенное дело. dnf действительно хорошо справляется с тем, чтобы пакеты устанавливались правильно. Тем не менее, он все еще не идеален, и иногда в управлении пакетами могут возникать путаницы.

Примечание: изучите различия между Fedora, CentOS и RHEL.

1. Перечисление проблемных пакетов

Команда для решения этой проблемы на системах, основанных на RHEL, таких как Fedora:

sudo rpm -Va

Linuxpackages Rpmverify

Опция -V предназначена для проверки, что означает, что она пройдет и сравнит информацию об установленных файлах с информацией, хранящейся в базе данных rpm. Присоединение -a к этому просто проверяет все основные пакеты. Это немного не полезно, так как обычно вы получите длинный список файлов, но это может дать вам отправную точку, если у вас есть проблемы с конкретным приложением.

Например, если вы видите что-то, помеченное как “отсутствует” в вашем терминале, это скажет вам, что в этом конкретном пакете отсутствуют файлы.

2. Попытка переустановки

Запустите dnf reinstall на любых пакетах, которые вы видите в этом списке и которые могут вызывать у вас проблемы.

sudo dnf --refresh reinstall [имя пакета]

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

3. Последний шаг — удалить пакеты

Если вы дошли до точки, когда вам нужно использовать --skip-broken, чтобы завершить обновления, для вашей системы будет более гигиенично удалить его полностью.

Запомнив имя пакета, который вы не смогли правильно переустановить, удалите его:

sudo dnf remove [имя пакета]

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

Совет: изучите, как использовать flatpak в Fedora для лучшего управления вашими пакетами.

Исправление поврежденных пакетов в Arch

Хотя менеджер пакетов Arch имеет некоторые сходства с другими, перечисленными здесь (т.е. у него есть файл блокировки базы данных и он подтягивает зависимости аналогичным образом), это совершенно другое существо, когда дело доходит до структуры его логики. Первый шаг в диагностике вашей проблемы — убедиться, что репозитории обновлены, и попытаться выполнить полное обновление:

sudo pacman -Syu

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

Примечание: изучите, как работает pacman, прежде чем пытаться его исправить.

“Недействительный или поврежденный пакет”

Внесение изменений в “pacman.conf” любым образом может вызвать проблемы, из-за которых pacman неправильно помечает пакеты как поврежденные. Наиболее вероятным виновником здесь является частичный (“.part”) файл в кэше менеджера пакетов, и ваше решение — удалить его:

sudofind/var/cache/pacman/pkg/-iname"*.part"-delete

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

sudo pacman -Rns[имя пакета]

“Невозможно заблокировать базу данных”

Как и apt Debian, менеджер пакетов Arch создает файл блокировки во время операций. Если вы испытали отключение питания или pacman испытал жесткое прерывание и не смог удалить блокировку, очень вероятно, что останется файл блокировки.

Сначала выясните, использует ли какой-либо процесс на вашем компьютере файл:

sudofuser/var/lib/pacman/db.lck

На изображении выше процесс с ID 121497 использует файл блокировки. Если вам интересно, какой процесс, и вы хотите получить больше информации, используйте ps:

ps-p[PID#]

В моем случае другой экземпляр pacman владеет файлом блокировки. Самый безопасный способ удалить блокировку — сначала убить этот процесс:

sudokill[PID#]

Теперь, когда процесс мертв, удалите файл блокировки:

sudorm/var/lib/pacman/db.lck

Теперь вы в порядке!

“Конфликтующие файлы/файл существует в файловой системе”

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

Чтобы узнать, кто владеет файлом:

pacman -Qo[путь к файлу]

Если он принадлежит пользователю, а не другому пакету, просто удалите его:

sudorm[путь к файлу]

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

Самый простой способ сделать это — использовать флаг --overwrite в pacman. Просто знайте, что это в целом небезопасно и может привести к тому, что некоторые приложения не будут работать правильно в вашей системе. Я рекомендую сделать резервную копию перед выполнением этого.

Флаг --overwrite позволяет менеджеру пакетов Arch игнорировать правила собственности для конкретного файла и просто пройти через обновление. Пример:

sudo pacman -Syu--overwrite[имя файла]

Если вышеуказанная команда не работает, замените имя файла на его абсолютный путь. Некоторые пользователи сообщали, что удаление ведущего слэша (“/“) перед путем заставляет команду работать, когда она упрямится.

В качестве альтернативы вы также можете просто сказать pacman, чтобы перезаписать все, что ему нужно:

sudo pacman -Syu--overwrite='*'

“Недействительный или поврежденный пакет (PGP подпись)”

В некоторых пакетах, которые плохо поддерживаются, разработчик может не иметь времени или желания правильно обновить цифровую подпись, которая сертифицирует их пакет. Это в конечном итоге приведет к сообщению в вашем терминале при попытке установить его, например, “подпись от [кого-то] имеет маргинальный уровень доверия”, за которым следует вопрос менеджера пакетов, хотите ли вы удалить файл.

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

sudo pacman -Syu--ignore[имя пакета]

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

sudo pacman -S archlinux-keyring

Часто задаваемые вопросы

Могу ли я применить исправления Arch с помощью помощника AUR?

В общем, да. Замените “pacman” на вашего помощника AUR в командах в этом руководстве. Пример: yay -Qo /path/to/file

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

Прерывание процесса обновления, нажав Ctrl + C, убив процесс менеджера пакетов или преждевременно закрыв терминал, приведет к некоторому уровню повреждения вашей базы данных пакетов, что может усложнить ситуацию, когда вы попытаетесь установить что-то еще. Чтобы исправить это, очистите кэш и повторите обновление.

Кредит изображения: Flickr. Все скриншоты сделаны Мигелем Лейва-Гомесом.