Системные администраторы делятся на тех, кто не делает бэкапы, и тех, кто УЖЕ делает...
Мой самописный "велосипед", который можно использовать для архивации данных пользователя на локальный диск и на файловый сервер (по SMB, в расшаренный каталог на сервере). Дополнительных программ устанавливать не нужно, используется portable версия 7zip, виндовая утилита robocopy и консольный почтовый клиент Zerat (для отправки уведомлений). Всё находится в одном каталоге со скриптами и просто копируется на целевой компьютер, без процедуры установки.
Для отправки уведомлений клиентом Zerat в локальной сети установлен почтовый сервер iRedMail. Можно, в принципе, поставить простой и несложный в настройке Courier Mail Server, для уведомлений по локальной сети хватит.
ПОЛНЫЙ архив создаётся один раз в неделю, по понедельникам, в остальные дни недели создаются дифференциальные архивы, что позволяет экономить ресурсы компьютера. Архивы хранятся за две недели - пишутся архивы текущей недели и хранятся архивы предыдущей.
Скрипт можно запускать как по расписанию, с помощью планировщика Windows, так и перед выключением компьютера, если прописать его в групповых политиках. Для этого нужно открыть оснастку "Групповая политика":
Теперь при штатном завершении работы компьютера (Пуск - Завершение работы...) сначала будет выполняться скрипт архивации, а потом выключаться компьютер. По-моему, так гораздо лучше, чем через автозагрузку, комп не будет тупить в начале рабочего дня, пока создаётся архив.
Для начала нужно создать каталог, в котором будут размещаться программные и текстовые файлы пакета. Предположим, C:\programs\cmd. В нём будут находиться:
[7-ZipPortable] - каталог с portable-версией архиватора 7zip.
[zerat] - каталог с консольным клиентом Zerat, для отправки уведомлений по электронной почте.
[files] - внутри каталога zerat каталог с текстовыми файлами конфигураций отправляемых писем. Формируются автоматически скриптом arhive1.cmd при первом запуске. При необходимости можно изменить текст вручную, так как проверяется только существование этих файлов.
arhive.cmd - стартовый скрипт, который запускает следующий скрипт, выполняющий всю работу. Нужен для передачи параметра - имени пользователя (или компьютера), для которого будет создаваться архив. Вызывая скрипт arhive1.cmd с разными параметрами можно сделать несколько разных архивов, если нужно.
arhive1.cmd - скрипт, вызываемый из стартового, собственно, в нём вся программная часть.
name_list.txt - файлы-списки для архивации, содержат списки каталогов, файлов или масок для архивации.
ren_list.txt - файл-список, содержащий полные пути к лог-файлам, по одному на строку. Используется в процедуре ротации логов, чтобы они не пухли безразмерно.
xlist.txt - файл-список исключений для архивации, содержит список того, что не нужно включать в архив.
Содержимое стартового скрипта arhive.cmd:
@ECHO OFFCALL %~dp0\arhive1.cmd user1REM CALL %~dp0\arhive1.cmd user2:ENDЭто всего лишь запускающий скрипт для основного скрипта arhive1.cmd, который вызывается с обязательным параметром. Этот параметр используется в имени создаваемого архива и файле-списке для архивации. Основной скрипт может вызываться несколько раз с разными параметрами если нужно создать несколько архивов. Например, для двух разных пользователей создать архивы их домашних каталогов.
Содержимое скрипта:
@ECHO OFFSETLOCALREM ===== Установка переменных =====REM Расположение командных и программных файлов:SET PROGPATH=C:\programs\cmdSET ZIP=%PROGPATH%\7-ZipPortable\App\7-Zip\7z.exeREM Каталог, в котором будет храниться архив:SET ARCHPATH=D:\Users_arhives\%1REM Префикс имени архива (с путём)REM %1 - имя архивируемой базы (имя пользователя, компьютера - чтобы было понятно, чей это архив)REM передаётся при вызове из головного файла arhive.cmd,REM дата и время будут добавлены при создании архива:SET ARCHNAME=%ARCHPATH%\%1REM Файл лога:SET LOG=%ARCHPATH%\%1.logREM Файл-список лог-файлов. Используется в функции :LOGROTATIONSET REN_LIST=%PROGPATH%\ren_list.txtREM Расположение файла-списка для архивацииSET LIST=%PROGPATH%\%1_list.txtREM Расположение файла-списка исключений для архивацииSET XLIST=%PROGPATH%\xlist.txt REM Установка количества попыток подключения сетевого дискаSET TRY=20REM Формирование переменных, содержащих время и датуREM Нужно для именования архивов и ротацииSET NOW=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%SET DAY=%DATE:~0,2%REM Переменную TIMESTAMP приходится выставлять, проверяя условиеREM В утренние часы, когда присутствует лидирующий ноль (04:30, например),REM на самом деле подставляется пробел ( 4:30).REM Поэтому приходится это проверять и, при необходимости, подставлятьREM этот ноль самостоятельно.SET UTRO=%TIME:~0,1%IF "%UTRO%" == " " ( SET TIMESTAMP=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%-0%TIME:~1,1%%TIME:~3,2%) ELSE ( SET TIMESTAMP=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%-%TIME:~0,2%%TIME:~3,2%)REM Костыль для вывода дня неделиECHO. > "%TEMP%\~.ddf" MAKECAB /D RptFileName="%TEMP%\~.rpt" /D InfFileName="%TEMP%\~.inf" -f "%TEMP%\~.ddf" > nul FOR /F "tokens=3" %%a in ('type "%TEMP%\~.rpt"') DO IF NOT DEFINED WEEKDAY SET "WEEKDAY=%%a" DEL /Q "%TEMP%\~.*"REM Установка переменных для работы системы оповещения по эл. почте:SET ZERAT=%PROGPATH%\zerat\zerat.exeSET ZERAT_FILES=%PROGPATH%\zerat\filesSET MAILLIST=%ZERAT_FILES%\maillist.txtSET SMTPSENDER=sender@mydomain.ru SET SMTPSERVER=mail.mydomain.ruSET SMTPPORT=25 SET SMTPUSER=sender@mydomain.ru SET SMTPPWD=passwordSET CODEPAGE=Windows-1251REM Проверка и создание, при необходимости, файлов, необходимых для работыREM системы оповещения по эл. почтеIF NOT EXIST %ZERAT_FILES%\%1_error.txt ( ECHO SMTPHOST:mail.mydomain.ru:25 >> %ZERAT_FILES%\%1_error.txt ECHO FROM:Sender ^<sender@mydomain.ru^> >> %ZERAT_FILES%\%1_error.txt ECHO TO:Backup Admin ^<BackupAdmin@mydomain.ru^> >> %ZERAT_FILES%\%1_error.txt ECHO SUBJECT:Error Backup UserData: %1. >> %ZERAT_FILES%\%1_error.txt ECHO SMTPAuth:LOGIN >> %ZERAT_FILES%\%1_error.txt ECHO SMTPUSER:sender@mydomain.ru >> %ZERAT_FILES%\%1_error.txt ECHO SMTPPASS:password >> %ZERAT_FILES%\%1_error.txt ECHO CHARSET:Windows-1251 >> %ZERAT_FILES%\%1_error.txt ECHO Unsuccessful completion of the backup UserData: %1. >> %ZERAT_FILES%\%1_error.txt ECHO Backup file not finded on Z: disk. >> %ZERAT_FILES%\%1_error.txt ECHO Check your backup procedure. >> %ZERAT_FILES%\%1_error.txt)IF NOT EXIST %ZERAT_FILES%\%1_success.txt ( ECHO SMTPHOST:mail.mydomain.ru:25 >> %ZERAT_FILES%\%1_success.txt ECHO FROM:Sender ^<sender@mydomain.ru^> >> %ZERAT_FILES%\%1_success.txt ECHO TO:Backup Admin ^<BackupAdmin@mydomain.ru^> >> %ZERAT_FILES%\%1_success.txt ECHO SUBJECT:Backup UserData: %1. >> %ZERAT_FILES%\%1_success.txt ECHO SMTPAuth:LOGIN >> %ZERAT_FILES%\%1_success.txt ECHO SMTPUSER:sender@mydomain.ru >> %ZERAT_FILES%\%1_success.txt ECHO SMTPPASS:password >> %ZERAT_FILES%\%1_success.txt ECHO CHARSET:Windows-1251 >> %ZERAT_FILES%\%1_success.txt ECHO Successful completion of the backup UserData: %1. >> %ZERAT_FILES%\%1_success.txt ECHO Backup file is on Z: disk. >> %ZERAT_FILES%\%1_success.txt))IF NOT EXIST %ZERAT_FILES%\maillist.txt ( ECHO BackupAdmin@mydomain.ru >> %ZERAT_FILES%\maillist.txtREM ECHO BackupAdmin2@mydomain.ru >> %ZERAT_FILES%\maillist.txt)REM Адрес сервера для хранения бэкаповSET SERVER=192.168.0.1REM Базовый каталог на сервере, в котором расположены каталоги пользователейSET BASEPATH=backupREM Имя пользователя для подключения сетевого дискаSET USERNAME=bkupREM Пароль для подключения сетевого дискаSET PASSWORD=bkupREM Каталог на сервере, в котором будут храниться архивы,REM считая от базового каталога \\192.168.0.1\backup\SET PATH_ON_SERVER=test\%1REM ==== Программная часть ====REM При первом запуске автоматически будет создан каталог, в который будет выполняться архивация.REM Если он не существует.IF NOT EXIST %ARCHPATH% MD %ARCHPATH%REM Запись в лог-файл времени начала архивацииECHO ========================== >> %LOG%ECHO Start backup at >> %LOG%ECHO %WEEKDAY% >> %LOG%DATE /T >> %LOG%TIME /T >> %LOG%IF %WEEKDAY%==Mon GOTO FULLIF %WEEKDAY%==Tue GOTO DIFFIF %WEEKDAY%==Wed GOTO DIFFIF %WEEKDAY%==Thu GOTO DIFFIF %WEEKDAY%==Fri GOTO DIFFIF %WEEKDAY%==Sat GOTO DIFFIF %WEEKDAY%==Sun GOTO DIFF:FULLREM Создаем полный бекап с нуляREM Сначала удаляем старые архивы, т.к. создаётся новый полный архивIF NOT EXIST %ARCHPATH%\old\NUL MD %ARCHPATH%\oldDEL /F /Q %ARCHPATH%\old\*.*MOVE %ARCHPATH%\*.7z %ARCHPATH%\oldECHO ---------------------------------------------------- >> %LOG%ECHO %WEEKDAY%, %DATE% %TIME% Creating FULL Backup %ARCHNAME%-%WEEKDAY%-%TIMESTAMP%.7z >> %LOG%ECHO ---------------------------------------------------- >> %LOG%REM Собственно, архивация данных выполняется этой командой.%ZIP% a -t7z -ssw -scsWIN -y %ARCHNAME%-%WEEKDAY%-%TIMESTAMP% @%LIST% -xr@%XLIST%REM Записываем имя свежего полного бекапа в файл@ECHO %ARCHNAME%-%WEEKDAY%-%TIMESTAMP%.7z > %ARCHPATH%\last_full.txtGOTO CONNECT:DIFFREM Если полных бекапов нет вообще - делаем полный с нуляSET /p last_full= < %ARCHPATH%\last_full.txtIF NOT EXIST "%last_full%" (ECHO No full backup exist, begin make full backup >> %LOG%goto FULL)REM Если есть - считываем его имя из файла и делаем дифференциальный бекап на его основеSET /p last_full= < %ARCHPATH%\last_full.txtECHO ---------------------------------------------------- >> %LOG%ECHO %WEEKDAY%, %DATE% %TIME% Creating DIFF Backup %ARCHNAME%-%WEEKDAY%-%TIMESTAMP%.7z based at %last_full% >> %LOG%ECHO ---------------------------------------------------- >>%LOG%REM Собственно, архивация данных выполняется этой командой.%ZIP% u %last_full% -u- -up0q3r2x2y2z0w2!%ARCHNAME%-%WEEKDAY%-%TIMESTAMP%.7z -t7z -ssw -scsWIN -y @%LIST% -xr@%XLIST%GOTO CONNECTREM Подключение сетевого диска:CONNECTNET USE Z: /d /yFOR /L %%N IN (1,1,%TRY%) DO ( IF NOT EXIST Z:\nul ( NET USE Z: \\%SERVER%\%BASEPATH%\%PATH_ON_SERVER% /user:%USERNAME% %PASSWORD% /persistent:no ECHO Disk Z: connected sucsessfully! >> %log% ) ELSE ( ECHO Disk Z: already connected! >> %log% GOTO EXIT01
)):EXIT01REM На сервер имеет смысл копировать только самый свежий архив,REM т.к. предыдущие там уже должны быть.REM Имя искомого архива формируется так:REM %1-%WEEKDAY%-%TIMESTAMP%.7zREM %1 - входной параметр этого .cmd файла, имя архивируемой базыREM %WEEKDAY% - сегодняшний день неделиREM %TIMESTAMP% - время создания архиваREM Копирование архива на сервер (синхронизация каталогов, если быть точным)%PROGPATH%\robocopy %ARCHPATH% Z:\ /MIR /E /Z /R:100 /TBDREM Проверка существования архива на сервере и отправка уведомлений по почтеIF EXIST "Z:\%1-%WEEKDAY%-%TIMESTAMP%.7z" ( ECHO File exist CALL :SENDMSG %ZERAT_FILES%\%1_success.txt) ELSE ( ECHO File not exist CALL :SENDMSG %ZERAT_FILES%\%1_error.txt)REM Отключение сетевого дискаNET USE Z: /d /yREM Запись в лог-файл времени окончания архивацииECHO End backup at >> %LOG%ECHO %WEEKDAY% >> %LOG%DATE /T >> %LOG%TIME /T >> %LOG%REM Ротация логовREM Запускается только по первым числам месяцаIF %DAY% == 01 CALL :LOGROTATIONGOTO ENDREM =========== FUNCTIONS ============REM ===== Begin SENDMSG function =====:SENDMSG%ZERAT% %1EXIT /bREM ===== End SENDMSG function =====REM ===== Begin LOGROTATION function =====:LOGROTATIONIF NOT EXIST %LOG% EXIT /bREM ECHO %LOG% > %REN_LIST%FOR /F %%f in ('TYPE %REN_LIST%') DO (IF EXIST %%f.bak DEL %%f.bakIF EXIST %%f REN %%f %%~nxf.bak)EXIT /bREM ===== End LOGROTATION function =====REM =========== END FUNCTIONS ============:ENDЗдесь всё достаточно подробно прокомментировано в самом скрипте.
Перед первым запуском нужно проверить и правильно задать все переменные, определяемые в начале скрипта - пути и имена файлов.
SET PROGPATH=C:\programs\cmd задаётся путь к каталогу, в котором расположен весь пакет программ и скриптов, всё остальное пляшет от него.SET ARCHPATH=D:\Users_arhives\%1 задаётся каталог, в котором будет храниться архив. Параметр %1 передаётся из стартового скрипта при вызове, в данном примере user1. В принципе, каталог этот создастся автоматически при первом запуске скрипта, если его не существует. Но лучше, наверное, всё же создать ручками, на всякий случай.SET REN_LIST=%PROGPATH%\ren_list.txt определяется файл-список, содержащий полные пути к лог-файлам, по одному на строку. Используется в процедуре ротации логов, чтобы они не пухли безразмерно. Заполняется вручную.SET LIST=%PROGPATH%\%1_list.txt определяется имя файла-списка для архивации. Параметр %1 передаётся при вызове файла (user1, user2). Файл заполняется вручную, каждая строка содержит путь к архивируемому каталогу (например, "d:\home\user1\Documents\" для архивации всех файлов из каталога d:\home\user1\Documents\). Файл должен быть в кодировке Windows-1251, иначе кириллические имена не будут распознаны.SET XLIST=%PROGPATH%\xlist.txt задаётся файл-список исключений для архивации. Можно указывать как маски файлов, так и каталоги, по одному исключению на строку. Например, так:*.cdxDocuments\EvernoteSET XLIST=%PROGPATH%\%1_xlist.txt, тогда надо будет создавать несколько таких файлов.Для работы скрипта используются текстовые файлы-списки, уже упомянутые выше. Приведу текст файлов из примера.
user1_list.txt:
"d:\home\user1\Documents\"
"d:\home\user1\Desktop\"
"D:\home\user1\Thunderbird\Profiles\kpya8y83.default\abook.mab"
"D:\home\user1\Thunderbird\Profiles\kpya8y83.default\abook-1.mab"
"D:\home\user1\Thunderbird\Profiles\kpya8y83.default\abook-2.mab"
"D:\home\user1\Thunderbird\Profiles\kpya8y83.default\history.mab"
"C:\programs\cmd\"
"C:\Program Files (x86)\Cobian Backup 11\DB\MainList.lst"
"C:\Users\user1\AppData\Roaming\nnCron\my.tab"
"C:\Users\user1\AppData\Roaming\nnCron\nncron.tab"
"C:\Users\user1\AppData\Roaming\CintaNotes\cintanotes.db"
"C:\Users\user1\AppData\Roaming\CintaNotes\backup\cintanotes.daily.db"
"C:\Users\user1\AppData\Roaming\CintaNotes\backup\cintanotes.weekly.db
xlist.txt:
*.cdx
*.tar
*.zip
*.log
*.wma
Documents\Evernote
Documents\ViberDownloads
Robocopy - входит в состав Windows, начиная с Windows Vista