Debian 在哪裡儲存已安裝軟體包的清單?

Debian 在哪裡儲存已安裝軟體包的清單?

我需要找到 Debian (Armbian) 伺服器掛掉先前安裝的軟體包清單。由於它處於離線狀態,我無法使用aptdpkg(或任何其他命令)。我需要知道哪個文件包含列表(即使它們是二進制的)。我嘗試搜索,但一切都只是說運行前述命令,這不是一個選項。

答案1

如何從 /etc 和 /var 的備份近似「dpkg --get-selections」?解決您根本關心的問題。

已安裝軟體包的清單儲存在/var/lib/dpkg/status.尋找Status: install ok installed線條 — 這表示該軟體包已正確安裝。

以下 AWK 呼叫將從檔案中提取已安裝的套件名稱status

awk '/^Package:/ { package = $2 }
     /^Status: install ok installed/ { print package }' /path/to/status

如果系統支援多種架構,您也需要追蹤它:

awk '/^Package:/ { p = $2; i = 0 }
     /^Status: install ok installed/ { i = 1 }
     i && /^Architecture: all/ { print p; next }
     i && /^Architecture/ { printf "%s:%s\n", p, $2 }' /path/to/status

另一個有趣的檔案是/var/lib/apt/extended_states記錄已安裝軟體包的「自動安裝」標誌。您可以透過執行類似的命令來恢復標誌

awk '/^Package:/ { p = $2 }
     /^Architecture/ { a = $2 }
     /^Auto-Installed: 1/ { printf "%s:%s\n", p, a }' /path/to/extended_states |
xargs sudo apt-mark auto

您可以組合這兩個檔案來列出手動安裝的軟體包,並依靠依賴項管理來安裝自動安裝的軟體包(儘管這不一定會導致安裝同一組軟體包):

awk 'FNR == NR && /^Package:/ { p = $2 }
     /^Status: install ok installed/ { i = 1 }
     FNR == NR && i && /^Architecture: all/ { ps[p] = 1; next }
     FNR == NR && i && /^Architecture/ { ps[p ":" $2] = 1}
     FNR != NR && /^Package:/ { p = $2 }
     FNR != NR && /^Architecture:/ { a = $2 }
     /^Auto-Installed: 1/ { delete ps[p ":" a] }
     END { for (p in ps) print p }' /path/to/status /path/to/extended_states

請參閱“文件”部分man dpkg:

/var/lib/dpkg/狀態
可用包的狀態。該檔案包含軟體包是否標記為刪除、是否已安裝等資訊。

相關內容