Tajemnice bconsole czyli pierwsze kroki z tekstową konsolą Bacula cz.3
15 styczeń 2011, autor: Marcin Haba (gani)
W trzeciej i ostatniej części artykułu o bconsole można dowiedzieć się o tym, jak wykonać backup oraz o tym, jak najprościej przywrócić dane z wykonanych kopii zapasowych.
Wstęp
W codziennej pracy z Bacula uruchamianie zadań kopii zapasowych zazwyczaj realizowane jest poprzez skonfigurowane harmonogramy zadań (ang. schedule). Trudno wyobrazić sobie administrowanie Bacula polegające na codziennym uruchamianiu backupu ręcznie, co przywodzi mi na myśl pracę dawnego morskiego latarnika. Niemniej jednak umiejętność manualnego wykonywania backupu przydaje się na przykład tam, gdzie automatyzacja zawodzi, lub jest ona na etapie konfigurowania.
Estymacja backupu
Dzięki możliwości estymacji backupu można uzyskać informacje o tym, jak dużo danych zostanie zapisanych i jakie to dane. Proces estymacji nie zapisuje żadnych danych na woluminy a jedynie symuluje wykonanie backupu. Realizowany jest przez działanie klienta Bacula, który sprawdza jakie dane mogą zostać przetworzone w operacji backupu, a następnie przesyła taką informację zwrotną do zarządcy (Director).
Do estymacji backupu służy komenda o nazwie estimate. Oto przykładowe wywołanie komendy estimate dla zadania backupu o nazwie BackupClient1:
*estimate job=BackupClient1
Using Catalog "MyCatalog"
Connecting to Client gani-desktop-fd at localhost:9102
2000 OK estimate files=156 bytes=27,956,351
Na listingu widoczna jest ilość plików jaka może zostać użyta do backupu (156 plików) oraz zajętość backupu w bajtach (27956351 bajtów).
Domyślnie estymowane jest wykonanie kopii pełnej (full backup). Do symulacji kopii innych poziomów (przyrostowych, różnicowych) służy parametr level. Estymacja w/w zadania jako backup przyrostowy może wyglądać następująco:
*estimate job=BackupClient1 level=incremental
Using Catalog "MyCatalog"
Connecting to Client gani-desktop-fd at localhost:9102
2000 OK estimate files=59 bytes=8,394,722
Oprócz otrzymanego podsumowania estymacji (ilość plików i bajtów) konsola Bacula udostępnia możliwość wylistowania plików, których podsumowanie dotyczy. W tym celu do komendy estimate potrzeba dodać parametr listing, np.:
*estimate job=BackupClient1 level=incremental listing
Using Catalog "MyCatalog"
Connecting to Client gani-desktop-fd at localhost:9102
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:53 /var/log/news/news.err
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:53 /var/log/news/news.notice
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:53 /var/log/news/news.crit
-rw-r--r-- 1 root root 863 2011-01-14 23:36:00 /var/log/boot.log
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:52 /var/log/lpr.log
-rw-r----- 1 syslog adm 31673 2011-01-15 01:17:01 /var/log/auth.log
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:52 /var/log/ufw.log
-rw-r--r-- 1 root root 5893 2011-01-12 17:34:03 /var/log/Xorg.failsafe.log.old
-rw-r--r-- 1 root root 1528 2011-01-14 23:48:06 /var/log/kdm.log.1
-rw-r----- 1 syslog adm 163763 2011-01-14 23:48:06 /var/log/syslog.7.gz
-rw-r----- 1 syslog adm 8471 2011-01-14 23:37:51 /var/log/mail.info
-rw-r----- 1 root adm 14419 2011-01-14 23:35:59 /var/log/dmesg.3.gz
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:52 /var/log/mail.warn
drwxr-xr-x 2 speech-d root 4096 2011-01-13 17:51:15 /var/log/speech-dispatcher
-rw-r--r-- 1 root root 5893 2011-01-12 17:34:24 /var/log/Xorg.failsafe.log
-rw-r--r-- 1 root root 27926 2011-01-11 17:49:45 /var/log/alternatives.log
-rw-r--r-- 1 root root 253201 2011-01-14 23:35:53 /var/log/udev
-rw-r----- 1 syslog adm 97059 2011-01-14 23:48:06 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 120599 2011-01-14 23:48:06 /var/log/syslog.2.gz
-rw-r--r-- 1 root root 65545 2011-01-14 23:37:04 /var/log/ConsoleKit/history
-rw-r--r-- 1 root root 24953 2011-01-14 23:36:01 /var/log/Xorg.0.log.old
-rw-r--r-- 1 root root 174040 2011-01-14 23:37:12 /var/log/pm-powersave.log
-rw-r----- 1 syslog adm 47360 2011-01-14 23:48:06 /var/log/syslog.4.gz
-rw-r----- 1 syslog adm 0 2011-01-14 23:35:52 /var/log/mail.err
-rw-r--r-- 1 root root 1631 2011-01-14 23:48:06 /var/log/kdm.log.2.gz
-rw-r----- 1 root adm 145 2011-01-14 23:47:56 /var/log/cups/access_log.6.gz
-rw-r----- 1 root adm 140 2011-01-14 23:47:56 /var/log/cups/access_log.4.gz
-rw-r----- 1 root adm 125 2011-01-14 23:48:06 /var/log/cups/access_log.1.gz
-rw-r----- 1 root adm 189 2011-01-14 23:47:56 /var/log/cups/access_log.7.gz
-rw-r----- 1 root adm 184 2011-01-14 23:47:56 /var/log/cups/access_log.5.gz
-rw-r----- 1 root adm 147 2011-01-14 23:47:56 /var/log/cups/access_log.3.gz
-rw-r----- 1 root adm 166 2011-01-14 23:47:56 /var/log/cups/access_log.2.gz
-rw-r----- 1 root lpadmin 0 2011-01-14 23:47:56 /var/log/cups/access_log
drwxr-xr-x 2 root root 4096 2011-01-14 23:48:06 /var/log/cups
-rw-r----- 1 syslog adm 8471 2011-01-14 23:37:51 /var/log/mail.log
-rw-r--r-- 1 root root 1207480 2011-01-13 17:56:29 /var/log/dpkg.log
-rw-r----- 1 syslog adm 1443202 2011-01-14 23:48:06 /var/log/messages
-rw-r----- 1 syslog adm 6783 2011-01-15 01:27:24 /var/log/syslog
-rw-r----- 1 root adm 14721 2011-01-14 23:35:59 /var/log/dmesg.4.gz
-rw-r----- 1 syslog adm 63283 2011-01-14 23:48:06 /var/log/syslog.6.gz
-rw-rw-r-- 1 root utmp 272640 2011-01-15 00:19:56 /var/log/wtmp
-rw-r----- 1 syslog adm 607954 2011-01-14 23:37:35 /var/log/debug
-rw-r----- 1 bacula bacula 159003 2011-01-09 23:13:24 /var/log/bacula/log
-rw-r----- 1 root adm 14514 2011-01-14 23:36:00 /var/log/dmesg.1.gz
-rw-r--r-- 1 root root 7434 2011-01-13 17:56:30 /var/log/apt/history.log
-rw------- 1 root root 76226 2011-01-13 17:56:30 /var/log/apt/term.log
-rw-r----- 1 syslog adm 2412 2011-01-14 23:35:52 /var/log/user.log
-rw-r----- 1 root adm 14420 2011-01-14 23:35:59 /var/log/dmesg.2.gz
-rw-r--r-- 1 root root 0 2011-01-14 23:48:06 /var/log/kdm.log
-rw-r----- 1 root adm 55167 2011-01-14 23:36:00 /var/log/dmesg.0
-rw-r----- 1 syslog adm 2007571 2011-01-14 23:37:35 /var/log/kern.log
-rw-r--r-- 1 root root 32032 2011-01-13 17:51:14 /var/log/faillog
-rw-r----- 1 root adm 55400 2011-01-14 23:36:00 /var/log/dmesg
-rw-r----- 1 syslog adm 697643 2011-01-15 01:27:24 /var/log/daemon.log
-rw-r----- 1 syslog adm 121934 2011-01-14 23:48:06 /var/log/syslog.1
-rw-rw-r-- 1 root utmp 292292 2011-01-13 17:51:14 /var/log/lastlog
-rw-r--r-- 1 root root 23370 2011-01-15 00:19:21 /var/log/Xorg.0.log
-rw-r----- 1 syslog adm 165945 2011-01-14 23:48:06 /var/log/syslog.5.gz
drwxr-xr-x 15 root root 4096 2011-01-14 23:48:06 /var/log
2000 OK estimate files=59 bytes=8,395,810
Jak widać, oprócz plików zostały wylistowane również dodatkowe informacje o plikach (atrybuty, właściciel, grupa, ilość bajtów, czas modyfikacji). Przy większej ilości plików można zastosować opisaną w pierwszej części tego artykułu komendę @output, przekierowując w ten sposób wyjście komendy estimate do pliku.
*@output /tmp/estymacja.txt
*estimate job=BackupClient1 level=incremental listing
*@output
Można również użyć bezpośredniego wykonania bconsole z systemowej linii komend:
echo "estimate job=BackupClient1 level=incremental listing" | bconsole | less
Dodatkowe parametry komendy estimate to:
- client=nazwa_klienta – definiuje klienta, który będzie symulował backup,
- accurate=yes/no – jeśli yes, to w estymacji zostanie wykonana z wykorzystaniem funkcjonalności accurate backupu,
- fileset=file_set – możliwość podania nazwy określonego zasobu FileSet z pliku konfiguracyjnego zarządcy.
Manualny backup
Do zaprezentowania startowania backupu z tekstowej konsoli Bacula wykorzystam następujący zasób Job z pliku konfiguracyjnego zarządcy:
Job {
Name = "BackupClient1"
Type = Backup
Level = Full
Client = gani-desktop-fd
FileSet = "Full Set"
Storage = File
Messages = Standard
Pool = Sys-Full
Priority = 10
}
Do ręcznego uruchamiania zadań wykorzystywana jest komenda o nazwie run. Jej najprostsze wywołanie, w tym wypadku uruchomienie backupu, może wyglądać tak:
run job=BackupClient1
gdzie BackupClient1 to nazwa mojego zadania kopii zapasowej (nazwa zasobu Job).
Po tym wywołaniu zostanie wyświetlone podsumowanie z oczekiwaniem na potwierdzenie (po wpisaniu yes), modyfikację wyświetlonej w podsumowaniu konfiguracji (po wpisaniu mod) lub na zaniechanie uruchomienia backupu (po wpisaniu no).
*run job=BackupClient1
Using Catalog "MyCatalog"
Run Backup job
JobName: BackupClient1
Level: Full
Client: gani-desktop-fd
FileSet: Full Set
Pool: Sys-Full (From Job resource)
Storage: File (From Job resource)
When: 2011-01-15 08:38:27
Priority: 10
OK to run? (yes/mod/no):
Uruchamiam backup czyli wpisuję słowo yes. Po tej operacji można zobaczyć zgłoszenie zakolejkowania zadania wraz z identyfikatorem zadania nadanym przez Bacula:
Job queued. JobId=33
Backup wykonuje się, a rezultat jego działania można uzyskać po wpisaniu komendy messages, która sprawdza czy nadeszły nowe komunikaty (w tym przypadku będą to komunikaty z przebiegu backupu) oraz wyświetla je na ekran.
*messages
15-Jan 08:42 gani-desktop-dir JobId 33: Start Backup JobId 33, Job=BackupClient1.2011-01-15_08.42.44_03
15-Jan 08:42 gani-desktop-dir JobId 33: Using Device "FileStorage"
15-Jan 08:42 gani-desktop-sd JobId 33: Volume "Full-0001" previously written, moving to end of data.
15-Jan 08:42 gani-desktop-sd JobId 33: Ready to append to end of Volume "Full-0001" size=44885637
15-Jan 08:42 gani-desktop-sd JobId 33: Job write elapsed time = 00:00:04, Transfer rate = 7.016 M Bytes/second
15-Jan 08:42 gani-desktop-dir JobId 33: Bacula gani-desktop-dir 5.0.2 (28Apr10): 15-Jan-2011 08:42:52
Build OS: x86_64-pc-linux-gnu ubuntu 10.10
JobId: 33
Job: BackupClient1.2011-01-15_08.42.44_03
Backup Level: Full
Client: "gani-desktop-fd" 5.0.2 (28Apr10) x86_64-pc-linux-gnu,ubuntu,10.10
FileSet: "Full Set" 2011-01-06 16:30:00
Pool: "Sys-Full" (From Job resource)
Catalog: "MyCatalog" (From Client resource)
Storage: "File" (From Job resource)
Scheduled time: 15-Jan-2011 08:38:27
Start time: 15-Jan-2011 08:42:46
End time: 15-Jan-2011 08:42:52
Elapsed time: 6 secs
Priority: 10
FD Files Written: 156
SD Files Written: 156
FD Bytes Written: 28,050,578 (28.05 MB)
SD Bytes Written: 28,066,613 (28.06 MB)
Rate: 4675.1 KB/s
Software Compression: None
VSS: no
Encryption: no
Accurate: no
Volume name(s): Full-0001
Volume Session Id: 1
Volume Session Time: 1295074462
Last Volume Bytes: 72,978,200 (72.97 MB)
Non-fatal FD errors: 0
SD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Backup OK
15-Jan 08:42 gani-desktop-dir JobId 33: Begin pruning Jobs older than 6 months .
15-Jan 08:42 gani-desktop-dir JobId 33: No Jobs found to prune.
15-Jan 08:42 gani-desktop-dir JobId 33: Begin pruning Jobs.
15-Jan 08:42 gani-desktop-dir JobId 33: No Files found to prune.
15-Jan 08:42 gani-desktop-dir JobId 33: End auto prune.
Otrzymany komunikat jest podsumowaniem z zakończenia backupu, co tym samym oznacza, że w chwili wpisywania komendy messages backup został już zakończony.
Komenda run może przyjmować zestaw parametrów, dzięki którym jest możliwe nadpisywanie dyrektyw ustawionych w zasobie Job w pliku konfiguracyjnym zarządcy (Director).
Moje zadanie o nazwie BackupClient1 jest zadaniem do wykonania pełnej kopii zapasowej (level=full). Używając parametru level w wywołaniu komendy run można tym samym nadpisać domyślną wartość full wartością np. incremental (kopia przyrostowa). Można również skierować zapis danych backupu na wolumen(y) z innej puli woluminów poprzez użycie parametru pool. Komenda taka może mieć postać:
*run job=BackupClient1 level=incremental pool=Sys-Inc
Run Backup job
JobName: BackupClient1
Level: Incremental
Client: gani-desktop-fd
FileSet: Full Set
Pool: Sys-Inc (From User input)
Storage: File (From Job resource)
When: 2011-01-15 09:11:12
Priority: 10
OK to run? (yes/mod/no):
W podsumowaniu przed uruchomieniem zadania widoczne są nowo wprowadzone wartości. Wpisuję yes i tym samym uruchamiam kopię przyrostową zadania BackupClient1 do puli woluminów o nazwie Sys-Inc.
Takie samo działanie jak powyższe, czyli nadpisywanie wartości zadań w wywołaniu komendy run, możliwe jest do uzyskania poprzez wpisanie komendy mod w podsumowaniu przed uruchomieniem zadania. Wpisanie mod (skrót od modification) udostępnia użytkownikowi menu, poprzez które może on zmieniać wszystkie możliwe do nadpisania wartości zadania. Jest to łatwiejsze rozwiązanie od przedstawionego powyżej nadpisywania opcji zadania poprzez parametry komendy run.
Poniżej znajduje się listing przedstawiający modyfikację opcji zadania poprzez menu bconsole:
*run job=BackupClient1
Run Backup job
JobName: BackupClient1
Level: Full
Client: gani-desktop-fd
FileSet: Full Set
Pool: Sys-Full (From Job resource)
Storage: File (From Job resource)
When: 2011-01-15 09:18:36
Priority: 10
OK to run? (yes/mod/no): mod
Parameters to modify:
1: Level
2: Storage
3: Job
4: FileSet
5: Client
6: When
7: Priority
8: Pool
9: Plugin Options
Select parameter to modify (1-9): 1
Levels:
1: Full
2: Incremental
3: Differential
4: Since
5: VirtualFull
Select level (1-5): 2
Run Backup job
JobName: BackupClient1
Level: Incremental
Client: gani-desktop-fd
FileSet: Full Set
Pool: Sys-Full (From Job resource)
Storage: File (From Job resource)
When: 2011-01-15 09:18:36
Priority: 10
OK to run? (yes/mod/no): mod
Parameters to modify:
1: Level
2: Storage
3: Job
4: FileSet
5: Client
6: When
7: Priority
8: Pool
9: Plugin Options
Select parameter to modify (1-9): 8
The defined Pool resources are:
1: Sys-Full
2: Sys-Inc
3: DB-Full
4: Scratch
Select Pool resource (1-4): 2
Run Backup job
JobName: BackupClient1
Level: Incremental
Client: gani-desktop-fd
FileSet: Full Set
Pool: Sys-Inc (From User input)
Storage: File (From Job resource)
When: 2011-01-15 09:18:36
Priority: 10
OK to run? (yes/mod/no):
Podsumowując, wynik działania powyższych operacji jest taki sam co przedstawione wywołanie:
run job=BackupClient1 level=incremental pool=Sys-Inc
Potrafiąc już modyfikować parametry zadania, można nadpisywać inne wartości takie jak np. Storage, Client, FileSet.
Przywracanie danych
Istnieje kilka sposobów na przywrócenie danych z kopii zapasowych, niekoniecznie używając do tego konsoli bconsole. W tej części artykułu zaprezentuję najprostszy sposób – poprzez wywołanie komendy konsoli Bacula o nazwie restore.
Przed użyciem komendy restore potrzebne jest zdefiniowanie co najmniej jednego zadania (zasób Job) typu Restore. W moim pliku konfiguracyjnym zarządcy istnieje jeden taki zasób i wygląda on tak:
Job {
Name = "RestoreFiles"
Type = Restore
Client=gani-desktop-fd
FileSet="Full Set"
Storage = File
Pool = Sys-Full
Messages = Standard
Where = /nonexistant/path/to/file/archive/dir/bacula-restores
}
Spróbuję przywrócić dane z backupu o identyfikatorze 33. Oto odpowiadająca za to komenda:
*restore jobid=33
You have selected the following JobId: 33
Building directory tree for JobId(s) 33 ... ++++++++++++++++++++++++++++++++++++
146 files inserted into the tree.
You are now entering file selection mode where you add (mark) and
remove (unmark) files to be restored. No files are initially added, unless
you used the "all" keyword on the command line.
Enter "done" to leave this mode.
cwd is: /
$
W tym momencie pojawił się znak zachęty (znak dolara). Jest to miejsce, gdzie potrzeba wybrać pliki do przywrócenia. Dla osób zainteresowanych przywracaniem wybranych plików backupu polecam wpisać w tym miejscu komendę help i podążać za wskazówkami z informacji zamieszczonej na powyższym listingu.
Do przywrócenia wszystkich plików backupu potrzeba wpisać:
$ mark *
Oraz zaakceptować wybór poprzez słowo done:
$ done
po którego wywołaniu użytkownik zostaje doprowadzony do podsumowania restore przed jego uruchomieniem.
Bootstrap records written to /var/lib/bacula/gani-desktop-dir.restore.1.bsr
The job will require the following
Volume(s) Storage(s) SD Device(s)
===========================================================================
Full-0001 File FileStorage
Volumes marked with "*" are online.
156 files selected to be restored.
Automatically selected Client: gani-desktop-fd
Using Catalog "MyCatalog"
Run Restore job
JobName: RestoreFiles
Bootstrap: /var/lib/bacula/gani-desktop-dir.restore.1.bsr
Where: /nonexistant/path/to/file/archive/dir/bacula-restores
Replace: always
FileSet: Full Set
Backup Client: gani-desktop-fd
Restore Client: gani-desktop-fd
Storage: File
When: 2011-01-15 09:35:51
Catalog: MyCatalog
Priority: 10
Plugin Options: *None*
OK to run? (yes/mod/no): mod
Również tutaj dostępna jest opcja modyfikacji parametrów zadania (po wpisaniu słowa mod). Modyfikuję lokalizację, do której mają zostać przywrócone dane na komputerze klienta poprzez ustawienie parametru Where na lokalizację /tmp:
OK to run? (yes/mod/no): mod
Parameters to modify:
1: Level
2: Storage
3: Job
4: FileSet
5: Restore Client
6: When
7: Priority
8: Bootstrap
9: Where
10: File Relocation
11: Replace
12: JobId
13: Plugin Options
Select parameter to modify (1-13): 9
Please enter path prefix for restore (/ for none): /tmp
Run Restore job
JobName: RestoreFiles
Bootstrap: /var/lib/bacula/gani-desktop-dir.restore.1.bsr
Where: /tmp
Replace: always
FileSet: Full Set
Backup Client: gani-desktop-fd
Restore Client: gani-desktop-fd
Storage: File
When: 2011-01-15 09:35:51
Catalog: MyCatalog
Priority: 10
Plugin Options: *None*
OK to run? (yes/mod/no): yes
Zadanie zostało uruchomione w tle. Po jego zakończeniu używam omówionej w poprzednim podrozdziale komendy messages w celu uzyskania podsumowania zadania:
*messages
15-Jan 09:37 gani-desktop-dir JobId 34: Start Restore Job RestoreFiles.2011-01-15_09.37.23_06
15-Jan 09:37 gani-desktop-dir JobId 34: Using Device "FileStorage"
15-Jan 09:37 gani-desktop-sd JobId 34: Ready to read from volume "Full-0001" on device "FileStorage" (/home/gani/bacula/urzadzenie1).
15-Jan 09:37 gani-desktop-sd JobId 34: Forward spacing Volume "Full-0001" to file:block 0:44885637.
15-Jan 09:37 gani-desktop-sd JobId 34: End of Volume at file 0 on device "FileStorage" (/home/gani/bacula/urzadzenie1), Volume "Full-0001"
15-Jan 09:37 gani-desktop-sd JobId 34: End of all volumes.
15-Jan 09:37 gani-desktop-dir JobId 34: Bacula gani-desktop-dir 5.0.2 (28Apr10): 15-Jan-2011 09:37:27
Build OS: x86_64-pc-linux-gnu ubuntu 10.10
JobId: 34
Job: RestoreFiles.2011-01-15_09.37.23_06
Restore Client: gani-desktop-fd
Start time: 15-Jan-2011 09:37:25
End time: 15-Jan-2011 09:37:27
Files Expected: 156
Files Restored: 156
Bytes Restored: 28,050,578
Rate: 14025.3 KB/s
FD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Restore OK
15-Jan 09:37 gani-desktop-dir JobId 34: Begin pruning Jobs older than 6 months .
15-Jan 09:37 gani-desktop-dir JobId 34: No Jobs found to prune.
15-Jan 09:37 gani-desktop-dir JobId 34: Begin pruning Jobs.
15-Jan 09:37 gani-desktop-dir JobId 34: No Files found to prune.
15-Jan 09:37 gani-desktop-dir JobId 34: End auto prune.
Podsumowanie
Kończąc trzecią i ostatnią część artykułu o konsoli bconsole chciałbym zachęcić czytelników do głębszego poznawania tytułowych "tajemnic bconsole". Taki też był mój cel do napisania tego artykułu, w którym spróbowałem jedynie zarysować wybrane możliwości bconsole. Więcej informacji na temat konsoli Bacula znaleźć można w oficjalnej dokumentacji Bacula pod adresem:
http://bacula.org/5.0.x-manuals/en/console/console/index.html
Powodzenia!