如何在 Linux 上“影子”文件系统?

如何在 Linux 上“影子”文件系统?

在 Linux 环境中,有时我需要以 root 身份运行脚本,该脚本将添加/修改我的 fs 上的几个文件。

基本上,我想确切地知道哪些文件被修改了以及如何修改,而无需打开脚本并尝试猜测代码。

我正在考虑使用类似 unionfs 的东西:主 fs 可以在只读模式下访问,并且所有更改都写入用作分区的文件中,并以写入模式“挂载”。

还有其他方法可以实现相同的目标吗(即除了 unionfs 之外)?

答案1

前面提到的 LVM 解决方案的一个示例。

警告:您想要差异的文件系统必须位于 lvm 逻辑卷上! (并且您的磁盘上必须有一些可用空间。)

# lvcreate --size 2G --name your-fs-snapshot --snapshot /dev/vg0/your-fs
  逻辑卷“your-fs-snapshot”已创建

这将在此时拍摄 /dev/vg0/your-fs 的快照。然后,执行您想要记录的更改。

您可以将快照作为原始状态下的 your-fs 的副本安装,并使用您选择的工具(例如 diff)进行差异比较。

# 挂载 /dev/vg0/your-fs-snapshot /mnt
# diff -q /原始/卷/子目录 /mnt/子目录

不要忘记卸载并删除快照,因为在执行此操作时,对原始卷的更改将被记录为快照的反向差异 - 直到填满为止。

# 卸载 /mnt
# lvremove /dev/vg0/你的文件系统快照
您确实要删除活动逻辑卷 your-fs-snapshot 吗?[y/n]: y
  逻辑卷“your-fs-snapshot”已成功删除

暗示:如果您的逻辑卷包含分区表,则可以通过以下方式添加设备条目:

# kpartx -av /dev/vg0/你的磁盘快照

答案2

您可以创建 LVM 快照,然后挂载该快照,运行脚本,然后在快照和原始快照之间进行比较。

答案3

在当今流行的快照和跟踪技术出现之前,人们通过巧妙使用LD_PRELOAD环境变量解决了这个问题,它允许你用自己的替换覆盖 C 库函数(称为函数插入)。在这种情况下,您可以包装open()系统调用,当文件被打开进行写入时,您可以:

  • 保留原件(例如,使用.bak扩展名或其他东西)
  • 允许安装程序替换它
  • 生成原始版本与修改版本之间的差异。

安装监视程序就是这类东西的一个例子。这类解决方案还有许多其他例子,并且还有许多其他方法可以用来LD_PRELOAD修改二进制程序的行为。

答案4

您可能还想了解一下 inotify,它允许您在文件系统事件发生时对其进行监控。它类似于 OS X 的 fsevent 框架。大多数发行版都会有一个 inotify-tools 包。

相关内容