Время от времени пользователи 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 установки, которые невозможно устранить путем их повторного запуска. Таким образом, ошибка иногда не является конкретной.
Как управлять сломанными пакетами
Сначала попробуйте исправить зависимости, убедившись, что соответствующие ppa/репозитории включены, например universe или любые другие необходимые репозитории.
Затем печально известный
sudo apt-get install -f
Читатьлюбые выходные данные и сообщения об ошибках и опубликуйте команду и выходные данные здесь, если вам нужна помощь.
Попробуйте перенастроить
sudo dpkg --configure -a
Это запустит скрипты конфигурации. Вы можете указать пакет вместо -a, но -a более полезен, когда у вас возникают проблемы.
Читатьлюбые выходные данные и сообщения об ошибках и опубликуйте команду и выходные данные здесь, если вам нужна помощь.
Попробуйте просмотреть все неисправные сценарии и, если возможно, исправить ошибку/проблему в сценарии.
Попробуйте удалить проблемный пакет, при необходимости силой. Здесь нужно быть очень осторожным, вы можете принудительно удалить критический пакет или еще более опасный набор критических пакетов. Следующие команды идут от вежливых к менее вежливым и к прямой силе. Попробуйте их по порядку.
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
Если это не поможет, вам придется вручную удалить пакеты. Это может включать поиск всех компонентов в вашей системе и ручное их удаление.
Используйте следующую процедуру
Удалить информацию 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
Только при необходимости найдите и вручную удалите все файлы, оставшиеся в системе. Это ручная процедура, которая может включать файлы конфигурации
/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 необходимо переустановить пакет, но не удается найти архив для него».