Когда-то в "Компьютерре" вышла моя статья Параноидальный бэкап. С тех прошло больше шести лет, в течение которых описанные в статье скрипты использовались, дорабатывались, корректировались - одним словом развивались и оттачивались. В настоящее время скрипты успешно работают с файловыми системами в следующих условиях:
- среды для запуска Windows XP, Windows 7
- копирование сотен тысяч файлов
- копирование файловой структуры, содержащей имена в кодировке Unicode, кириллицу, пробелы, длинные имена и пути
- копирование с сетевых драйвов, флэшек
Нельзя гарантировать, что во всех этих условиях и их комбинациях скрипты работают 100% надежно, но можно сказать, что в последние годы я не сталкивался с тем, чтобы что-то оказалось не забэкапленным или забэкапилось неправильно.
Скрипты не будут работать корректно, если на целевом бэкапном диске используются жесткие ссылки NTFS . Так что если вы, как и я в мае 2013 года, отличились умом и сообразительностью и просканировали весь бэкапный диск на предмет идентичных файлов (с помощью Dup Same Files Searcher, например) и заменили их жесткиими ссылками, то... создайте новый бэкап с нуля, иначе директория с дампами начнет бесконтрольно расти. Теория иногда расходится с практикой, увы :(
Содержание: (спрятать)
Общая политика бэкапирования простыми словами
(политика может быть реализована в скриптах в разных комбинациях)
- запускать акт бэкапирования при следующих условиях:
- каждые 4 часа / раз в сутки ночью
- если переносной диск/флэшка или сетевой драйв доступны
- если компьютер бездействует более 5 минут
- если предыдущий бэкап старше 1 суток
- совершать бэкапирование по следующему алгоритму:
- синхронизовать все файлы с Исходного диска на диск X:/%, где % - буква исходного диска
- исключить из синхронизации директории и файлы, перечисленные в файле exclude.msk
- в частности, для исключения какой-либо папки вручную, добавьте к ее имени постфикс .@exc
- все файлы, на момент синхронизациии отсутствующие на Исходном диске, но имеющиеся в резервной копии, не удалять, а класть в директориию X:/%dumps/%дата_и_время_синхронизации%
- в конце записывать дату бэкапа в файл прямо на тот диск, который бэкапился. Это дает:
- в общем случае прозрачную связку времен бэкапов переносного носителя между всеми компьютерами
- каждый следующий бэкап в любом случае закончится не с 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
0. жизненные обстоятельства заставляют
1. пока можно промотать, поправлю позже
2. с правами - никак. Все примеры предполагают админские права. С пользовательской точки зрения я вопрос не исследовал.
3. в моей концепции бэкапы должно запускать то, что бэкапится. Иначе бэкап регулярно будет прерываться. Аргументация ниже.
Finar.
Бэкап делается автоматом. Если он не сделался - он привлекает внимание пользователя при каждой загрузке компьютера, то есть тогда, когда человек более-менее готов на это отреагировать. Админа в этой схеме вообще нет. На мой взгляд, это максимально простая логика. Можно усложнить задачу, вести отдельно локи и логи; но опыт показывает:
- даже внедрение простейшего рабочего решения люди откладывают месяцами;
- бэкап делается фоном, он не должен отвлекать, даже если возникла ошибка;
- число узлов цепочки снижает надежность в геометрической прогрессии;
- предложенная схема достаточно надежно работает в бытовых условиях.
Finar.
Оставить комментарий