А у нас новый сайт ----------------> www.ph-ph.ru!
Finar.ru
web.finar.ru
video.finar.ru
Темы для BootstrapNew!

Скрипты для настройки надежного бэкапа файловой системы на основе комбинации nnCron и nnBackup

отточенные временем и от того очень полезные

Автор: Филипп Казаков | 2013-09-02 | просмотров 853
Тэги

Когда-то в "Компьютерре" вышла моя статья Параноидальный бэкап. С тех прошло больше шести лет, в течение которых описанные в статье скрипты использовались, дорабатывались, корректировались - одним словом развивались и оттачивались. В настоящее время скрипты успешно работают с файловыми системами в следующих условиях:

  • среды для запуска Windows XP, Windows 7
  • копирование сотен тысяч файлов
  • копирование файловой структуры, содержащей имена в кодировке Unicode, кириллицу, пробелы, длинные имена и пути
  • копирование с сетевых драйвов, флэшек

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

Скрипты не будут работать корректно, если на целевом бэкапном диске используются жесткие ссылки NTFS . Так что если вы, как и я в мае 2013 года, отличились умом и сообразительностью и просканировали весь бэкапный диск на предмет идентичных файлов (с помощью Dup Same Files Searcher, например) и заменили их жесткиими ссылками, то... создайте новый бэкап с нуля, иначе директория с дампами начнет бесконтрольно расти. Теория иногда расходится с практикой, увы :(

Общая политика бэкапирования простыми словами

(политика может быть реализована в скриптах в разных комбинациях)

  • запускать акт бэкапирования при следующих условиях:
    • каждые 4 часа / раз в сутки ночью
    • если переносной диск/флэшка или сетевой драйв доступны
    • если компьютер бездействует более 5 минут
    • если предыдущий бэкап старше 1 суток
  • совершать бэкапирование по следующему алгоритму:
    • синхронизовать все файлы с Исходного диска на диск X:/%, где % - буква исходного диска
    • исключить из синхронизации директории и файлы, перечисленные в файле exclude.msk
      • в частности, для исключения какой-либо папки вручную, добавьте к ее имени постфикс .@exc
    • все файлы, на момент синхронизациии отсутствующие на Исходном диске, но имеющиеся в резервной копии, не удалять, а класть в директориию X:/%dumps/%дата_и_время_синхронизации%
    • в конце записывать дату бэкапа в файл прямо на тот диск, который бэкапился. Это дает:
      1. в общем случае прозрачную связку времен бэкапов переносного носителя между всеми компьютерами
      2. каждый следующий бэкап в любом случае закончится не с 0 на выходе, т.к. хотя бы файл с датой будет забэкаплен

В процессе бэкапирования на диске создается файл backup.lock (защита от одновременных запусков, если первый бэкап длится очень долго) Файл удаляется только в случае успешного завершения бэкапа. Следующий бэкап не запускается, если на диске существует backup.lock Отдельная группа скриптов-напоминателей следит за тем, чтобы бэкапы запускались регулярно, и в случае чего сообщают об этом пользователю. Таким образом, если бэкап завершится с ошибкой, пользователь будет уведомлен об этом.

Общие рекомендации

Официальные версии nnCron и nnBackup обновляются очень редко, поэтому настоятельно рекомендуется использовать бета-версии. Бета-версии можно найти и скачать на форуме . Скрипты, приведенные в настоящей статье, успешно работают со следующими версиями:

  • nncron193b3.exe
  • nnbackup301r8.exe

Исходные коды скриптов (на примере полного бэкапа диска с буквой H)

Этап 1: bat-файл для запуска скрипта nnBackup

rem скрипт автоматического бэкапа диска. H - буква бэкапируемого диска
time /t >H:\backup.lock
"C:\Program Files (x86)\nnBackup\nnbackup.exe" -f C:\!nncron\backup_H.cfg
if not errorlevel 0 goto error
goto ok
:error
echo "Error code - %ERRORLEVEL%"
exit %ERRORLEVEL%
:ok
date /t >H:\last_backup.date
time /t >>H:\last_backup.date
del H:\backup.lock

Словами:

  • запускаем nnbackup.exe, передаем ему в качестве параметров файл backup_%.cfg
  • если что-то пошло не так (процесс упал), то выводим ошибку (попадет в лог) и прерываем работу
  • если все ОК, записываем дату бэкапа и удаляем backup.lock

Этап 2: конфигрурация файлов backup_%.cfg (своя для каждого диска)

\ последняя правка: 2013-07-21
\ все строчки, требующие редактирования помечены как  (ПРАВИТЬ) 

\ синхронизируем

sync

\ игнорировать возможные файловые ошибки при копировании (обход антивируса)
-c

\ исходный каталог (ПРАВИТЬ):
-i H:\

\ приемный каталог (ПРАВИТЬ):
-o "X:\H\"

\ сравнивать при синхронизации не только время последней модификации файла, но и время его создания
-tc

\ копировать в приемный каталог не только все новые файлы из исходного каталога и все файлы с более "новой" датой создания или модификации, но и файлы, чья дата создания/модификации изменилась в противоположную сторону или не изменилась вовсе, но при этом изменился размер файла.
-ad

\ удалять в приемном каталоге файлы, отсутствующие в исходном каталоге. Удаление происходит после завершения копирования новых и обновленных файлов, т. е. сначала копируются новые и обновленные файлы, потом удаляются отсутствующие файлы. Эта опция не работает при двунаправоенной синхронизации (sync2)! 
-da

\  не удалять отсутствующие каталоги при синхронизации. Этот ключ определяет поведение программы в случае, если какой-то каталог был удален в исходном каталоге, но все еще содержится в резервной копии. В случае, если папка удалена из исходника, в бэкапе она останется пустой, а копия ее отправится в дамп.
-nd

\ исключаем файл подкачки (если встретится):
-x pagefile.sys

\ исключаем все системные и временные директории (ПРАВИТЬ):
-dx @C:\!nncron\exclude.msk

\ учитывать вложенные каталоги при копировании, т. е. копировать файлы из исходного каталога и всех его подкаталогов
-s

\ копировать пустые каталоги
-e

\ все, что меняется или удаляется сливать в отдельную папку с текущей датой (ПРАВИТЬ):
-backup X:\Hdumps\%YYYY%-%MM%-%DD%-%hh%-%mm%-%ss%\

\ Информация о копируемых файлах отображается на консоли (если не использована опция -q)
-v

\ логировать процесс (ПРАВИТЬ):
-log X:\H.log

\ создавать список обработанных файлов
\ -list filelist.txt

\ имитация
\ -nocopy

Этап 3: файл exclude.msk

Здесь перечислены исключения, что НЕ бэкапить

*.@exc
System*Volume*Information
RECYCLER
$RECYCLE.BIN
temp

Этап 4: запуск задач через nnCron

Приведу два примера, для разных случаев.

Пример 1 - еженощное бэкапирование сетевого диска из под Windows 7

#( backup_H
\ в 06:01
Time: 01 6 * * * *

\ если компьютер 300 секунд в покое и предыдущий бэкап не завис (нет lock-файла)
Rule: IDLE: 300 FILE-EXIST: "H:\backup.lock" NOT AND

\ запустить действие если бэкап старше суток
Action:
    CUR-DATE
    FILE-WRITE-DATE: "H:\last_backup.date"
    DATE- 1 > 
    IF
	StartIn: "C:\!nncron\" 
	ShowNormal   NormalPriority
\ с запросом на запуск и с сообщением об ошибке если что
	QSTART-APPW: C:\!nncron\backup_H.bat
	ExitCodeProc 0 <> IF MSG: "Error while making H Backup: %ExitCodeProc%!" THEN
    THEN
)#

