Как управлять сломанными пакетами

Как управлять сломанными пакетами

Время от времени пользователи Ubuntu сталкиваются с ошибкамиaptилиapt-get, в форме:

The package some-package needs to be reinstalled, but I can't find an archive for it.

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

Как мне воспроизвести эту ошибку для тестирования на моей системе (Ubuntu MATE 17.10)?

Это вызваноэтот недавний вопрос Ask Ubuntuи мой давний дискомфорт от закрытия вопросов об этой ошибке противApt/Synaptic необходимо переустановить пакет, но не удается найти архив для него, ответ которого использует dpkg --force-allдля удаления проблемного пакета.Анонимный отзывпредполагает, что это решение сработало для многих пользователей, но я не уверен, что его использование --force-allне вызовет последующих проблем или что это хорошая идея использовать этот метод для удаления важных пакетов, таких как APT.

решение1

Ошибка «Apt/Synaptic необходимо переустановить пакет, но не удается найти архив для него» иногда неконкретна.

Чаще всего я вижу эту ошибку при обновлении Ubuntu с одной версии до другой.

Примечание: Ubuntu переходит с apt-get на apt , но я использую apt-get в этом посте. Для получения дополнительной информации см. man aptиhttps://www.debian.org/doc/manuals/debian-reference/ch02.en.html

Наиболее распространенной причиной этой ошибки является ситуация, когда пользователь установил пакет, а затем удалил .deb, обычно с помощьюsudo apt-get clean

http://manpages.ubuntu.com/manpages/zesty/man8/apt-get.8.html

чистый

       clean clears out the local repository of retrieved package files.
       It removes everything but the lock file from
       /var/cache/apt/archives/ and /var/cache/apt/archives/partial/

Затем, в какой-то момент, dpkg --reconfigureвызывается, либо пользователем, либо обновлением, либо в какой-то момент пользователь пытается переустановить пакет, переустанавливается sudo apt-get --reinstall fooили какая-то вариация.

Если apt не может найти .deb в репозитории, либо потому что пакеты были удалены (редко), либо репозиторий был удален из системы, либо из-за обновления, а пакета нет в новом репозитории, вы получите сообщение об ошибке «Apt/Synaptic необходимо переустановить пакет, но не удается найти архив для него».


Однако ошибка может возникнуть и по другим причинам.

