如何重新建立/var/lib/dpkg/status?

如何重新建立/var/lib/dpkg/status?

我刪除了一些文件/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/statusint 上面的命令。如果您也刪除了它,則可以使用 重建軟體包的大致列表$(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.

相關內容