Системные администраторы делятся на тех, кто не делает бэкапы, и тех, кто УЖЕ делает...
Мой самописный "велосипед", который можно использовать для архивации данных пользователя на локальный диск и на файловый сервер (по 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 OFF
CALL %~dp0\arhive1.cmd user1
REM CALL %~dp0\arhive1.cmd user2
:END
Это всего лишь запускающий скрипт для основного скрипта arhive1.cmd, который вызывается с обязательным параметром. Этот параметр используется в имени создаваемого архива и файле-списке для архивации. Основной скрипт может вызываться несколько раз с разными параметрами если нужно создать несколько архивов. Например, для двух разных пользователей создать архивы их домашних каталогов.
Содержимое скрипта:
@ECHO OFF
SETLOCAL
REM ===== Установка переменных =====
REM Расположение командных и программных файлов:
SET PROGPATH=C:\programs\cmd
SET ZIP=%PROGPATH%\7-ZipPortable\App\7-Zip\7z.exe
REM Каталог, в котором будет храниться архив:
SET ARCHPATH=D:\Users_arhives\%1
REM Префикс имени архива (с путём)
REM %1 - имя архивируемой базы (имя пользователя, компьютера - чтобы было понятно, чей это архив)
REM передаётся при вызове из головного файла arhive.cmd,
REM дата и время будут добавлены при создании архива:
SET ARCHNAME=%ARCHPATH%\%1
REM Файл лога:
SET LOG=%ARCHPATH%\%1.log
REM Файл-список лог-файлов. Используется в функции :LOGROTATION
SET REN_LIST=%PROGPATH%\ren_list.txt
REM Расположение файла-списка для архивации
SET LIST=%PROGPATH%\%1_list.txt
REM Расположение файла-списка исключений для архивации
SET XLIST=%PROGPATH%\xlist.txt
REM Установка количества попыток подключения сетевого диска
SET TRY=20
REM Формирование переменных, содержащих время и дату
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.exe
SET ZERAT_FILES=%PROGPATH%\zerat\files
SET MAILLIST=%ZERAT_FILES%\maillist.txt
SET SMTPSENDER=sender@mydomain.ru
SET SMTPSERVER=mail.mydomain.ru
SET SMTPPORT=25
SET SMTPUSER=sender@mydomain.ru
SET SMTPPWD=password
SET CODEPAGE=Windows-1251
REM Проверка и создание, при необходимости, файлов, необходимых для работы
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.txt
REM ECHO BackupAdmin2@mydomain.ru >> %ZERAT_FILES%\maillist.txt
)
REM Адрес сервера для хранения бэкапов
SET SERVER=192.168.0.1
REM Базовый каталог на сервере, в котором расположены каталоги пользователей
SET BASEPATH=backup
REM Имя пользователя для подключения сетевого диска
SET USERNAME=bkup
REM Пароль для подключения сетевого диска
SET PASSWORD=bkup
REM Каталог на сервере, в котором будут храниться архивы,
REM считая от базового каталога \\192.168.0.1\backup\
SET PATH_ON_SERVER=test\%1
REM ==== Программная часть ====
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 FULL
IF %WEEKDAY%==Tue GOTO DIFF
IF %WEEKDAY%==Wed GOTO DIFF
IF %WEEKDAY%==Thu GOTO DIFF
IF %WEEKDAY%==Fri GOTO DIFF
IF %WEEKDAY%==Sat GOTO DIFF
IF %WEEKDAY%==Sun GOTO DIFF
:FULL
REM Создаем полный бекап с нуля
REM Сначала удаляем старые архивы, т.к. создаётся новый полный архив
IF NOT EXIST %ARCHPATH%\old\NUL MD %ARCHPATH%\old
DEL /F /Q %ARCHPATH%\old\*.*
MOVE %ARCHPATH%\*.7z %ARCHPATH%\old
ECHO ---------------------------------------------------- >> %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.txt
GOTO CONNECT
:DIFF
REM Если полных бекапов нет вообще - делаем полный с нуля
SET /p last_full= < %ARCHPATH%\last_full.txt
IF NOT EXIST "%last_full%" (
ECHO No full backup exist, begin make full backup >> %LOG%
goto FULL
)
REM Если есть - считываем его имя из файла и делаем дифференциальный бекап на его основе
SET /p last_full= < %ARCHPATH%\last_full.txt
ECHO ---------------------------------------------------- >> %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 CONNECT
REM Подключение сетевого диска
:CONNECT
NET USE Z: /d /y
FOR /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
)
)
:EXIT01
REM На сервер имеет смысл копировать только самый свежий архив,
REM т.к. предыдущие там уже должны быть.
REM Имя искомого архива формируется так:
REM %1-%WEEKDAY%-%TIMESTAMP%.7z
REM %1 - входной параметр этого .cmd файла, имя архивируемой базы
REM %WEEKDAY% - сегодняшний день недели
REM %TIMESTAMP% - время создания архива
REM Копирование архива на сервер (синхронизация каталогов, если быть точным)
%PROGPATH%\robocopy %ARCHPATH% Z:\ /MIR /E /Z /R:100 /TBD
REM Проверка существования архива на сервере и отправка уведомлений по почте
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 /y
REM Запись в лог-файл времени окончания архивации
ECHO End backup at >> %LOG%
ECHO %WEEKDAY% >> %LOG%
DATE /T >> %LOG%
TIME /T >> %LOG%
REM Ротация логов
REM Запускается только по первым числам месяца
IF %DAY% == 01 CALL :LOGROTATION
GOTO END
REM =========== FUNCTIONS ============
REM ===== Begin SENDMSG function =====
:SENDMSG
%ZERAT% %1
EXIT /b
REM ===== End SENDMSG function =====
REM ===== Begin LOGROTATION function =====
:LOGROTATION
IF NOT EXIST %LOG% EXIT /b
REM ECHO %LOG% > %REN_LIST%
FOR /F %%f in ('TYPE %REN_LIST%') DO (
IF EXIST %%f.bak DEL %%f.bak
IF EXIST %%f REN %%f %%~nxf.bak
)
EXIT /b
REM ===== 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
задаётся файл-список исключений для архивации. Можно указывать как маски файлов, так и каталоги, по одному исключению на строку. Например, так:*.cdx
Documents\Evernote
SET 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