Как определить, были ли изменены файлы в дереве каталогов, не просматривая все дерево?

Представьте себе дерево каталогов (в 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. Я храню эту информацию. Затем некоторые файлы или каталоги изменяются (буквально изменяются, вновь создаются или удаляются). Используя ранее определенную и сохраненную информацию, я теперь хочу выяснить, что изменилось.

Мое решение на данный момент: я просматриваю все дерево, затем ищу измененную метаинформацию, а затем обрабатываю ее. Выше определенного размера обход дерева и просмотр каждого каталога и файла становится довольно трудоемким - даже если вы смотрите только на чистую метаинформацию (т.е. ctime, mtime и т. д., а НЕ контрольные суммы содержимого файла). Такой обход можно оптимизировать только до определенной степени (например, читать метаинформацию о файлах и папках фактически только один раз во время обхода, а не несколько раз и т. д.) — в конце дня скорость ввода-вывода становится узким местом.

Вопрос: Какие варианты у меня есть (в файловых системах Unix/Linux) для поиска изменений в моем дереве без обхода всего дерева? Т.е. есть ли какая-либо информация, хранящаяся для demo, которая говорит мне / указывает каким-то образом, что что-то под ним (например, somefile_1b) было изменено? Существуют ли какие-либо определенные файловые системы (EXT*, XFS, ZFS, ...), предлагающие такие функции?

Примечание. мне известен вариант запуска фоновый процесс для мониторинга изменений в файловой системе. Это устранило бы необходимость полного обхода моего дерева, хотя меня больше интересуют варианты, которые НЕ требуют процесса фонового мониторинга (если такая опция существует вообще).


person s-m-e    schedule 19.11.2017    source источник
comment
Возможный дубликат как отслеживать полное дерево каталогов для изменений в Linux?   -  person Vasan    schedule 19.11.2017
comment
@Vasan частично, да, хотя могут быть файловые системы, которые действительно предлагают это как функцию ... (благодаря некоторому поведению, возможно, через черный ход).   -  person s-m-e    schedule 19.11.2017
comment
Обратите внимание, что использование любого процесса мониторинга не обнаружит изменения, сделанные, пока ваш процесс мониторинга не запущен. Так что это по своей сути ненадежно.   -  person Andrew Henle    schedule 19.11.2017


Ответы (1)


ZFS предоставляет эту возможность через zfs diff ... согласно документации по Oracle Solaris 11.2:

Выявление различий снимков ZFS (zfs diff)

Вы можете определить различия снимков ZFS с помощью команды zfs diff.

Например, предположим, что созданы следующие два снимка:

$ 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 указывает, что каталог был изменен. + указывает, что файл B существует в более позднем снимке.

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, чтобы использовать это эффективно.

person Andrew Henle    schedule 19.11.2017