Package-Management

Debian 在哪裡儲存已安裝軟體包的列表?

  • June 15, 2021

我需要找到在 Debian (Armbian) 伺服器死前安裝的軟體包列表。由於它處於離線狀態,因此我無法使用aptor dpkg(或任何其他命令)。我需要知道哪些文件包含列表(即使它們是二進製文件)。我嘗試搜尋,但一切都只是說執行 aforementioend 命令,這不是一個選項。

如何從 /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/status

可用軟體包的狀態。該文件包含有關軟體包是否標記為刪除、是否已安裝等資訊。

引用自:https://unix.stackexchange.com/questions/654369