在Linux环境中,有时我需要以root用户身份运行脚本,这会在我的fs上添加/修改多个文件。
基本上我想知道哪些文件被修改,以及如何不打开脚本,并试图猜测代码。
我正在考虑使用像unionfs这样的东西:主要的fs只能在只读模式下访问,所有的修改都写在一个用作分区的文件上,在写入模式下“挂载”。
还有其他方法可以达到同样的目标吗(即工会除外)?
前面提到的LVM解决scheme的一个例子。
警告:你想要比较的文件系统必须在逻辑卷上! (你必须在磁盘上有一些空闲空间。)
#lvcreate --size 2G - 为您的-fs-snapshot命名--snapshot / dev / vg0 / your-fs 创build逻辑卷“your-fs-snapshot”
这个时候会获取/ dev / vg0 / your-fs的快照。 然后,做你想logging的变化。
您可以将您的快照安装为原始状态下的fs副本,并使用您select的工具比较diff。
#mount / dev / vg0 / your-fs-snapshot / mnt #diff -q / original / volume / subdir / mnt / subdir
不要忘记卸载和删除快照,因为在这样做时,对原始音量的更改会被logging为快照的反向差异 – 直到填满为止。
#umount / mnt #lvremove / dev / vg0 / your-fs-snapshot 你真的想删除活跃的逻辑卷你的快照? [y / n]:y 逻辑卷“your-fs-snapshot”已成功删除
提示:如果您的逻辑卷包含分区表,则可以通过以下方式添加设备条目:
#kpartx -av / dev / vg0 / your-disk-snapshot
您可以创buildLVM快照,然后装载快照,运行脚本,然后在快照和原始文件之间进行区别。
在今天的精彩快照和跟踪技术之前,人们通过巧妙地使用LD_PRELOAD
环境variables来解决这个问题,这个环境variables允许你用你自己的replace(称为函数插入 )重载C库函数。 在这种情况下,你会open()
系统调用,当打开文件写入时,你可以:
.bak
或其他内容) installwatch程序就是这类事情的一个例子。 这种解决scheme还有很多其他的例子,还有很多使用LD_PRELOAD
来修改二进制程序行为的其他方法。
这听起来像systemtap可能擅长的东西。 这里有一个博客文章 ,有人写了一个systemtap脚本,将打印出用户打开的每个文件。 有一件事要记住,它不是一个特定的过程,所以如果你正在做脚本作为一个正在做很多其他事情的用户,这可能是非常嘈杂; 可能需要一些修改。 虽然,这是一个开始。
您可能还想研究inotify,这将允许您监视发生的文件系统事件。 它与OS X的fsevent框架类似。 大多数发行版都会有一个inotify-tools包。