В Интернет доступно множество средств для резервного копирования файлов с Windows серверов (ПК), однако, хочется чего-то быстрого в настройке и надежно работающего. Чтобы не нужно было поднимать серверную часть (сервер архивов) и пр.
Естественно, для крупных компаний c большими объемами данных использование производительных клиент-серверных систем резервного копирования — это необходимость, а для небольших — перебор. При смене ИТ специалистов (аутсорсера) в SOHO процесс передачи этого процесса должен быть максимально упрощенным. Документация минимальная. Соответственно, самый простой вариант — это максимально короткий командный файл, который поймет специалист любой квалификации.
Есть штатный инструмент от Microsoft robocopy, который закрывает большинство проблем с резервными копиями, но имеет пару недостатков: ротация файлов и компрессия. При организации резервного копирования важно обеспечить приемлемую глубину архивирования, по дням, ежемесячно и т.п.
DayOfWeek для robocopy
копирует файлы в нужную папку. Соответственно, для создания ежедневных резервных копий в течении недели достаточно создать в нужном месте папку с названием дня недели. Глубина резервного копирования — неделя, со следующей недели начнется ротация (замещение файлов новыми).
Я не знаю быстрого способа в cmd файле получить день недели. Поэтому для меня простой способ решения задачи — приложение, которое создает в нужном месте папку с названием дня недели, либо с более сложной структурой по некоторому шаблону. Программу назвал DayOfWeek, буквально несколько строк кода. Скачать её можно здесь: DayOfWeek. Если нужны исходники — пишите 2af@mail.ru.
При запуске программы без ключей — она возвращает в консоль название дня недели на английском.
Одна строчка cmd файла позволяет использовать возвращенное значение в cmd файле:
for /f %%i in (‘C:\Backup\DayOfWeek.exe -md %RootBackupPath%’) do set DayOfWeek=%%i
где в переменной %RootBackupPath% указан сетевой путь до шары. Например, последовательность:
- SET RootBackupPath=\\FileServer\Backup\Files\
- for /f %%i in (‘C:\Backup\DayOfWeek.exe -md %RootBackupPath%’) do set DayOfWeek=%%i
- SET BackupPath=%RootBackupPath%%DayOfWeek%
объединяет путь к расшаренной папке с днем недели. Например, при запуске в пятницу результат такой: \\FileServer\Backup\Files\Friday
Таким образом получается ротация в пределах недели, поскольку при переходе на следующую неделю содержимое файлов в папках соответствующих дню недели будет актуализироваться командой /MIR robocopy. При этом резервирование будет происходить максимально быстро, поскольку копироваться будут только новые файлы.
Чтобы использовать более глубокую архивацию, например, хранить резервные копии в течении месяца, можно использовать механизм шаблонов. В этом случае иерархия папок будет создаваться в соответствии с шаблоном. Ключи:
-t [Template] — задать шаблон для создания папки и выдачи в консоль имени.
-g [Globalization] — установить глобализацию для названий месяцев, дней недели и пр. По умолчанию: en-US.
Шалобны могут использоваться различные: https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
Добавил также шаблон: WWWW — день недели месяца.
Запуск DayOfWeek.exe -t «MMMM\\WWWW\\dddd» вернет в консоли строчку вида [Название месяца]\[Номер недели]\[Название дня недели]. Например, для пятницы 2 недели января: January\2\Friday.
Командный cmd файл (есть в zip архиве) для решения задачи создания ежедневных копий:
SETLOCAL SET SourcePath=D:\BASES\ SET RootBackupPath=\\FileServer\Backup\Files\ SET LogDir=C:\Backup\Log\ for /f %%i in ( 'C:\Backup\DayOfWeek.exe -md %RootBackupPath%' ) do set DayOfWeek=%%i SET BackupPath=%RootBackupPath%%DayOfWeek% echo %BackupPath% call robocopy.exe %SourcePath% %BackupPath% *.* /mir /FFT /Z /copy:DAT /dcopy:T /W:0 /R:0 /LOG:"%LogDir%backup.log" echo DateMarker > %BackupPath%%date%.dat
|
- SourcePath — директория для создания резервных копий.
- RootBackupPath — корневая папка в которой будут создаваться подпапки с резервными копиями по дням.
- LogDir — папка в которую сохраняются логи по работе robocopy.
/MIR
— эквивалентно/E /PURGE
) делает зеркальную копию папок./FFT
важная опция, делает 2-секундный лаг при сравнении времени файлов на случай расхождения часов на исходной системе и сервере резервирования./R:3
— количество попыток при проблемах с соединением./W:10
время 10 сек между попытками./Z
— копирование файлов в режиме «restart mode», частично скопированные файлы будут продолжатькопироваться после восстановления обрыва./NP
и/NDL
подавляют некоторые диагностическое сообщения. Дополниельно можно добавить/NS
,/NC
,/NFL
to, чтобы ещё больше сократить объем выводимых сообщений (см. documentation). Однако при первом запуске лучше запустить с диагностикой, чтобы убедиться, что все работает нормально.
Обратите внимание на указание в командном файле полного пути для файла C:\Backup\DayOfWeek.exe. Это важно при запуске cmd файла из-под штатного scheduler. Также в scheduler корректно пропишите рабочую папку где находится командный файл.
Отмечу, что ключик /MIR довольно рискованный, поскольку зачищает на удаленной стороне файлы удаленные на источнике. Вместо него можно использовать ключ /E.
Файл с текстом DateMarker создается, чтобы можно было оперативно определить когда был создан бакап, поскольку по файлом этого не определить — с заданными ключами даты копируются с исходных файлов.
Второй момент, лучше не подключать бакапный диск с сервера, с которого нужно создавать бакапы, а делать наоборот, подключая с сервера на котором хранятся резервные копии нужные диски с сервера, файлы с которого будут копироваться. Это важно на случай если исходный сервер заражен шифровальщиком, чтобы он не пошифровал все резервные копии.
Доступы к папке с резервными копиями должны быть даны только определенному пользователю. При такой схеме подключения риски потерять бакапы при заражении шифровальщиком минимальные.
Подключение дисков с сервера резервных копий для такого пользователя [backuper] с паролем [password] выполняется следующим образом:
NET USE G: /delete /y NET USE G: "\\192.168.1.2\D$\FolderToBackup\" /USER:backuper password /y |
Время по NTP серверам
Не забываем настроить синхронизацию времени по NTP серверам, иначе из-за разницы в времени создания файлов может быть циклическое копирование. Под Windows 2008:
net stop w32time w32tm /config /syncfromflags:manual "/manualpeerlist:0.pool.ntp.org, 1.pool.ntp.org, 2.pool.ntp.org" w32tm /config /reliable:yes net start w32time w32tm /query /configuration w32tm /resync |
Сжатие файлов robocopy
К сожалению, robocopy не поддерживает сжатие файлов «на лету». Если копирование происходит на сервер/ПК под управлением Windows, то для решения проблемы достаточно использовать динамическую компрессию на папку в настройках Windows. Помимо компрессии можно использовать также дедупликацию, если копирование идет на сервер под Windows 2012 или ПК под Windows 10 с активированной дедупликацией (спец сказал, что не работает). Поскольку файлы меняются незначительно от копии к копии, дедупликация существенно уменьшит место занимаемое на диске под резервные копии.
Если резервная копия создается на NAS, на котором отсутствует опция сжатия и дедупликации, то единственный вариант решения задачи — запустить сжатие файлов с сервера/ПК на приемнике уже после выполнения резервного копирования с помощью 7zip или других утилит. Естественно, это весьма тяжелая операция, поскольку при таком сжатии:
- Сначала происходит копирование файла на ПК с которого запущена команда архивации.
- Сжатие файла.
- Копирование на приемник.
- Удаление исходного файла на приемнике.
Важный момент касается того каким образом создавать архив — один большой или архивировать каждый файл. У каждого способа есть несколько плюсов и минусов. В случае с одним большим файлом они следующие:
Плюсы | Минусы |
Большой файл занимает меньше места, чем много небольших архивов | Он долго копируется по сети. |
Архивирование занимает много времени. Если места не хватило, то архивирование нужно делать повторно с нуля. | Долго распаковывается в случае проблем. |
Не подходит для копирования по медленным каналам связи (Internet), поскольку крайне неэффективен при передаче файлов, которые не изменялись с момента последней синхронизации. | |
Не походит при работе с rsync для дифференциальной синхронизации |
Паковка каждого файла в архив также имеет свои плюсы и минусы:
Плюсы | Минусы |
Передача большого количества небольших файлов — более эффективный вариант для каналов с низкой скоростью (Internet). | Много небольших архивов займут больше места на диске. |
При использовании специального способо компрессии обеспечивает достаточно эффективную работу rsync-а. | Время паковки большого количество небольших файлов, как правило, больше. |
Распаковка нужного файла происходит очень быстро. | Gzip обладает не самым продвинутым функицоналом при таком пофайловом копировании. Не хватает опций. |
Не просто обеспечить шифрование штатными средствами. Например, GZip не поддерживает паковку с паролем. Нужно использовать доп. средства по философии Unix (одна задача — один инструмент). Например, https://www.gpg4win.org/features.html |
Проще всего сжимать пофайлово с помощью gzip. Для рекурсивного сжатия файлов в папках используется команда:
gzip -9 -q -v -r [Директория]
Например, gzip -9 -q -v -r C:\Temp\43\
Если синхронизация идет с помощью rsync, то можно использовать ключик —rsyncable. В этом случае файл сжимается не целиком, перестраивая всю структуру, а блоками, чтобы обеспечить для rsync-а достаточно информации для дифференциальной передачи блоков информации.
При использовании компрессии gzip важный момент, что, похоже, нет способа сжимать файлы и пересылать в другую папку. Соответственно, сжиматься будет папка, которая была скопирована robocopy. Файлы в ней изменятся и в следующий раз robocopy будет вновь копировать полностью все файлы.
Права доступа
Важный момент — права доступа для запуска cmd файл в scheduler. Понятно, что в случае если авторизация доменная достаточно в scheduler запустить командный файл под учеткой с правами достаточными для записи на приемнике. Чем более гранулированные права — тем лучше, чтобы при запуске на файловом сервере трояна-шифровальщика резервная копия не была затронута.
Если копирование производится на NAS, который не поддерживает доменную авторизацию, достаточно добавить на сервер локального пользователя с именем совпадающим с учеткой на приемнике и с тем-же паролем. Обычно этого достаточно, чтобы у NAS был доступ к папке на сервере для копирования файлов.