Назад | Перейти на главную страницу

В Linux, что может быть быстрее, чем find или diff -r, чтобы увидеть, изменилось ли что-то внутри каталога?

я использую tar для создания моментальных снимков различных частей файловой системы на моих серверах, а затем ftp этого моментального снимка в удаленное место для архивирования.

Я хотел бы начать эту операцию только тогда, когда что-то изменится. Некоторые резервные копии выполняются во всех системных папках, которые меняются очень редко (например, при установке нового программного обеспечения или изменении конфигурации).

Когда бы ни происходило изменение, мне нужен полный снимок. Я мог бы составить список измененных файлов с find, но мне действительно нужно знать, равна ли длина этого списка 0 или больше. Использование find для этого слишком медленное.

Я знаю, что есть инкрементные резервные копии, и я уже использую rsync в сочетании с ZFS для этого в других ситуациях. Однако здесь резервным хостом является FTP-сервер (поэтому нет rsync), мне нужны полные резервные копии (потому что резервный архив используется в качестве образа для восстановления или клонирования серверов), и мне нужен сжатый вывод (так что tar удобен).

редактировать: Обратите внимание, что я не ищу инкрементную резервную копию (она у меня есть), но скорее для быстрого (что вроде исключает поиск и т.п.) и простого способа решить, будет ли полный снимок идентичен предыдущему. Может быть, моя фраза была не такой уж хорошей. Сейчас я редактировал заголовок.

GNU tar имеет параметр --newer-mtime, который требует аргумента даты, который предположительно будет последним разом, когда вы делали резервную копию. В зависимости от того, сколько работы вы хотите восстановить файловую систему, это может быть либо последняя полная резервная копия, и в этом случае вам нужно будет восстановить полный дамп и последний ежедневный дамп, либо вы можете сделать это с момента последнего инкрементального, в котором В этом случае вам нужно будет восстановить полный дамп и каждый дамп после этого.

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

В Incron Утилита использует inotify для запуска команд при возникновении событий файловой системы. Файл конфигурации похож на crontab, но вместо времени вы указываете пути и события.

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

В последних версиях GNU find есть действие "-quit", которое заставляет find немедленно прекращать поиск:

- Действие: -выйти

Немедленный выход (с нулевым возвращаемым значением, если ошибок не было). Это отличается от «-prune», потому что «-prune» применяется только к содержимому сокращенных каталогов, а «-quit» просто немедленно останавливает поиск. Дочерние процессы не останутся запущенными, но файлы, указанные в командной строке, обрабатываться не будут. Например, find / tmp / foo / tmp / bar -print -quit распечатает только «/ tmp / foo». Любые командные строки, созданные с помощью ‘-exec ... +’ или ‘-execdir ... +’, вызываются до выхода из программы.

Вы можете использовать выражение find для поиска файлов, которые изменились, и использовать -quit, чтобы останавливаться, как только вы его найдете. Это должно быть быстрее, чем поиск продолжит сканирование.

-quit был добавлен в fileutils V4.2.3

Вы всегда можете трубить найтивывод на Туалет и получите целое число измененных файлов:

find . -ctime 1 | wc -l

Хотя Ответ Дэвида требует меньше изменений кода :)

Это немного дикая идея, но вы можете немного поиграть с md5sum и ls.

Эта идея состоит в том, чтобы смотреть только на md5-сумму одного файла, и этот файл является списком файлов того каталога, который вы просматриваете. И пока ничего не меняется, md5sum остается прежним. Но если временная метка обновлена, md5sum изменится, и вы знаете, что вам нужно создать новый tar и отправить его на свой ftp-сервер.

Мы могли бы начать с чего-то вроде этого

ls -lR /path/to/dir/ | md5sum > file_list.txt.md5

Затем вам нужно будет добавить сравнение между старым md5 и текущим ... и т.д.

/ Йохан

смола имеет --diff опция, которая «найдет различия между архивом и файловой системой». Если вы храните локальную копию загруженного файла, вы можете сравнить их с этим.

У вас также есть опция -g в нижнем регистре -g, --listed-incremental F создание / список / извлечение новой инкрементной резервной копии в формате GNU

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

tar -zcvf /home/backup.tar.gz /backup_dir

затем

  NOW=$(date +"%d-%m-%Y")
  i=$(date +"%Hh%Mm%Ss")
  FILE="i.$NOW-$i.tar.gz"

tar -g /home/backup.incremental.txt -zcvf /backup/$FILE /backup_dir

Я полностью переключил резервную копию на rsnapshot (perlscript, он использует rsync и жесткие ссылки, он может резервировать удаленные хосты)

Каждую ночь rsync копирует только новые файлы и - благодаря жестким ссылкам - каждая резервная папка представляет собой полные данные.

rsnapshot работает очень быстро, а восстановление очень просто - попробуйте!

Радикальная идея: вы можете настроить систему для аудита файлов при каждом доступе.

Это очень многословно с точки зрения ведения журнала, но предоставит вам отметки даты при каждом чтении / записи. Да, это похоже на концепцию ведения журнала аудита Windows NT. Вероятно, это излишне для вашей установки, но в интересах полноты я предлагаю эту концепцию ...

Вы можете настроить аудит с помощью этого краткое руководство здесь.

Плюсы:

  • улавливает практически все, включая историю множества правок и изменений.
  • очень мелкий контроль зерна
  • может выборочно проверять по файлам

Минусы:

  • увеличивает выброс журналов в 1 миллиард процентов, если не будет должным образом заполнен каталогами, которые вас беспокоят. Используйте это разумно.
  • Не проверяет изменения данных, только кто что и когда сделал

Вы можете использовать ausearch инструмент для поиска изменений в файлах по имени файла. Простой сценарий для перебора каталогов (и подкаталогов?) Для каждого файла позволит вам вносить изменения в простой файл, давая вам список файлов, которые были «затронуты» в соответствии с указанными вами критериями. Вы можете легко расширить это с помощью других параметров фильтрации в ausearch для каждого пользователя (полезно, если у вас есть учетная запись пользователя для службы), для каждой команды и т. д.

Вы можете установить git и проанализировать вывод «git status» (или, может быть, коды выхода?) Для рассматриваемых каталогов. Git довольно быстро делает то, что делает.

Просто не забудьте зафиксировать изменения, поэтому последовательные вызовы «git status» покажут изменения.

Еще одна идея - использовать tripwire или аналогичный инструмент.

Более грубый подход заключался бы в том, чтобы в любом случае периодически использовать tar для каталогов и сравнивать MD5 предыдущего tar. Однако, если каталоги большие, это не будет хорошо масштабироваться.

Похоже, что вы действительно хотите запускать процесс резервного копирования всякий раз, когда что-то изменяется в иерархии каталогов. inotify может помочь здесь.

Зарегистрируйте вывод ls -UlR --full-time /list/of /folders/to/monitor и передать его diff -q который останавливает сравнение, если обнаруживается изменение между его вводом и кэшированной версией (первый аргумент).

Если diff обнаружили разницу, воссоздайте кешированную версию, чтобы учесть последние файлы, затем снова сделайте снимок путей, как обычно.