比较整个 Linux 系统

比较整个 Linux 系统

我安装了一个基本的 Linux 系统。我想运行一个非常大且复杂的第三方脚本,该脚本将对整个系统的各个部分进行许多更改。这些更改将包括添加新文件、修改现有文件和删除现有文件。脚本完成后,我将拥有一个修改后的系统。修改将是广泛而实质性的。

我想要有关已添加、删除或修改的所有文件的某种报告以及对修改的逐行分析。像文件比较工具的输出这样的东西会很棒。

我假设我需要在运行脚本之前制作某种快照,然后再制作第二个快照。我假设我会将这些快照输入到某种 diff 或类似 diff 的工具中。

有谁知道要使用什么工具以及如何区分整个系统?

我正在使用 Virtualbox,它有一个差异图像特征,虽然我不知道我是否可以将其适应这个目的。此外,如果可能的话,我更喜欢更通用的解决方案。

答案1

我认为你的想法离解决方案不远了。概述一种可能的方法:我用于rsnapshot备份。它创建所有文件或文件子集的目录(备份)结构,其入口点为(例如)/backup/hourly.1/.../backup/hourly.0/...,其中每个分支承载整个数据,但对未进行任何更改的文件使用(硬)链接。对两个结构进行递归lsfind比较并比较(排序,如果查找)输出将显示丢失的文件,检查链接计数(其中将ls -l是第二列)将显示新文件(具有链接计数) 1)。有关文件更改的详细信息,您可以(对于已识别的文件)使用普通diff工具。正如所说,这是一个大纲,需要一些工作来实施,并且可能有不明显的怪癖,所以对该提案持保留态度

答案2

页面位于Linux 食谱显示修改前和修改后的 find-grep,后跟 diff。这非常简单,它可能是一个起点,但您的问题可能可以通过指出的更复杂的解决方案得到更好的解决。

这看起来只会捕获添加和删除,而不捕获修改......干杯,drl

答案3

所有这些答案都朝着正确的方向和相同的方向前进。不妨将我的 8 位放入...

在 virtualbox 上安装基本系统。初始设置和基础准备就绪后,使用其他一些实时媒体启动虚拟机。然后,您可以压缩或以其他方式导出文件系统,而无需/proc涉及易失性目录。

运行您的大型脚本,然后重复导出过程。

现在您已经有了 2 个可用的文件系统,您可以使用各种比较工具。

diff --brief -Nr /tree1 /tree2

将为您提供一个很好的文件列表,其中列出了 上不同的文件stdout,以及在 上的一棵树或另一棵树中找不到的文件列表stderr

要找出实际发生的更改,您可以解析stdout不同文件的输出,并diff分别对它们运行常规操作,将输出重定向到文件。或者您可以只检查列表并对您特别感兴趣的文件运行 diff。

您可以使用 . 将所有这些组合到一个命令中git。无需初始化存储库即可使用,只需指向任意 2 个目录。提供漂亮的彩色输出,通过 less 进行分页。

git diff --no-index /tree1 /tree2

答案4

有一个叫做 libguestfs 的东西可以用来执行差异。这就是我过去使用过的,我认为现在甚至可以内置该操作,这样您就不必使用 guestfish shell。

另一种选择是在 Docker 容器中运行操作,然后将生成的文件树导出并比较为 tar 文件。

但请注意,如果脚本通过写入虚拟文件来更改系统设置,那么这些更改将不会显示在文件树中,并且您需要其他东西来捕获这些更改。类似的一个例子是 iptable 规则。您将需要自定义逻辑来捕获这些更改。

相关内容