如何找出安装程序(rpm,deb)创build的文件?

我需要找出安装程序所做的所有文件系统修改。 最有可能安装的软件包是rpm或deb,但是应用程序当然可以简单地复制或编译,并使用configure; make; make install方式进行安装。 即使rpm和deb有文件列表,它们的安装后脚本也可以进行额外的文件系统修改。

我第一次去寻找一个应用程序,可以监视另一个应用程序来查找其他应用程序所做的所有文件系统修改。 我还没有find。

接下来,我考虑了分层的文件系统,在开始安装应用程序之前,我想把它放在一个分层的文件系统中,然后在分层的文件系统上安装应用程序,然后找出在该层中发生的所有修改。 我能find的最好的是mini_fo,但似乎自2006年以来一直没有维护。它似乎也不能被覆盖/(这隐藏了一些层次的东西)。

然后我研究了基于inotify的解决scheme,但是对于从/开始的所有事情来说,这似乎是不切实际的。 例如,inotifywatch(linux.die.net/man/1/inotifywatch)默认提到手表的限制只是8K。 这也需要一些时间来安装观察者。 也有似乎是错误,新创build的目录不立即观看,所以他们的变化可能会被错过。

除了在安装和比较之前和之后从文件系统中获取快照之外,还有其他方法可以实现我想要做的事吗?

我会试图通过strace来运行你的安装。 它会有点吵,但是你logging的所有其他东西,你应该能够看到应该看到的东西写的东西。

这是一个似乎接近显示所有文件访问在安装过程中没有太多噪音的命令。

sudo strace -o /tmp/install.log -f -e trace=file apt-get install package 

这个问题已经得到了答复,但我会抛弃我所做的事情。 如果您只想查看是否创build,删除或更改了文件,则可以这样做:

 find / -xdev -printf '%p\t%c\n' |sort >/tmp/before rpm/dpkg/apt-get/yum/whatever find / -xdev -printf '%p\t%c\n' |sort >/tmp/after diff -u /tmp/before /tmp/after |less 

而已。 这显然不会告诉你一个文件是如何改变的,但至less你会知道它确实有所改变。

关于RPM,您可以通过调用以下命令来获取软件包所安装文件的列表:

 rpm -ql <package_name> 

如果您在安装之前需要知道,您可以使用以下单行程序,它将列出程序包的内容。

对于RPM (需要rpm2cpiocpio命令):

 rpm2cpio <package>.rpm | cpio -vt 

对于DEB (需要artar命令):

 ar p <package>.deb data.tar.gz | tar zt 

以上所有信息都来自http://www.g-loaded.eu/2008/01/28/how-to-extract-rpm-or-deb-packages/在这两种情况下,您都会得到文件列表将被安装。 更多文件可能由这些软件包包含的前/后安装脚本创build。 列出这些文件是不可能的。

你可能想看看installwatch: http : //www.asic-linux.com.mx/~izto/checkinstall/installwatch.html和checkinstall: http : //asic-linux.com.mx/~izto/checkinstall/ 。 这两个非常基本的实用程序来确定安装过程实际触及什么。

这就是说,杰夫的发现| sorting命令是一个好主意,但可能有点“笨重”,因为它只是手动检查机器上的所有文件两次。

问题是年龄大了,答案需要更新。

解决scheme1 :使用容器或虚拟机,并使用基本映像制作diff。

解决scheme2 :使用auditd

解决scheme3 :使用systemtap并监视所有打开写入的文件。 请参阅: https : //sourceware.org/systemtap/examples/lwtools/opensnoop-nd.stp

 stap -e 'probe begin{ printf("%6s %6s %16s %4s %s\n", "UID", "PID", "COMM", "FD", "PATH");} probe nd_syscall.open.return{ printf("%6d %6d %16s %4d %s\n", uid(), pid(), execname(),returnval(), user_string(@entry(pointer_arg(1))));}' 

解决scheme4 :使用straceltrace作为@Zoredache被提及。