计算两个主机上安装的软件包之间的差异列表

计算两个主机上安装的软件包之间的差异列表

我只是发现 Debian 虚拟服务器存在一些问题,并决定从头开始重新安装它们。但是,我仍然可以访问旧版本,并且可以检索已安装软件包的列表。

为了方便将来恢复虚拟服务器的过程,我想为我的每个服务器创建一个特定的包列表。

为了更好地解释我想要实现的目标。我已经有一个自动化流程来创建一个新的虚拟服务器,其中包含一些随处可用的基本包和配置。现在我想用这个“骨架”保存增量,以简化特定服务器的重新安装。

真正的优点是还可以保存默认更改的配置文件,但我只能接受包列表。

简而言之,我想要一种方法来创建一个安装在一台主机上但未安装在另一台主机上的软件包列表。

如果列表仅包含手动安装的包而不是所有依赖项的列表,那就太好了。

如果您有一些现有的工具专门用于完成这项特定任务,请随意提出它们,但我希望尽可能减少依赖性。请注意,它们不是虚拟服务器,而是 LXC 容器。

答案1

在参考安装上(仅一次):

dpkg-query -W -f='${Package}\n' | sort > baselist.txt

(以下假设bash

要从参考安装中添加软件包(这不会显示已删除的内容):

comm -1 -3 baselist.txt <(dpkg-query -W -f='${Package}\n' | sort)

甚至更好,避免复制baselist.txt

comm -1 -3 <(ssh user@refserver cat /path/to/baselist.txt) <(dpkg-query -W -f='${Package}\n' | sort)

答案2

在旧服务器上,运行:

dpkg --get-selections > 旧软件包列表

将上述文件复制到新服务器并在新服务器上运行:

dpkg --set-selections < 旧软件包列表

apt-get 更新

选择更新

另外,在迁移软件包之前,请记住将所有额外的存储库从/etc/apt/sources.list旧服务器添加到新服务器,如果不这样做,大多数软件包都将处于未安装状态。

答案3

您可以使用以下命令获取两台服务器上的完整软件包列表:

     dpkg -l | sort > old_file
     dpkg -l | sort > new_file

然后,您可以使用以下方法获取差异:

     diff -Nur old_file new_file > changes.txt

您可以使用 grep 筛选所需的更改。此外,diff 还可用于获取配置文件中的更改并生成补丁以在需要时应用。顺便说一句,diff 不仅可以比较两个文件,还可以比较两个文件夹。

答案4

还发现了这个有用的包,其描述如下:

一个 Bash 脚本,将 Debian 包的文件系统树与当前文件系统树进行比较,打印不同文件的统一差异。

https://code.google.com/p/dpkg-diffs/

只需将一个 bash 文件粘贴到 PATH 中的某个位置并运行 - 对我来说似乎很有效,而且它不是太旧。

希望这对某人有帮助。

相关内容