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


11

我只是在Debian虚拟服务器上添加了一些问题,然后添加了从头开始重新安装所有这些问题。但是,我仍然可以访问旧版本,并且可以检索已安装软件包的列表。

为了便于将来还原虚拟服务器的过程,我想为我的每台服务器创建一个特定软件包的列表。

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

一个真正的好处是还可以保存更改后的默认配置文件,但是我只能使用软件包列表。

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

如果该列表仅包含手动安装的软件包,而不包含所有依赖项的列表,那将非常好。

如果您有一些旨在完成此特定任务的现有工具,请随时提出这些建议,但我想使依赖性尽可能小。有关信息,它们并非完全是虚拟服务器,而是LXC容器。


只是一个想法,但是可能是时候从相反的方向开始工作了。与其尝试获取信息,不如设置一个配置管理系统(木偶)。然后将内容推送到您的受管系统。
Zoredache

哦,顺便说一句,确实看到了这个问题。 serverfault.com/questions/3852/…–
Zoredache

@Zoredache我目前正在寻找一种更好的方法来管理所有这些,但是与此同时,我想找到一种快速的方法来保存服务器的状态,以防万一。感谢您的链接!
krtek

Answers:


12

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

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更新

dselect更新

另外,请记住,也要/etc/apt/sources.list从旧服务器到新服务器中添加所有额外的存储库,在此迁移软件包之前,就好像您没有这样做一样,大多数软件包将保持未安装状态。


这将保存整个软件包列表,而这正是我用来还原服务器的解决方案。但是现在,为了简化将来的过程,我只想保存与基础服务器不同的软件包列表。
krtek

1
好的,这也非常容易。首先通过“ dpkg --get-selections> old-packages-list”从旧服务器上备份列表,然后通过“ dpkg --get-selections”获取新服务器上的软件包列表。 >“ new-packages-list” ,,,运行此命令“ cat old-packages-list | awk'{print $ 1}'> old-list” ,,“,在新服务器上使用相同命令,但用new替换old。在两个文件上运行差异,这将显示差异。由diff -w旧列表新列表
Farhan

1
cut -f1probablz会比awk快,并且像对Khaled的答案一样,diff不会总是返回正确的结果。comm现在请提供真正的解决方案...但是,我缺少一个仅列出手动安装的软件包的版本。
krtek

1

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

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

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

     diff -Nur old_file new_file > changes.txt

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


diff输出的问题在于它不能直接馈给apt-get以自动方式重新安装所有内容...就像拟议的Shellholic一样,在这种特殊情况下使用comm更好,如果diff可能会提供错误的结果包裹清单真的很长。
krtek

另一个问题是dpkg会自动调整输出列的大小。因此,来自具有较长软件包名称的服务器的dpkg -l会使diff变得困难。
Paolo

1

蓝图专为满足您的需求而设计。它吐出已安装的描述包和已更改的配置文件。能够将这些描述转换为Puppet或Chef脚本,以便将其应用于干净的盒子。


0

还发现了这个有用的软件包,其说明如下:

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

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

只需一个bash文件,您就可以将它放在PATH中的某个位置并运行-似乎对我有用,并且它不太旧。

希望这对某人有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.