Резервное копирование скрипт windows

Информационный портал по безопасности

Рабоче-крестьянское резервное копирование под Windows

Автор: admin от 25-12-2014, 11:19, посмотрело: 3 373

Постановка задачи

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

Пусть задача будет звучать следующим образом:

  • Необходимо организовать автоматическое резервное копирование определенных файлов компьютера на отдельный носитель.
  • Компьютер работает под управлением Windows версий 7 / 2008 или более поздней.
  • Объем данных большой, поэтому копирование должно поддерживаться как полное, так и дифференциальное.
  • Д.б. возможность копировать любые файлы, в т.ч. системные, заблокированные на чтение и т. п.
  • Сторонним платным софтом пользоваться категорически не хочется (ну, допустим, мы стеснены в средствах, а эти ваши торренты — не наш путь! Или религия не позволяет. Или миллион других причин.), а лучше вообще обойтись без любого стороннего софта, пользуясь лишь возможностями ОС .

    Немного подумав, еще расширим список хотелок:

  • Как продолжение предыдущего пункта, формат архива также должен быть открытым и распространенным, чтобы в случае чего его без проблем открыть откуда угодно с помощью чего-угодно
  • Более того, он должен быть таким, чтобы из любого, даже дифференциального архива, можно было бы без труда вытащить любой файл, не распаковывая для этого весь архив.
  • Глубина архивации должна настраиваться (что называется, backup rotate).
  • Было бы неплохо также с архивом сохранять дескрипторы безопасности NTFS.
  • И вообще, хочется максимальной расширяемости и настраиваемости, если завтра возникнет желание нагородить дополнительный функционал.

    Что ж, требования сформулированы, дело за малым – спланировать и реализовать всё остальное.

    Выбор средств

    Поскольку сторонние средства мы решили отметать, то как такового выбора технологий у нас почти не остается:

    • Алгоритмический язык и командлеты – Powershell (хотя тут при желании можно и VBScript)
    • Доступ к файлам через службу теневого копирования тома (VSS)
    • Формат архива – Zip
    • Механизм копирования только измененных файлов – архивный бит файловой системы
    • Автоматизация запусков – встроенный планировщик
    • ПО архивации – ?

    Несморя на то, что через пользовательский интерфейс Windows создать «Сжатую ZIP-папку» проще простого, в результате поиска встроенного аналога командной строки меня постиг облом №1. Для реализации, собственно, функции архивирования для оригинальной Windows из коробки, к сожалению, так или иначе требовалась либо доустановка NET Framework, либо сторонних командлетов Powershell, либо файлов из Resource Kit, либо чего-то еще.

    Опробовав ряд вышеперечисленных вариантов меня постиг облом №2: на больших объемах архивируемых данных (начиная от пары сотен гигабайт) одни попросту вылетали, другие съедали всю память и начинали грузить сервер, третьи еще каким-то образом начинали чудить.

    Глубоко вздохнув, приходится делать шаг в сторону от одного из вышеозначенных принципов и взять на роль архиватора готовое решение. С точки зрения опенсорсности и бесплатности опять же практически безальтернативно выбор падает на:

    Читайте также:  Не могу удалить старую папку windows old

    План алгоритма

    Итак, алгоритм предельно прост: пишем сценарий на Powershell, который должен:

  • Исходя из переданных параметров, создать теневую копию интересуемого тома.
  • Получить к ней доступ из операционной системы.
  • В случае дифференциальной/инкрементной резервной копии составить список измененных файлов.
  • Заархивировать нужные файлы.
  • По возможности заархивировать NTFS ACL
  • Удалить теневую копию.
  • В случае создания полной/инкрементной резервной копии – сбросить с файлов архивный бит.
  • В случае создания полной копии удалить старые бэкапы (старше заданной глубины архивации).

    Скрипт

    Ходить вокруг да около тут незачем, сразу публикую готовый скрипт:

    Для работы скрипта мы должны заполнить выделенный в начале файла блок переменных (пути архивации, глубина хранения архивов) и создать файл с папками-источниками, например, такой:

    Использование

    Складываем всё в одну папку, и всё, можно запускать в Powershell. Единственный параметр — тип запуска [full | diff], определяет полный/дифференциальный способ копирования.

    Убедившись, что всё работает (или поправив параметры, если нет) создаём задание в планировщике (отдельно для полного копирования и отдельно для дифференциального).

    Ну вот, в целом, и всё, можно настроить, представить папку с архивами системе мониторинга наличия резервных копий (если есть) и забыть.

    Замечания

    • Для корректной работы (в первую очередь для создания теневой копии) powershell должен быть запущен от имени администратора (или «с наивысшими привилегиями» в терминологии планировщика заданий).
    • По идее способ также годится для горячего консистентного резервного копирования хоть баз MSSQL, хоть MS Exchange (при установке соотв. shadow copy providers, которые к подобному софту идут в комплекте), хотя конкретно в этих случаях удобнее пользоваться встроенными средствами.
    • Инкрементным резервным копированием я не пользуюсь (много хлопот найти удаленный файл среди кучи инкрементных архивов), но если возникнет потребность, то он получается буквально комбинированием нескольких срочек из полного и дифференциального блоков скрипта.
    • Здесь также не реализован механизм сохранения ACL (формат zip, да и 7zip не поддерживают хранение дескрипторов безопасности в архиве; RAR умеет, но это уже не свободное ПО, что сильно противоречит условиям задачи). В случае необходимости дескрипторы можно сохранять в файл встроенными утилитами типа icacls и добавлять полученный дамп в создаваемый архив.
    • Увы и ах, алгоритм не подходит для XP/2003. Сложность возникает на моменте создания ярлыка на теневую копию (в этих ОС нет утилиты mklink, а по-быстрому обойти эти грабли у меня не вышло).

    Перед необходимостью изобретать свой велосипед автор за несколько лет намучался перепробовал большое количество разнообразного бесплатного готового ПО со похожей функциональностью (Cobian Backup, COMODO Backup и др.). Вдоволь находившись по разнообразным встроенным в упомянутый софт граблям, было принято решение написать что-то своё. На данный момент описанное решение успешно работает на серверах (Windows Server 2008 R2) и рабочих станциях (Windows 7 и Windows 8.1).

    Самая крупная создаваемая полная резервная копия на данный момент составляет 1 Тб в исходных файлах, в архиве – 350 Гб. При архивировании с зеркала SAS (7200) на такой же локальный Volume-диск (оба работают внутри vSphere, будучи подключенными как RDM Passthrough-диски) операция занимает около 6 часов, что в условиях задачи является вполне приемлемым результатом.

    Скрипт резервного копирования

    Ценность резервного копирования ощущает каждый, кто сталкивался с потерей файлов.
    Для резервного копирования можно использовать профессиональные платные продукты, например, Symantec Backup Exec Desktop and Laptop Option, а можно и самому бесплатно создать эффективный механизм резервного копирования файлов, как документов пользователя, так и служебных файлов на серверах, с помощью доступных подручных средств: командный файл и пара бесплатных программ.
    Резервное копирование будет иметь следующие функции:

    • копирование всех файлов некоторого каталога и его подкаталогов (полное копирование, full backup), выполняется довольно долго при большом количестве файлов
    • копирование файлов, измененных после последнего резервного копирования (добавочное копирование, incremental backup) – определяется по архивному атрибуту, этот режим выполняется довольно быстро за счёт небольшого числа файлов
    Читайте также:  Как отключить вибрацию при нажатии windows phone

    Реализация основана на следующих идеях:

    • файлы резервных копий сохраняются в в виде ZIP файлов, это удобно для просмотра пользователями, так как на любом компьютере есть программа ZIP Folder или архиватор, поддерживающий формат ZIP
    • каждая резервная копия сохраняется в отдельном файле, в названии файла указывается дата снятия копии, это облегчает поиск нужной редакции восстанавливаемого файла

    Для создания ZIP файлов потребуется программа-архиватор с интерфейсом командной строки, например, 7-ZIP.

    Предположим, что нам потребуется создавать резервные копии документов пользователя (%USERPROFILE%\Documents) и сохранять их на файловом сервере, где выделены папки для резервных копий каждого пользователя \\FILESERVER\Backup\%USERNAME%

    Полное резервное копирование (FULLBACKUP.CMD)

    Командный файл полного резервного копирования определяет имя файла по текущей дате, например, fullbackup_20130222.zip для 22 февраля 2013 года и вызывает архиватор:

    Предполагается, что программа 7-ZIP уже установлена на компьютере, и путь к её файлам прописан в переменной PATH. Если нет, необходимо добавить в последнюю строку путь к файлу.

    В результате, на файловом сервере будет создан файл fullbackup_20130222.zip с файлами пользователя. Пользователь может в любой момент открыть файл резервной копии на сервере и извлечь интересующий файл.

    Добавочное резервное копирование (INCBACKUP.CMD)

    Отличие добавочного копирования состоит в том, что необходимо добавлять в ZIP не все файлы, а только те, которые имеют установленный архивный аттрибут («файл готов для архивирования»). Для этого используем программу DIR с необходимыми параметрами, сохраняя вывод в файл:

    Необходимо запускать команду из Unicode среды ( команда cmd /u incbackup.cmd ), чтобы корректно обработать файлы, в названии которых есть символы из расширенного набора.

    Следующим шагом необходимо подготовить сформированный список файлов для 7-ZIP:

    • преобразовать кодировку из UTF-16 в UTF-8 (требуется для 7-ZIP),
    • убрать из путей файлов начальную часть пути к каталогу

    Это можно сделать одним запуском программы nhreplace:

    Остаётся добавить назначение переменных и удаление файла списка после записи файла резервной копии, итоговый командный файл для добавочного копирования будет выглядеть так:

    Также в файле присутствуют команды pushd-popd для перехода в каталог копируемых файлов и обратно. Перемещение в этот каталог необходимо для нормальной работы 7-ZIP со списком. В зависимости от того, как запускается командный файл и нужно ли возвращаться в исходный каталог, можно оставить пару pushd-popd , или ограничиться командой cd «%files_folder%»

    Поскольку 7-ZIP не имеет функции сброса атрибута файла, для этого можно использовать команду attrib.

    Использование

    Созданные командные файлы fullbackup.cmd и incbackup.cmd можно запускать как вручную, так и по расписанию.
    Например, файл incbackup.cmd можно запускать и несколько раз в день, хоть каждый час, и он будет обновлять файл резервной копии текущего дня по мере того, как пользователь вносит изменения в свои документы, при этом время резервного копирования будет небольшим.
    При этом пользователю будут доступны сделанные копии по дням, и он сможет сам, без участия администратора, восстанавливать не только определённый файл, но и различные его редакции (по датам).

    Читайте также:  Файл цифровой подписи драйверов windows

    Этот скрипт подходит для конфигурации, когда компьютер имеет высокоскоростное подключение к серверу , так как скрипт обрабатывает ZIP файл резервной копии, находящийся на файловом сервере.

    BAT скрипт для резервного копирования папки

    Набросал ещё один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.

    Ссылки

    Функции

    • С помощью xcopy делает резервные копии папки.
    • Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
    • С помощью 7-Zip архивирует резервные копии.
    • Удаляет старые резервные копии.
    • DirName — название папки
    • SourceDir — что бэкапим
    • BackupDir — куда бэкапим
    • NumFolders — сколько подпапок с бэкапами хранить
    • a7z — путь к 7z.exe

    Пример настройки расписания

    В Task Scheduler настраиваем новое задание.

    Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.

    В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.

    Указываем ссылку на наш BAT файл.

    Проверяем настройки. OK.

    Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.

    Если хотите хранить ежедневные и ежемесячные резервные копии — сделайте два BAT файла и два расписания резервного копирования в разные папки.

    BAT скрипт для резервного копирования папки

    Набросал ещё один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.

    Ссылки

    Функции

    • С помощью xcopy делает резервные копии папки.
    • Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
    • С помощью 7-Zip архивирует резервные копии.
    • Удаляет старые резервные копии.

    @echo off
    SetLocal EnableDelayedExpansion

    set DirName=my_folder
    set SourceDir=C:\%DirName%
    set BackupDir=B:\%DirName%\daily\
    set NumFolders=10

    0,2%
    set h=%h: =0%
    set FullBackupDir=%BackupDir%%date%_%h%%time:

    xcopy %SourceDir% %FullBackupDir%%DirName%\ /E /F /H /R /K /Y /D 2>nul >nul

    «%a7z%» a -tzip -bb0 -bd -sdel «%FullBackupDir%%DirName%.zip» «%FullBackupDir%» 2>nul >nul

    for /f «tokens=* delims=» %%D in (‘dir %BackupDir% /ad /b /o-d’) do (
    if not %%D==»» (
    if not !NumFolders!==0 (
    set /a NumFolders-=1
    ) else (
    rd /s /q %BackupDir%%%D 2>nul >nul
    )
    )
    )

    • DirName — название папки
    • SourceDir — что бэкапим
    • BackupDir — куда бэкапим
    • NumFolders — сколько подпапок с бэкапами хранить
    • a7z — путь к 7z.exe

    Пример настройки расписания

    В Task Scheduler настраиваем новое задание.

    Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.

    В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.

    Указываем ссылку на наш BAT файл.

    Проверяем настройки. OK.

    Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.

    Если хотите хранить ежедневные и ежемесячные резервные копии — сделайте два BAT файла и два расписания резервного копирования в разные папки.

    Если вам понравилась статья, то ставьте 👍🏻 каналу.
    Пишите комментарии, задавайте вопросы, подписывайтесь.

  • Оцените статью