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/状态
可用包的状态。该文件包含有关软件包是否标记为删除、是否已安装等信息。

相关内容