我刪除了一些文件/var/lib/dpkg/
,即:
/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*
我了解 Debian 使用這些文件來保存有關已安裝軟體包的一些資訊。現在,當我這樣做時apt-get update
,我收到以下錯誤:
Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.
據我了解FHS,位於 的檔案/var
不應該是系統關鍵的。評估者這些應該是臨時檔案、日誌、快取等。
那麼有沒有辦法重新建立已刪除的檔案呢?
答案1
如果你看一下在檔案系統層次結構標準中給出的 /var 的用途, 它說:
/var
包含變數資料檔。這包括假脫機目錄和文件、管理和日誌記錄資料以及瞬態和臨時檔案。
請注意,「瞬態和臨時」檔案只是一它所包含的東西。它還包含“假脫機目錄和檔案”以及“管理和日誌記錄資料”。您刪除了關鍵的「管理資料」。
它繼續解釋為什麼/var
存在:
/var
此處指定是為了可以以/usr
唯讀方式掛載。/usr
在系統操作期間(而不是安裝和軟體維護)寫入的所有內容都必須位於/var
.
這是關鍵/var
:其中的數據會發生變化,與/usr
(僅在新增/刪除/更新軟體時才會發生變化)不同。
其他部分解釋了 的各個子目錄/var
;例如,/var/lib
(您刪除的檔案曾經存在的位置)保存“與應用程式或系統相關的狀態資訊”,定義為“程式在運行時修改的數據,並且與一台特定主機相關”。
你真的在不知道特定檔案用途的情況下不應刪除檔案。對於您刪除的文件,除非您有這些文件的備份,否則我認為唯一要做的就是備份/home
等等/etc
並重新安裝。除非您這樣做,否則您將無法使用dpkg
(以及 APT 等)。除此之外,系統應該繼續運作。
答案2
位於的檔案/var
對系統非常關鍵。例如,/var/mail
或/var/spool/mail
包含使用者的電子郵件;你不會刪除它,就像你不會在鄰居的郵箱裡點火一樣。只有 的某些子目錄中的檔案/var
包含或多或少暫時的檔案: 中的日誌檔案/var/log
、通常可以在 中重新建立的快取/var/cache
、 中的暫存檔案(在使用時不應刪除它們!)/var/tmp
。
輸入的資料/var/lib
可能非常關鍵。例如,MySQL 通常配置為/var/lib/mysql
預設儲存其資料庫:如果刪除它,就會擦除資料庫。 Dpkg/var/lib
也放置了自己的資料庫;/var/lib/dpkg/status
是一。
/var/lib/dpkg/status
包含已安裝軟體包的資訊。如果您已刪除它,則應該從備份中還原它。如果您的備份不是完全最新的,請檢查/var/log/apt
和 中最近的套件操作日誌/var/log/dpkg.log
。您需要先建立該文件dpkg
才能運作。
/var/lib/dpkg/available
是根據從互聯網下載的數據構建的。apt-get update
應該重建它。
/var/lib/dpkg/info
包含 Debian 軟體包隨附的檔案。您只需重新安裝軟體包即可恢復這些檔案。當然,您需要一個已安裝軟體包的清單。如果您已經恢復/var/lib/dpkg/status
,那麼您可以從那裡提取軟體包清單。
apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')
如果您丟失了/var/lib/dpkg/status
,那麼您可以透過建立一個空文件,然後apt-get install --reinstall
在套件列表上運行來重新建立它。也保存軟體包清單的一個位置是/var/lib/apt/extended_states
,至少如果您只使用過 APT 安裝軟體包(而不是dpkg
直接安裝),請使用該文件而不是/var/lib/dpkg/status
int 上面的命令。如果您也刪除了它,則可以使用 重建軟體包的大致列表$(cd /usr/share/doc && ls)
,因為大多數軟體包都會在 中建立一個條目/usr/share/doc
。可能有一些例外。
不要尋求有關此系統上的套件管理的任何協助。從刪除的系統關鍵檔案中恢復並不是一門精確的科學。如果無法從備份中恢復,則應盡快安裝新的、乾淨的系統。
答案3
您不能/var/lib/dpkg/status
僅運行命令來“重新創建”,文件就會神奇地出現。不,您需要使用檔案的備份,並學會永遠不要刪除/var/lib
目錄中的內容:
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
這將為您提供前一天的包裹狀態。開始祈禱它不會破壞其他東西。
答案4
如果有人最後用核武攻擊了「/var/lib/dpkg」:
sudo mkdir -p /var/lib/dpkg/updates
sudo mkdir -p /var/lib/dpkg/info
sudo mkdir -p /var/lib/dpkg/alternatives
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo cp /var/backups/dpkg.statoverride.0 /var/lib/dpkg/statoverride
sudo cp /var/backups/dpkg.diversions.0 /var/lib/dpkg/diversions
sudo cp /var/backups/dpkg.arch.0 /var/lib/dpkg/arch
sudo dpkg --clear-avail
sudo apt update
sudo apt upgrade # If needed.