如何处理破损的包裹

如何处理破损的包裹

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 apthttps://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 需要重新安装软件包,但找不到它的存档”。在这个例子中,问题不是缺少存档,而是安装前/安装后脚本中的问题,无法通过重新运行它们来解决。因此,错误有时是非特定的。


如何处理破损的包裹

  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 或 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 需要重新安装包,但找不到它的存档”的原因和解决方法

相关内容