Цитируем соответствующие разделы с man-страницы dpkg (см.http://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.htmlдля получения подробной информации)

ИНФОРМАЦИЯ О ПАКЕТАХ dpkg поддерживает некоторую полезную информацию о доступных пакетах. Информация делится на три класса: состояния, состояния выбора и флаги. Эти значения предназначены для изменения в основном с помощью dselect.

Состояния пакета

   not-installed
          The package is not installed on your system.

   config-files
          Only the configuration files of the package exist on the system.

   half-installed
          The  installation  of  the  package  has  been  started, but not
          completed for some reason.

   unpacked
          The package is unpacked, but not configured.

   half-configured
          The package is unpacked and configuration has been started,  but
          not yet completed for some reason.

   triggers-awaited
          The package awaits trigger processing by another package.

   triggers-pending
          The package has been triggered.

   installed
          The package is unpacked and configured OK.

ДЕЙСТВИЯ

   -i, --install package-file...
          Install the package. If --recursive or -R option  is  specified,
          package-file must refer to a directory instead.

          Installation consists of the following steps:

          1. Extract the control files of the new package.

          2.  If  another version of the same package was installed before
          the new installation, execute prerm script of the old package.

          3. Run preinst script, if provided by the package.

          4. Unpack the new files, and at the same time back  up  the  old
          files, so that if something goes wrong, they can be restored.

          5.  If  another version of the same package was installed before
          the new installation, execute  the  postrm  script  of  the  old
          package.  Note  that  this  script is executed after the preinst
          script of the new package, because new files are written at  the
          same time old files are removed.

          6.   Configure   the   package.  See  --configure  for  detailed
          information about how this is done.

--configure package...|-a|--pending

          Configure  a  package  which  has  been  unpacked  but  not  yet
          configured.  If -a or --pending is given instead of package, all
          unpacked but unconfigured packages are configured.

          To reconfigure a package which has already been configured,  try
          the dpkg-reconfigure(8) command instead.

          Configuring consists of the following steps:

          1.  Unpack  the  conffiles, and at the same time back up the old
          conffiles, so that they can be restored if something goes wrong.

          2. Run postinst script, if provided by the package.

   /var/lib/dpkg/status

          Statuses  of  available packages. This file contains information
          about whether a package is marked for removing or  not,  whether
          it  is  installed  or  not,  etc.  See section INFORMATION ABOUT
          PACKAGES for more info.

Если man-страницы tl;dr -> В процессе установки .deb / dpkg / apt запускает скрипты pre/post установки и другие функции. Если эти скрипты установки/удаления не срабатывают по разным причинам, пакет будет помечен как «наполовину установленный» (или в состоянии, отличном от не установленного/установленного). В этом нечистом состоянии вы иногда можете увидеть ошибку «Apt/Synaptic необходимо переустановить пакет, но не удается найти архив для него». В этом примере проблема заключается не в отсутствующем архиве, а в скриптах pre/post установки, которые невозможно устранить путем их повторного запуска. Таким образом, ошибка иногда не является конкретной.


Как управлять сломанными пакетами

  1. Сначала попробуйте исправить зависимости, убедившись, что соответствующие ppa/репозитории включены, например universe или любые другие необходимые репозитории.

    Затем печально известный

    sudo apt-get install -f
    

    Читатьлюбые выходные данные и сообщения об ошибках и опубликуйте команду и выходные данные здесь, если вам нужна помощь.

  2. Попробуйте перенастроить

    sudo dpkg --configure -a
    

    Это запустит скрипты конфигурации. Вы можете указать пакет вместо -a, но -a более полезен, когда у вас возникают проблемы.

    Читатьлюбые выходные данные и сообщения об ошибках и опубликуйте команду и выходные данные здесь, если вам нужна помощь.

    Попробуйте просмотреть все неисправные сценарии и, если возможно, исправить ошибку/проблему в сценарии.

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

    sudo dpkg --remove $broken_package
    sudo dpkg --remove --force-remove-reinstreq $broken_package
    sudo dpkg --remove --force-all $broken_package
    

    Если что-то из этого работает, запустите , возможно, вам также sudo apt-get update && sudo apt-get upgradeпридется запустить sudo apt-get -f installи/или .sudo dpkg --configure -a

  4. Если это не поможет, вам придется вручную удалить пакеты. Это может включать поиск всех компонентов в вашей системе и ручное их удаление.

    Используйте следующую процедуру

    Удалить информацию dpkg (см. выше)

    cd /var/lib/dpkg/info
    sudo rm -i package_name*
    

    Будьте осторожны, не удалите больше, чем необходимо.

    Наконец удалите проблемный пакет.

    sudo dpkg --remove --force-remove-reinstreq package_name
    

    После этого вы сможете использовать apt

    sudo apt-get update
    sudo apt-get install -f
    sudo apt-get upgrade
    
  5. Только при необходимости найдите и вручную удалите все файлы, оставшиеся в системе. Это ручная процедура, которая может включать файлы конфигурации /etcили страницы руководства или общие данные. Используйте find или locate для определения возможных оставшихся файлов.

    Очевидно, что вам следует быть очень осторожным при удалении системных файлов. Не удаляйте то, чего вы не понимаете и не используете, rm -Rfне понимая, что будет делать эта команда. rm -iвероятно, лучше, так как -iопция запрашивает подтверждение.


Воссоздайте эту проблему

Вы можете воспроизвести это сообщение об ошибке, вручную отредактировав файл статуса dpkg любого пакета /var/lib/dpkg/infoи изменив статус на наполовину установленный.

sudo nano /var/lib/dpkg/info/some_package

Измените строку статуса так, чтобы она выглядела так:

Статус: purge reinstreq наполовину установлен

Затем попробуйте запустить apt-get.

Если это не сработает, установите пакет из ppa, запустите apt-get clean, удалите ppa, а затем попробуйте переустановить или перенастроить пакет.

Извините за длинный пост, но я надеюсь, что это поможет вам понять причину и решение этой сложной ошибки «Apt/Synaptic необходимо переустановить пакет, но не удается найти архив для него».

Связанный контент