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

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

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

我首先寻找一个可以监视另一个应用程序的应用程序,以查找另一个应用程序所做的所有文件系统修改。但我还没有找到。

接下来,我研究了分层文件系统,在开始安装应用程序之前,我想先放入一个分层文件系统,然后在分层文件系统上安装应用程序,然后找出该层中发生的所有修改。我能找到的最好的方法是mini_fo但似乎自 2006 年以来它就没有得到维护了。它似乎也不能被覆盖在 / 上(这会隐藏图层中的一些内容)。

然后我研究了基于 inotify 的解决方案,但似乎它不适合监控从 / 开始的所有内容。例如,inotifywatch (linux.die.net/man/1/inotifywatch) 提到默认情况下监视的限制仅为 8k。安装监视程序也需要一些时间。似乎还存在错误,新创建的目录不会立即受到监视,因此可能会错过其中的更改。

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

答案1

我很想尝试通过以下方式运行你的安装斯特拉斯。它会有点吵,但除了它记录的所有其他内容之外,您应该能够看到写入的所有内容。

这个命令似乎几乎可以显示安装过程中的所有文件访问,而且不会产生太多噪音。

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

答案2

这个问题已经得到解答了,但我还是会继续说下去。如果你只想查看文件是否被创建、删除或更改,你可以这样做:

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

就是这样。它显然不会告诉您文件是如何更改的,但至少您会知道它确实以某种方式发生了变化。

答案3

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

rpm -ql <package_name>

如果你想知道在安装之前,您可以使用以下单行命令,它将列出包的内容。

为了每分钟转数(需要rpm2cpio&cpio命令):

rpm2cpio <package>.rpm | cpio -vt

为了德布(需要ar&tar命令):

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

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

答案4

这个问题由来已久,答案需要更新。

解决方案 1:使用容器或虚拟机并与基础映像产生差异。

解决方案 2:使用 auditd

解决方案 3:使用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))));}'

解决方案 4:使用strace或,ltrace正如@Zoredache 提到的。

相关内容