如何管理損壞的包裹

如何管理損壞的包裹

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) 系統上進行測試時產生此錯誤?

這是由最近詢問 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或手冊頁或共用資料。使用查找或定位來識別潛在的剩餘文件。

    顯然,刪除系統檔案時應該非常小心。不要刪除您不理解的內容,也不要在rm -Rf不了解該命令的用途的情況下使用這些內容。rm -i可能更好,因為該-i選項要求確認。


重現這個問題

您可以透過手動編輯任何軟體包的 dpkg 狀態檔案/var/lib/dpkg/info並將狀態變更為半安裝來重現此錯誤訊息

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

編輯狀態行,使其顯示為

狀態:清除reinstreq已安裝一半

然後嘗試運行apt-get

如果這不起作用,請從 ppa 安裝軟體包,執行 apt-get clean,刪除 ppa,然後嘗試重新安裝或重新設定該軟體包。

很抱歉發了這麼長的帖子,但我希望這能讓您深入了解這個複雜錯誤訊息「Apt/Synaptic 需要重新安裝軟體包,但找不到它的存檔」的原因和解決方案

相關內容