Пример 2 - каждые 4 часа бэкапить флэшку из под Windows XP

#( flash_full_backup
AsLoggedUser

\ каждые 4 часа
Time: * */4  * * * *

\ если флэшка подключена, компьютер 300 секунд в покое, и предыдущий бэкап не завис (нет lock-файла)
Rule: FILE-EXIST: "Y:\Transport.@exc" IDLE: 300 AND FILE-EXIST: "Y:\backup.lock" NOT AND

\ запустить действие если бэкап старше суток
Action:
    CUR-DATE
    FILE-WRITE-DATE: "Y:\last_backup.date"
    DATE- 1 > 
    IF
	StartIn: "Y:\backup_scripts" 
	ShowNormal   NormalPriority
\ с запросом на запуск и с сообщением об ошибке если что
	QSTART-APPW: Y:\backup_scripts\backup_flash_AHILL_full.bat
	ExitCodeProc 0 <> IF MSG: "Error while making FLASH Backup: %ExitCodeProc%!" THEN
    THEN
)#

Этап 5: настройка ремайндеров в nnCron (проверяют актуальность бэкапов при логине пользователя)

Для Windows 7

#( backup_H_reminder
WatchLogon: "*"
Rule: FILE-EXIST: "H:\last_backup.date" 
Action:
    CUR-DATE
    FILE-WRITE-DATE: "H:\last_backup.date"
    DATE- 2 > 
    IF
        MSG: "Бэкап диска H не делался больше 2 дней! Что-то, возможно, не так." 
    THEN
)#

