我需要找到 Debian (Armbian) 服务器挂掉之前安装的软件包列表。由于它处于离线状态,我无法使用apt
或dpkg
(或任何其他命令)。我需要知道哪个文件包含列表(即使它们是二进制的)。我尝试搜索,但一切都只是说运行前述命令,这不是一个选项。
答案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/状态
可用包的状态。该文件包含有关软件包是否标记为删除、是否已安装等信息。