1

想象一个目录树(在 Linux 上):

user@computer:~/demo> find .
.
./test1
./test1/test1_a
./test1/test1_a/somefile_1a
./test1/test1_b
./test1/test1_b/somefile_1b
./test0
./test0/test0_a
./test0/test0_a/somefile_0a
./test0/test0_b
./test0/test0_b/somefile_0b

场景:我确定了关于该树中每个目录和文件的所有可用元信息(mtime、ctime、inode、大小、文件内容的校验和......),包括最高级别的目录,demo. 我存储这些信息。然后,一些文件/s 或目录/ies 被更改(字面上更改或新创建或删除)。使用先前确定和存储的信息,我现在想弄清楚发生了什么变化。

到目前为止我的解决方案:我遍历整个树,然后查找更改的元信息,然后处理它。超过一定大小,遍历树并查看每个目录和文件变得非常耗时——即使您只查看纯元信息(即 ctime、mtime 等,而不是文件内容校验和)。人们只能在一定程度上优化这种遍历(例如,在遍历期间实际上只读取文件和文件夹的元信息一次,而不是多次等)——最终,I/O 速度成为瓶颈。

问题:我有哪些选项(在 Unix/Linux 文件系统上)可以在不遍历所有树的情况下查找树中的更改?即是否有任何存储的信息demo告诉我/以某种方式表明它下面的某些东西(例如somefile_1b)已经改变?是否有任何特定的文件系统(EXT*、XFS、ZFS,...)提供此类功能?

注意:我知道运行后台进程以监视文件系统更改的选项。它将消除对我的树的完全遍历的需要,尽管我对不需要后台监视过程的选项更感兴趣(如果这种选项存在的话)。

4

1 回答 1

1

ZFS 通过 Oracle Solaris 11.2 文档提供了zfs diff ...功能

识别 ZFS 快照差异 (zfs diff)

您可以使用该zfs diff 命令确定 ZFS 快照差异。

例如,假设创建了以下两个快照:

$ ls /tank/home/tim
fileA
$ zfs snapshot tank/home/tim@snap1
$ ls /tank/home/tim
fileA  fileB
$ zfs snapshot tank/home/tim@snap2

例如,要识别两个快照之间的差异,请使用类似于以下的语法:

$ zfs diff tank/home/tim@snap1 tank/home/tim@snap2
M       /tank/home/tim/
+       /tank/home/tim/fileB

在输出中,M 表示目录已被修改。+ 表示 fileB 存在于后面的快照中。

以下输出中的 R 表示快照中的文件已被重命名。

$ mv /tank/cindy/fileB /tank/cindy/fileC
$ zfs snapshot tank/cindy@snap2
$ zfs diff tank/cindy@snap1 tank/cindy@snap2
M       /tank/cindy/
R       /tank/cindy/fileB -> /tank/cindy/fileC

这仅在两个快照之间进行比较,因此您必须能够创建 ZFS 快照才能有效地使用它。

于 2017-11-19T20:28:03.597 回答