Для Windows XP:

#( flash_backup_reminder
Time: START-TIME
Action:
    PAUSE: 20000
    CUR-DATE
    FILE-WRITE-DATE: "Y:\last_backup.date"
    DATE- 1 > 
    IF
        MSG: "Не пора ли забэкапиться? Бэкап диска Y не делался больше суток!" 
    THEN
)#

Отредактировано 2013-10-26:

  • убрано Rule: FILE-EXIST: "H:\last_backup.date" так как даже без этого условия при отсутствии файла ремайндер срабатывает как надо;
  • добавлено PAUSE: 20000 за тем, что иначе ремайндер не срабатывает при проверке сетевых дисков, так как они подключаются после загрузки nncron (если он сконфигурирован как сервис). Паузу нужно настраивать исходя из скорости загрузки вашей ОС и только для сетевых дисков.

Другие полезные скрипты, связанные с бэкапами

bat-файл для cоздания "слепка" файловой системы

dir U:\ /s /b >X:\UBuffer\ahill_buffer_list.txt
tree U:\ >X:\UBuffer\ahill_buffer_tree.txt

taurus — 2013-09-02, 12:56

0. Очень уж лапидарно! : )

1. Комментарии в коде скриптов не видно целиком

2. А как на счет прав? Подразумеваются, похоже, полные права. А если это рядовой пользователь?

3. В связи с п. 2 - может быть, скрипты помещать на бэкапном сервере (по-возможности: понятно, например, что напоминалки должны быть на клиенте)?

0. жизненные обстоятельства заставляют
1. пока можно промотать, поправлю позже
2. с правами - никак. Все примеры предполагают админские права. С пользовательской точки зрения я вопрос не исследовал.
3. в моей концепции бэкапы должно запускать то, что бэкапится. Иначе бэкап регулярно будет прерываться. Аргументация ниже.

Finar.

taurus — 2013-09-02, 16:22

Вероятно, на Этапе 1 удаление лока нужно делать независимо от результата, иначе в следующий раз бэкап нужно запускать руками (удалять лок). Ошибку же можно писать в лог. Админу все равно, что увидеть - лок или лог, но в лог еще и ERRORLEVEL можно записать, и дату-время.

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

Бэкап делается автоматом. Если он не сделался - он привлекает внимание пользователя при каждой загрузке компьютера, то есть тогда, когда человек более-менее готов на это отреагировать. Админа в этой схеме вообще нет. На мой взгляд, это максимально простая логика. Можно усложнить задачу, вести отдельно локи и логи; но опыт показывает:

  1. даже внедрение простейшего рабочего решения люди откладывают месяцами;
  2. бэкап делается фоном, он не должен отвлекать, даже если возникла ошибка;
  3. число узлов цепочки снижает надежность в геометрической прогрессии;
  4. предложенная схема достаточно надежно работает в бытовых условиях.

Finar.

Дмитирий — 2015-01-02, 10:23

Куча , нет последовательности

Оставить комментарий 


Ваше имя:
->