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 需要重新安装软件包,但找不到它的存档”
但错误也可能由其他原因引起。
引用 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.
--配置包...|-a|--待定
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.
如果手册页是 tl;dr -> 作为安装的一部分,.deb / dpkg / apt 会运行安装前/安装后脚本和其他功能。如果这些安装/删除脚本由于各种原因失败,则软件包将被标记为“半安装”(或未安装/未安装以外的其他状态)。在这种不干净的状态下,您有时还会看到错误“Apt/Synaptic 需要重新安装软件包,但找不到它的存档”。在这个例子中,问题不是缺少存档,而是安装前/安装后脚本中的问题,无法通过重新运行它们来解决。因此,错误有时是非特定的。
如何处理破损的包裹
首先尝试修复依赖关系,确保启用了适当的 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 或 location 来识别潜在的剩余文件。显然,删除系统文件时应格外小心。不要删除您不了解且不使用的内容,
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 需要重新安装包,但找不到它的存档”的原因和解决方法