Application: "Bacula 5.2/7.4", "ntbackup" или "wbadmin".
Задача: наладить выгрузку резервной копии набора системных настроек ("состояния системы") операционной системы "Microsoft Windows Server" посредством "Bacula".
В ОС Linux практически все системные настройки сосредоточены в файлах директории "/etc" - их достаточно, чтобы при необходимости воссоздать конфигурацию операционной системы и её сервисов. С "Microsoft Windows" совсем не так всё просто - её конфигурация разбросана по такому количеству закоулков файловой системы, что нет иного способа её сохранения, кроме как копирование содержимого всех системных директорий (вместе с исполняемыми файлами и библиотеками ресурсов), включая "реестры". При этом нужно учитывать, что сервисы, запущенные в "MS Windows", часто хранят свои конфигурации в своих специфичных местах, и резервная копия состояния несущей операционной системы скорее всего их не затронет. Тем не менее, из соображений общей полезности, наладим выгрузку "состояния системы".
Предварительная настройка операционной системы.
В операционной системе должен быть исправна подсистема "теневого копирования" VSS (Microsoft Volume Snapshot Service, Shadow Copy), позволяющая обращаться к открытым и заблокированным файлам - без этого выгрузка "состояния системы" невозможна.
В системах "MS Windows Server WinNT/2000/2003" резервная копия "состояния системы" снимается посредством отдельно стоящей утилиты "NTBackup" - она поставляется в комплекте и её установка не требуется. В среднем архив резервной копии занимает в файловой системе 500-700MB.
В современных "MS Windows Server 2008/2012/2016" прежний способ убрали, введя для задач резервного копирования целый сервис, в виде отдельного компонента "Windows Server Backup/Система архивации данных") - его нужно установить. Для управления сервисом используется утилита "WBAdmin". Для размещения архива резервной копии необходимо зарезервировать 10-15GB свободного места в файловой системе.
В процессе выработки оптимальной методики использования утилиты "wbadmin" выяснилось, что таковая не разрешает сохранять файлы данных резервной копии "состояния системы" на системном диске и произвольной локальной директории, но согласна записать их в любой сетевой ресурс - так что далее делаем "ход конём" и всё же временно сохраняем архив резервной копии на системном диске, подключаясь к нему по сети через "локальную петлю".
Конфигурирование "Bacula".
Дополняем описание задания резервного копирования "состояния системы" следующими блоками конфигурации, в зависимости от типа системы.
Для старых представителей ОС "MS Windows Server WinNT/2000/2003":
# vi /etc/bacula/client.d/example.net.conf
....
FileSet {
....
Include {
....
# Директория архива "состояния системы"
File = "C:/bacula-ntbackup"
}
}
....
Job {
Name = "example.net"
Type = Backup
....
# Запуск выгрузки резервной копии "состояния системы" "MS Windows Server WinNT/2000/2003" посредством "NTBackup":
RunScript {
RunsWhen = Before
FailJobOnError = No
# Зачищаем и воссоздаём место для сохранения архива резервной копии
Command = "if exist C:\\bacula-ntbackup rmdir /s /q C:\\bacula-ntbackup"
Command = "mkdir C:\\bacula-ntbackup"
# Запускаем выгрузку резервной копии "состояния системы"
# (гарантируя читаемость уведомлений используем английскую кодовую таблицу - 437)
Command = "if [%l]==[Full] (chcp 437 & ntbackup.exe backup systemstate /J \"Windows State Backup\" /F \"C:\\bacula-ntbackup\\system_state_backup.bkf\" /R:yes /L:f /SNAP:on)"
}
#
RunScript {
RunsWhen = After
RunsOnFailure = yes
# По завершению всех процедур задания высвобождаем ресурсы
Command = "if exist C:\\bacula-ntbackup rmdir /s /q C:\\bacula-ntbackup"
}
}
FileSet {
....
Include {
....
# Директория архива "состояния системы"
File = "C:/bacula-ntbackup"
}
}
....
Job {
Name = "example.net"
Type = Backup
....
# Запуск выгрузки резервной копии "состояния системы" "MS Windows Server WinNT/2000/2003" посредством "NTBackup":
RunScript {
RunsWhen = Before
FailJobOnError = No
# Зачищаем и воссоздаём место для сохранения архива резервной копии
Command = "if exist C:\\bacula-ntbackup rmdir /s /q C:\\bacula-ntbackup"
Command = "mkdir C:\\bacula-ntbackup"
# Запускаем выгрузку резервной копии "состояния системы"
# (гарантируя читаемость уведомлений используем английскую кодовую таблицу - 437)
Command = "if [%l]==[Full] (chcp 437 & ntbackup.exe backup systemstate /J \"Windows State Backup\" /F \"C:\\bacula-ntbackup\\system_state_backup.bkf\" /R:yes /L:f /SNAP:on)"
}
#
RunScript {
RunsWhen = After
RunsOnFailure = yes
# По завершению всех процедур задания высвобождаем ресурсы
Command = "if exist C:\\bacula-ntbackup rmdir /s /q C:\\bacula-ntbackup"
}
}
Для нового семейства ОС "MS Windows Server 2008/2012/2016":
# vi /etc/bacula/client.d/example.net.conf
....
FileSet {
....
Include {
....
# Директория архива "состояния системы"
File = "C:/bacula-wbadmin"
}
}
....
Job {
Name = "example.net"
Type = Backup
....
# Запуск выгрузки резервной копии "состояния системы" и системных файлов "MS Windows Server 2008/2012/2016" посредством "WBAdmin":
RunScript {
RunsWhen = Before
FailJobOnError = No
# Зачищаем и воссоздаём место для сохранения архива резервной копии
Command = "if exist c:\\bacula-wbadmin rmdir /s /q c:\\bacula-wbadmin"
Command = "mkdir c:\\bacula-wbadmin"
# Запускаем выгрузку резервной копии "состояния системы"
# (гарантируя читаемость уведомлений используем кодовую таблицу UTF8 - 65001)
Command = "if [%l]==[Full] (chcp 65001 & wbadmin start systemstatebackup -quiet -backupTarget:\\\\localhost\\c$\\bacula-wbadmin)"
}
#
RunScript {
RunsWhen = After
RunsOnFailure = yes
# По завершению всех процедур задания высвобождаем ресурсы
Command = "if exist c:\\bacula-wbadmin rmdir /s /q c:\\bacula-wbadmin"
}
}
FileSet {
....
Include {
....
# Директория архива "состояния системы"
File = "C:/bacula-wbadmin"
}
}
....
Job {
Name = "example.net"
Type = Backup
....
# Запуск выгрузки резервной копии "состояния системы" и системных файлов "MS Windows Server 2008/2012/2016" посредством "WBAdmin":
RunScript {
RunsWhen = Before
FailJobOnError = No
# Зачищаем и воссоздаём место для сохранения архива резервной копии
Command = "if exist c:\\bacula-wbadmin rmdir /s /q c:\\bacula-wbadmin"
Command = "mkdir c:\\bacula-wbadmin"
# Запускаем выгрузку резервной копии "состояния системы"
# (гарантируя читаемость уведомлений используем кодовую таблицу UTF8 - 65001)
Command = "if [%l]==[Full] (chcp 65001 & wbadmin start systemstatebackup -quiet -backupTarget:\\\\localhost\\c$\\bacula-wbadmin)"
}
#
RunScript {
RunsWhen = After
RunsOnFailure = yes
# По завершению всех процедур задания высвобождаем ресурсы
Command = "if exist c:\\bacula-wbadmin rmdir /s /q c:\\bacula-wbadmin"
}
}
Проверяем корректность конфигурации и применяем таковую:
# bacula-dir -c /etc/bacula/bacula-dir.conf -t
# /etc/init.d/bacula-dir reload
# /etc/init.d/bacula-dir reload