Обнаружение измененных файлов из пространства пользователя Linux - PullRequest
0 голосов
/ 09 ноября 2011

Мне нужно создать список измененных файлов с момента последнего создания списка в системе Linux.Мне нужно сделать это в пространстве пользователя, поэтому решения типа FAM мне не подходят.Для этого у меня есть несколько ограничений ниже:

  1. Целевое решение может использоваться как в файловых системах ext2, так и ext3.
  2. Должно быть реализовано в пользовательском пространстве, ядреМодификации или модули не допускаются.
  3. Не должно зависеть от времени модификации файла.Для генерации delta .
  4. он должен использовать как минимум размер файла или, лучше, алгоритм контрольной суммы. Он не обязательно должен быть в режиме реального времени, он будет запускаться периодически (например, каждые 10 минут).

Кто-нибудь знает уже реализованное решение для этой задачи?Я попытался использовать rsync для этой цели, но, похоже, rsync требуется копия всех файлов для расчета различий.

EDIT

В основном мне нужен механизм, которыйгенерирует список файлов и их дельты рекурсивно в данном каталоге и сравнивает с предыдущими.Он может использовать размеры файлов для генерации различий или лучше использовать алгоритм различий (аналогично алгоритм rsync ).Однако криптографические алгоритмы хеширования, такие как MD5 и SHA1, не подходят для меня из-за их производительности.Обратите внимание, что у меня есть тысячи тысяч файлов, и это не криптографический случай.

Решения в реальном времени или решения, требующие изменений в ядре (например, inotify, kqueue, FAM , Предохранитель ) меня тоже не устраивает.

Спасибо.

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Если вас устраивает пересчет контрольной суммы каждого файла для каждого прогона, вы можете использовать простое решение:

 find / ( -not -path '/tmp/*' -and -type f ) -print0 | xargs -0 md5sum > /tmp/current-listing
 diff /tmp/old-listing /tmp/current-listing
 mv /tmp/current-listing /tmp/old-listing
1 голос
/ 09 ноября 2011
  • Вы можете использовать средство inotify для мониторинга файловой системы.Не уверен, что есть инструмент, который уже делает это, но быстрый поиск дает много результатов, например https://github.com/rvoicilas/inotify-tools/wiki/.
  • Вы можете использовать md5sum, чтобы сделатьэто:

    find / -xdev -type f -print0 | xargs -0 md5sum -b >> /tmp/sums.txt

    Теперь вы можете сортировать эти файлы и сравнивать их для выявления различий:

    sort -k 2 < /tmp/sums.txt > /tmp/sums.sorted.txt

    Я думаю, вы получитеидея, но, конечно, это займет лот времени, так как вы проверяете все свои данные.

РЕДАКТИРОВАТЬ: Я имеюнаписал быстрый скрипт, который выводит дерево файловой системы, добавляя размер файла к имени файла.Вы можете использовать diff для сравнения результатов двух прогонов, чтобы определить, что изменилось.Конечно, это всего лишь эскиз, и его можно улучшить.

#!/usr/bin/env python

import os
import sys

# initialize variables.
entries=[]
if len(sys.argv) > 1:
        rootdir=os.path.normpath(sys.argv[1])
else:
        rootdir=os.curdir

# walk filesystem tree.
for root, dirs, files in os.walk(rootdir):
        for name in sorted(files):
                fullname=os.path.normpath(os.path.join(root, name))
                if os.path.islink(fullname) or not os.path.isfile(fullname):
                        entries.append(fullname)
                else:
                        st=os.stat(fullname)
                        entries.append("%s %d" % (fullname, st.st_size))
        for name in sorted(dirs):
                entries.append(os.path.normpath(os.path.join(root, name)))

# print sorted list of found filesystem entries.
for entry in sorted(entries):
        print entry

Вам это поможет?

Предлагаемые улучшения:

  • Проверьте, является ли каталог точкой монтирования, и исключите его из прогулки.
  • префикс типа буква для дампа, например f blub 6 или d test, чтобы найти измененные типы файлов.
  • appendst_mtime/st_atime/st_ctime к файлам для обнаружения изменений файла в зависимости от времени.
  • добавьте md5 сумму первых и последних 1024 байтов файла для обнаружения наиболее распространенных изменений (например, если файл получает добавленные данные).
  • добавьте полную контрольную сумму к содержимому файла, например, CRC32.

Я надеюсь, что эти предложения помогут вам создать классный инструмент; -)

0 голосов
/ 09 ноября 2011

Вы можете посмотреть на

  • натяжные
  • RkHunter
  • rsync (но вам потребуется справочная копия)

rdiffbackup и rsnapshot являются полнофункциональными решениями для инкрементного (деленифицирующего) резервного копирования на основе rsync.

Вам также может быть полезен zfs-fuse или zfsonlinux . Эти файловые системы поддерживают непрерывный снимок:

 SNAPID=$RANDOM # something unique, please
 zfs snapshot tank/volume_of_mount@$SNAPID
 zfs send -i tank/volume_or_mount@previous tank/volume_of_mount@$SNAPID |
     pbzip2 > dumpfile.$SNAPID.bz2

Получающий конец:

 zfs receive -vFdn tank2/into_this@$SNAPID < dumpfile.$SNAPID.bz2

Этот вид моментальных снимков может быть выполнен на лету, в режиме реального времени и работает очень хорошо, поскольку ZFS - это файловая система с лог-структурой и встроенными проверками целостности на основе дерева Merkel.

...