
Сегодня мы поговорим про создание/восстановление резервных копий bacula под Windows.
Сразу предупреждаю, никакой революционной изюминки здесь вы не найдете, но, надеюсь, некоторым хабражителям информация будет полезной (дабы в т.ч. оценить гибкость этого бесплатного продукта).
Статья расчитана на тех, у кого уже есть небольшой опыт общения с bacula.
Ограничение, с которым я столкнулся, это невозможность задавать ограничение на размер файла. Но зато bacula поддерживает получение списка файлов через pipe от команды, которая может выполняться как на клиенте, так и на сервере. Подробнее читайте здесь.
Итак, поехали.
Список требований.
0) должны поддерживаться русские имена файлов!
1) не ставить дополнительного ПО на клиенте
2) гибкость в настройке
3) гибкость в восстановлении
Исходная система — CentOS 5 + bacula 5.0.2 with mysql-backend + webacula.
Hint! В MySQL должна быть выставлена правильная кодировка, в нашем случае utf8.
Установка и настройка не являются темой данного топика. На эту тему ищите другие топики на хабре. Описывать самые простые случаи я тоже не буду, дабы не засорять статью.
Для начала опишем набор файлов для директора bacula.
Выглядит это примерно так:
FileSet {
Name = XXX
..
File = "\\|c:/windows/system32/cscript.exe //NOLOGO \"C:/Program Files/Bacula/_jobs/filelist.js\""
..
}
Отметим, что в командной строке мы можем передавать аргументы в наш скрипт, в т.ч. максимальный размер файла (тем самым реализуя пункт 2).
Теперь сам скрипт для создания списка файлов. Обратите внимание, что используем перекодирование CP866->UTF-8.
filelist.js:
// описываем фукнкцию перекодировки в UTF-8
function sToUTF8(sText, srcCharset)
{
if (!srcCharset) srcCharset = "cp866"; //ADODB.Stream default - Unicode. KOI8-R, cp866, windows-1251
with (new ActiveXObject("ADODB.Stream"))
{ //http://www.w3schools.com/ado/ado_ref_stream.asp
type = 2; //Binary 1, Text 2 (default)
mode = 3; //Permissions have not been set 0, Read-only 1, Write-only 2, Read-write 3,
//Prevent other read 4, Prevent other write 8, Prevent other open 12, Allow others all 16
charset = "utf-8";
open();
writeText(sText);
position = 0;
charset = srcCharset;
var nPos = 3;
return readText().substr(nPos);
}
}
function ShowFolderList(folderspec)
{
var fso, f, fc;
var p;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.GetFolder(folderspec);
re = /\\/g; // необходимо для последующего преобразования \ -> /
fc = new Enumerator(f.Files);
for (; !fc.atEnd(); fc.moveNext())
{
try
{
p = fc.item();
r = '' + p;
r = r.replace(re, "/"); // replace \ to "/".
if (p.Size < 2097152) // 2 MB
WScript.Echo(sToUTF8(r));
}
catch(e)
{
}
}
fc = new Enumerator(f.SubFolders);
for (; !fc.atEnd(); fc.moveNext())
{
try
{
ShowFolderList(fc.item());
}
catch(e)
{
}
}
}
ShowFolderList("D:\\Private\\Buhgalteria");
Несложно заметить, что мы просто рекурсивно пробегаем все папки от исходной, перебирая файлы и фильтруя под наши условия.
Теперь перейдем непосредственно к восстановлению. Запускаем на сервере
bconsole
, выбираем restore
и указывыем для восстановления соответствующий job.На этапе выбора файлов для восстановления нам доступно несколько команд, опишу самые полезные:
help
— подсказкаfind
— поиск нужного файлаls
,dir
— просмотр файлов в текущем каталоге (каталоги с подкаталогами будут отображены с "+")cd
— смена каталогаmark file
— отметить файл находящийся в текущем местоположенииmark dir/
— отметить отдельный каталог находящийся в текущем местоположенииmark *
— отметить все файлы и каталоги внутри текущего каталога. Кстати, TAB здесь тоже работаетlsmark
— просмотреть отмеченние файлыpwd
— показать текущий каталогestimate
— посчитать размер восстанавливаемых файловdone
— закончить отметкуТ.о. общая схема такая — ищем через
find
то что нужно, затем переходим в нужный каталог посредством cd
и делаем mark
на то, что нужно. Важное замечание:
для bacula имеет значение регистр, не важно что клиентом выступает Windows-машина.