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 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
或手冊頁或共用資料。使用查找或定位來識別潛在的剩餘文件。顯然,刪除系統檔案時應該非常小心。不要刪除您不理解的內容,也不要在
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 需要重新安裝軟體包,但找不到它的存檔」的原因和解決方案