Как стать автором
Обновить

Быстрое и надежное резервное копирование данных в облако

Время на прочтение4 мин
Количество просмотров28K
Одной из самых проблемных задач для обычного пользователя является резервное копирование под Windows, которое обеспечивало бы закрытие следующих вопросов:

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

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

Однако, уже давно существуют инструменты для решения задачи. Главное правильно применить Unix way и командные файлы. И самый простой вариант — заархивировать файлы в один архив и отправить его в онлайн-хранилище, используя командную строку. Для ускорения работы задача делится на 2 этапа — сначала создается и отправляется в онлайн-хранилище полный архив, потом по мере необходимости создаются инкрементные архивы, что дает скорость. Шифрование архивов обеспечивает безопасность данных.

Что требуется для решения задачи:

  • аккаунт в яндексе, чтобы получить доступ по webdav к яндекс-диску. Применение любого другого хранилища не возбраняется;
  • 7z — консольный архиватор, распространяется бесплатно;
  • curl — консольный инструмент для работы с интернетом, распространяется бесплатно.

Для портабельности я положил 7z.exe, 7z.dll и Curl.exe в один каталог. В зависимости от того, как был скомпилирован Curl.exe, может быть необходимо будет положить рядом или добавить в систему библиотеки libeay32.dll, libssh2.dll, msvcr100.dll, MSVCR110.dll.

Далее в этом каталоге желательно сформировать каталог, в который нужно поместить файлы и каталоги для будущего архива. У меня он называется «backup» и в него я помещаю жесткие ссылки на файлы или связь каталогов (соответствующий функционал есть в FAR по комбинации клавиш Alt+F6). Таким образом, я могу, не меняя структуру существующих данных, создать удобную мне структуру для резервого копирования.

Следующий каталог — «temp». Предназначен для хранения архива данных перед отправкой его на сервер. Заодно он будет являться зашифрованной копией актуальных данных, что обеспечивает дополнительное их резервирование на случай атаки вирусов.

После чего в исходном каталоге нужно создать достаточно простой bat (cmd) файл «full.bat» следующего содержания:

@echo off
set filebkp=work
set pathbkp=backup
set srvbkp=https://user:password@webdav.yandex.ru/backup/%filebkp%
set pathtemp=temp
set full=%filebkp%-full
del /F /Q "%pathtemp%"\
7z.exe a "%pathtemp%\%full%".7z -x!*.log; -r -mx1 "%pathbkp%\*" -ppass_for_archive
curl.exe -k -X DELETE "%srvbkp%" --verbose -o .\stdout
curl.exe -k -X MKCOL "%srvbkp%" --verbose -o .\stdout
curl.exe -k -T "%pathtemp%\%full%".7z "%srvbkp%"/ --progress-bar --verbose -o .\stdout

  • set filebkp=work — задание общего названия компьютера и пути на сервере, по которому будет храниться резервная копия. Т.к. компьютеров может быть несколько, то это может быть резервная копия рабочего компьютера (work), домашнего (home), ноутбука (book), указание индивидуального названия не позволит копиям смешиваться друг с другом.
  • set pathbkp=backup — задание пути к каталогу, где хранятся данные для резервного копирования, в данном случае указан каталог с жесткими ссылками и связями каталогов, который Вы должны были создать ранее.
  • set srvbkp=https://user:password@webdav.yandex.ru/backup/%filebkp% — задание каталога на сервере, куда будет заливаться резервная копия. user и password — пароли от Вашей учетки на яндексе;
  • set full=%filebkp%-full — задание заранее названия архива.
  • del /F /Q "%pathtemp%"\ — удаление (очистка) временного каталога
  • 7z.exe a "%pathtemp%\%full%".7z -x!*.log; -r -mx1 "%pathbkp%\*" -ppass_for_archive — строка запуска архиватора. pass_for_archive — Ваш пароль к архиву.
  • curl.exe -k -X DELETE "%srvbkp%" --verbose -o .\stdout — удаление на сервере каталога назначения.
  • curl.exe -k -X MKCOL "%srvbkp%" --verbose -o .\stdout — заново создание на сервере каталога назначения.
  • curl.exe -k -T "%pathtemp%\%full%".7z "%srvbkp%"/ --progress-bar --verbose -o .\stdout — заливка с помощью curl архива на сервер.

Таким образом, запустив скрипт «full.bat», Вы получите полную версию Ваших файлов в архиве в каталоге «temp» и ее же в каталоге «backup/work» на сервере, зашифрованную Вашим паролем. Это может занять определенное время и имеет свои ограничения по объему архива, но самые важные и при этом ежедневно меняющиеся данные стоит заархивировать именно таким образом.

Почему важные и ежедневно меняющиеся? Потому что следующий скрипт, «inc.bat», позволяет найти и отправить на сервер в инкрементный архив измененные данные, отличающиеся от полной версии:

@echo off
set filebkp=work
set pathbkp=..\backup
set srvbkp=https://user:password@webdav.yandex.ru/backup/%filebkp%
set pathtemp=..\temp
set full=%filebkp%-full
set inc=%filebkp%-inc
set h=%TIME:~0,2%
set m=%TIME:~3,2%
set s=%TIME:~6,2%
set ms=%TIME:~9,2%
set curtime=%h%-%m%-%s%
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%yyyy%-%mm%-%dd%
set curdatetime=%curdate% %curtime%
7z.exe u "%pathtemp%\%full%".7z -x!*.log; -u- -up3q3r2x2y2z0w2!"%pathtemp%\%inc%".7z "%pathbkp%\*" -ppass_for_archive
ren "%pathtemp%\%inc%".7z "%inc% %curdatetime%".7z
curl.exe -k -T "%pathtemp%\%inc% %curdatetime%".7z "%srvbkp%"/ --progress-bar --verbose -o .\stdout

Расшифровать этот файл я думаю Вы сможете сами — скрипт с помощью 7z анализирует уже имеющийся в каталоге «temp» полный архив и исходный каталог, находит изменившиеся файлы, запаковывает их в инкрементный архив, именованный по текущей дате и времени, и отправляет на сервер. Таким образом, если полная архивация занимает скажем 1 гигабайт и 3 минуты времени, то измененные файлы обычно занимают 10-50 мегабайт и улетают на сервер за несколько секунд. Поместив «inc.bat» в планировщик заданий Windows, Вы позволите этому процессу происходить по расписанию в удобное для Вас время, что позволит забывать о нем.

Когда же Вам покажется, что время создания инкрементных копий стало слишком большим, можно снова запустить «full.bat» — это очистит все каталоги от полных и инкрементных архивов и создаст свежий вариант полной версии.
Теги:
Хабы:
Всего голосов 15: ↑11 и ↓4+7
Комментарии55

Публикации

Истории

Ближайшие события