Bacula.pl

- rozwiązanie kopii zapasowych dla wymagających
Kategorie: WSZYSTKIE Newsy Artykuły Blog

Niezbędnik administratora Bacula cz.1 - narzędzie bls z wolumenami plikowymi

28 styczeń 2013, autor: Marcin Haba (gani)

news

Niniejszym artykułem chciałbym rozpocząć cykl artykułów, który zatytułowałem “Niezbędnik administratora Bacula”. Docelowo cykl ten będzie opisywał wszystkie samodzielne narzędzia Bacula, które wchodzą w skład podstawowego pakietu aplikacji Bacula. Każdy artykuł chciałbym poświęcić jednemu z tych narzędzi. Dziś będzie o narzędziu bls w połączeniu z wolumenami plikowymi.

Co to jest bls i do czego służy

Użytkownicy systemów unix’owych zapewne znają komendę linii poleceń o nazwie ls. Służy ona do listowania zawartości katalogów. Program bls również służy do listowania. Przy jego pomocy listuje się zawartość wolumenów Bacula (a dokładniej ich metadanych). Bls może operować zarówno na wolumenie plikowym (lub wolumenach) jak i na wolumenie taśmowym (lub wielu wolumenach). W tym artykule spróbuję przedstawić działanie bls na wolumenach plikowych.

Bls zazwyczaj przydaje się w sytuacji, gdy zachodzi potrzeba sprawdzenia zawartości wolumenu (np. w celu późniejszego wypakowania danych z wolumenu) lub w jakieś sytuacji awaryjnej np. utrata bazy danych Bacula.

Jak używać bls

Przed użyciem bls potrzebne będzie:

  • lokalizacja programu bls,
  • dostęp do wolumenu plikowego,
  • lokalizacja pliku konfiguracyjnego daemon’a magazynowania (bacula-sd.conf).

W moim środowisku Bacula powyżej wymienione parametry przedstawiają się następująco:

  • bls znajduje się w lokalizacji /usr/sbin/bls,
  • wolumen plikowy: /mnt/bacula-storage/file-volume-workstations-0001,
  • plik konfiguracyjny daemon’a magazynowania: /etc/bacula/bacula-sd.conf.

Na początek listuję zawartość wolumenu plikowego o nazwie file-volume-workstations-0001. Posłuży mi do tego poniższa komenda:

# /usr/sbin/bls -c /etc/bacula/bacula-sd.conf /mnt/bacula-storage/file-volume-workstations-0001

gdzie:

  • -c /etc/bacula/bacula-sd.conf - lokalizacja pliku konfiguracyjnego daemon’a magazynowana,
  • /mnt/bacula-storage/file-volume-workstations-0001 - lokalizacja wolumenu plikowego.

Wycinek otrzymanego listingu przedstawiam poniżej:

bls: butil.c:287 Using device: "/mnt/bacula-storage" for reading.
27-sty 19:40 bls JobId 0: Ready to read from volume "file-volume-workstations-0001" on device "FileStorage" (/mnt/bacula-storage).
bls JobId 2: lrwxrwxrwx 1 root root 8 2013-01-22 17:45:31 /usr/sbin/hpljP1008 -> hplj1000
bls JobId 2: -rwxr-xr-x 1 root root 3925 2013-01-22 17:57:12 /usr/sbin/ufw
bls JobId 2: -rwxr-xr-x 1 root root 12872 2013-01-22 17:45:31 /usr/sbin/ispell-autobuildhash
bls JobId 2: -rwxr-xr-x 1 root root 14280 2013-01-27 13:29:14 /usr/sbin/postfix
bls JobId 2: -rwxr-xr-x 1 root root 10480 2013-01-22 17:45:31 /usr/sbin/tunelp
bls JobId 2: -rwxr-xr-x 1 root root 754088 2013-01-22 17:45:31 /usr/sbin/grub-probe
bls JobId 2: -r-xr-sr-x 1 root postdrop 14328 2013-01-27 13:29:26 /usr/sbin/postdrop
bls JobId 2: -rwxr-xr-x 1 root root 6232 2013-01-22 17:45:31 /usr/sbin/cracklib-unpacker
bls JobId 2: -rwxr-xr-x 1 root root 1012504 2013-01-22 17:45:31 /usr/sbin/NetworkManager
bls JobId 2: -rwxr-xr-x 1 root root 40272 2013-01-27 13:29:18 /usr/sbin/loaderinfo
bls JobId 2: -rwxr-xr-x 1 root root 36248 2013-01-22 17:45:31 /usr/sbin/irqbalance
bls JobId 2: -rwxr-xr-x 1 root root 7744 2013-01-22 17:45:31 /usr/sbin/update-catalog
bls JobId 2: lrwxrwxrwx 1 root root 7 2013-01-22 17:45:31 /usr/sbin/delgroup -> deluser
bls JobId 2: -rwxr-xr-x 1 root root 29624 2013-01-22 17:45:31 /usr/sbin/pwunconv
bls JobId 2: -rwxr-xr-x 1 root root 34663 2013-01-22 17:45:31 /usr/sbin/grub-install
bls JobId 2: -rwxr-xr-x 1 root root 26572 2013-01-22 17:45:31 /usr/sbin/cups-genppdupdate
… itd

W tym miejscu chciałbym wyjaśnić dwie kwestie. Pierwsza z nich dotyczy podawania lokalizacji pliku konfiguracyjnego daemon’a magazynowania. Zazwyczaj, gdy składniki Bacula są instalowane z pakietów binarnych, to podawanie lokalizacji pliku bacula-sd.conf (parametr -c) może być opcjonalne. Dzieje się tak, gdyż opiekunowie pakietów binarnych dystrybucji często kompilują składniki Bacula w ten sposób, że programy Bacula zawierają w sobie poprawną informację o tym, gdzie szukać odpowiednich plików konfiguracyjnych. Z tego powodu użytkownicy instalujący Bacula z pakietów binarnych zazwyczaj mogą po prostu wydać komendę:

# /usr/sbin/bls /mnt/bacula-storage/file-volume-workstations-0001

która zwróci taki sam listing jak komenda z podaną lokalizacją pliku konfiguracyjnego serwisu bacula-sd:

bls: butil.c:287 Using device: "/mnt/bacula-storage" for reading.
27-sty 19:56 bls JobId 0: Ready to read from volume "file-volume-workstations-0001" on device "FileStorage" (/mnt/bacula-storage).
bls JobId 2: lrwxrwxrwx 1 root root 8 2013-01-22 17:45:31 /usr/sbin/hpljP1008 -> hplj1000
bls JobId 2: -rwxr-xr-x 1 root root 3925 2013-01-22 17:57:12 /usr/sbin/ufw
bls JobId 2: -rwxr-xr-x 1 root root 12872 2013-01-22 17:45:31 /usr/sbin/ispell-autobuildhash
bls JobId 2: -rwxr-xr-x 1 root root 14280 2013-01-27 13:29:14 /usr/sbin/postfix
bls JobId 2: -rwxr-xr-x 1 root root 10480 2013-01-22 17:45:31 /usr/sbin/tunelp
bls JobId 2: -rwxr-xr-x 1 root root 754088 2013-01-22 17:45:31 /usr/sbin/grub-probe
bls JobId 2: -r-xr-sr-x 1 root postdrop 14328 2013-01-27 13:29:26 /usr/sbin/postdrop
bls JobId 2: -rwxr-xr-x 1 root root 6232 2013-01-22 17:45:31 /usr/sbin/cracklib-unpacker
bls JobId 2: -rwxr-xr-x 1 root root 1012504 2013-01-22 17:45:31 /usr/sbin/NetworkManager
bls JobId 2: -rwxr-xr-x 1 root root 40272 2013-01-27 13:29:18 /usr/sbin/loaderinfo
bls JobId 2: -rwxr-xr-x 1 root root 36248 2013-01-22 17:45:31 /usr/sbin/irqbalance
bls JobId 2: -rwxr-xr-x 1 root root 7744 2013-01-22 17:45:31 /usr/sbin/update-catalog
bls JobId 2: lrwxrwxrwx 1 root root 7 2013-01-22 17:45:31 /usr/sbin/delgroup -> deluser
bls JobId 2: -rwxr-xr-x 1 root root 29624 2013-01-22 17:45:31 /usr/sbin/pwunconv
bls JobId 2: -rwxr-xr-x 1 root root 34663 2013-01-22 17:45:31 /usr/sbin/grub-install
bls JobId 2: -rwxr-xr-x 1 root root 26572 2013-01-22 17:45:31 /usr/sbin/cups-genppdupdate
…...ciach

Druga kwestia, choć bardzo oczywista, to myślę, że jednak warta jest wspomnienia - lokalizacja bls. W zawartych powyżej wywołaniach posługuję się odwołaniem do bls poprzez lokalizację bezwzględną czyli:

/usr/sbin/bls

Jako, że zazwyczaj lokalizacja /usr/sbin/ wchodzi w skład zmiennej systemowej PATH, to można ją pominąć i wywołać bls bez lokalizacji:

# bls /mnt/bacula-storage/file-volume-workstations-0001

a powłoka systemowa sama znajdzie i dopasuje lokalizację programu bls. Jeśli jednak lokalizacja bls nie znajduje się w zasięgu lokalizacji zapisanych w zmiennej PATH, to podanie lokalizacji jest konieczne.

Na powyższych listingach można zauważyć kilka przydatnych właściwości plików backupu. Przyjrzyjmy się jednej z linii listingu:

bls JobId 2: -rwxr-xr-x   1 root     root            3925 2013-01-22 17:57:12  /usr/sbin/ufw

Można z niego wyczytać, że na listowanym przez bls wolumenie znajduje się plik o nazwie ufw (/usr/sbin/ufw), który został zapisany w backupie o identyfikatorze 2 (JobId 2). Plik ten ma uprawnienia 755 (-rwxr-xr-x). Jego właścicielem jest użytkownik root, grupa dla tego pliku to również root. Rozmiar natomiast to prawie 4kB (3925) a czas modyfikacji pliku MTIME to 2013-01-22 17:57:12. Jak dla mnie, to sporo informacji, które mogą okazać się ważne (a może nawet bezcenne) w awaryjnych sytuacjach.

Program bls a plik bootstrap

Program bls może również dostarczać informacje, które dadzą się wykorzystać przy tworzeniu pliku bootstrap. Jedną z nich już poznaliśmy - identyfikator backupu. W tym celu do komendy bls potrzeba dodać przełącznik -v (ang. verbose) w następujący sposób:

# bls -v -c /etc/bacula/bacula-sd.conf /mnt/bacula-storage/file-volume-workstations-0001

Oto wycinek jednej z linii takiego listingu:

FileIndex=13 VolSessionId=2 VolSessionTime=1359291385 Stream=1 DataLen=88
bls JobId 3: -rwxr-xr-x 1 root root 2390 2013-01-27 14:02:05 /usr/sbin/split-logfile

Widać tu więcej parametrów do zbudowania pliku bootstrap: FileIndex, VolSessionId, VolSessionTime.

Oto przykładowy plik bootstrap dla pliku z przedstawionego powyżej listingu /usr/sbin/split-logfile:

Volume="file-volume-workstations-0001"
VolSessionId=2
VolSessionTime=1359291385
FileIndex=13

Wpisuję powyższą zawartość do pliku bootstrap w lokalizacji:

/tmp/moj_plik.bsr

Ponieważ program bls może wykorzystywać plik bootstrap do zawężenia kryteriów listowania (przełącznik -b), to użyję pliku bootstrap /tmp/moj_plik.bsr do wylistowania pliku z poprzedniego listingu o nazwie /usr/sbin/split-logfile. Posłuży mi do tego celu komenda:

# bls -b /tmp/moj_plik.bsr -c /etc/bacula/bacula-sd.conf /mnt/bacula-storage

Zwrócony listing wygląda następująco:

bls: butil.c:287 Using device: "/mnt/bacula-storage" for reading.
27-sty 20:54 bls JobId 0: Ready to read from volume "file-volume-workstations-0001" on device "FileStorage" (/mnt/bacula-storage).
bls JobId 3: -rwxr-xr-x 1 root root 2390 2013-01-27 14:02:05 /usr/sbin/split-logfile
1 files found.

Jest to dokładnie ten sam plik co plik z wycinkiu listingu z opcji -v, lecz tym razem “wyłuskany” przez bls z użyciem pliku bootstrap.

UWAGA!

W tym konkretnym przykładzie z użyciem pliku bootstrap jako ostatni parametr podałem lokalizację urządzenia plikowego czyli miejsce, gdzie moje urządzenie plikowe składuje woluminy Bacula.

/mnt/bacula-storage

Nie podałem natomiast pełnej lokalizacji woluminu (lokalizacja urządzenia plikowego + nazwa pliku z woluminem):

/mnt/bacula-storage/file-volume-workstations-0001

Wywołanie bls z lokalizacją urządzenia plikowego zamiast wywołania z pełną lokalizacją woluminu podyktowane jest tym, że nazwa przeszukiwanego woluminu znajduje się już w pliku bootstrap. Co więcej, w pliku bootstrap można umieścić więcej woluminów do przeszukania. Wynika to z funkcjonalności operowania na wielu woluminach za jednym wywołaniem, w jaką to funkcjonalność wyposażony jest program bls.

Obsługa wielu woluminów plikowych przez bls

Program bls używany z plikiem bootstrap to nie jedyny sposób na to, aby przy pomocy jednego wywołania komendy przeszukać kilka woluminów plikowych. Do wylistowania danych z kilku woluminów plikowych może posłużyć opcja -V, po której podaje się nazwy woluminów oddzielone znakiem | czyli tzw. pipe.

Przykład

Komenda do  wylistowania danych z wolumenów plikowych o nazwach: aaa, bbb i ccc, może wyglądać jak poniżej:

 # bls -c /etc/bacula/bacula-sd.conf -V “aaa|bbb|ccc” /lokalizacja/urzadzenia/plikowego.

Nic również nie stoi na przeszkodzie do tego, aby w przełączniku -V podać nazwę tylko jednego wolumenu. W takiej sytuacji znak pipe jest niepotrzebny. Przykład dla wolumenu o nazwie aaa umieszczam poniżej.

# bls -c /etc/bacula/bacula-sd.conf -V “aaa” /lokalizacja/urzadzenia/plikowego.

UWAGA!

Przy wykorzystaniu przełącznika -V do podania programowi bls listę wolumenów do przeszukania - podobnie jak w przypadku pliku bootstrap - jako ostatni parametr podawana jest lokalizacja urządzenia plikowego. Ważne jest, aby lokalizacja ta wyglądała dokładnie tam samo jak ta zdefiniowana w pliku konfiguracyjnym bacula-sd.conf w sekcji Device. Jeśli sekcja Device wygląda tak:

Device {
Name = FileStorage
Media Type = File
Archive Device = /mnt/bacula-storage
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
}

to ostatnim parametrem do użycia tego urządzenia w wywołaniu programu bls będzie lokalizacja:

/mnt/bacula-storage

Piszę o tym, gdyż w zwyczaju użytkowników powłok systemowych z funkcją dopełniania nazw plików i katalogów jest dopełnianie nazwy urządzenia plikowego. W wyniku wywołania dopełniania otrzymanym katalogiem urządzenia plikowego będzie:

/mnt/bacula-storage/

zamiast poprawnego (czyt. zgodnego z katalogiem użytym w zasobie Device storage daemon’a):

/mnt/bacula-storage

Subtelna różnica z ostatnim znakiem lokalizacji (znak slash /) sprawi, że zamiast wylistować zawartość wolumenu plikowego, otrzyma się komunikat podobny do tego:

bls: butil.c:283 Could not find device "/mnt/bacula-storage/" in config file /etc/bacula/bacula-sd.conf.
28-sty 20:45 bls JobId 0: butil.c:169 Cannot find device "/mnt/bacula-storage/" in config file /etc/bacula/bacula-sd.conf.

Reguła ta dotyczy wszystkich sytuacji, gdy w komendzie bls podaje się lokalizację urządzenia plikowego.

Listy dołączeń i listy wykluczeń

Jeśli w backupie (lub w backupach) na wolumenie znajduje się duża ilość plików liczona np. w milionach, to nie jest łatwym zadaniem ogarnięcie listingu uzyskanego przy pomocy bls. Można oczywiście przekierować strumień standardowego wyjścia z bls do pliku i wyszukać interesujące pliki przy użyciu funkcji wyszukiwania edytora tekstowego. Alternatywnie do operacji na dużym listingu można również zaprzęgnąć program grep. Jeśli natomiast znamy nazwy szukanych plików lub chociaż znamy fragmenty nazw poszukiwanych plików na wolumenie, to wskazane do takiego wyszukiwania jest użycie listy dołączeń (ang. include list).

Zakładam, że chciałbym znaleźć na wolumenie o nazwie:

file-volume-workstations-0001

wszystkie pliki backupu  w lokalizacji /usr/sbin/, które zaczynają się od liter “cu” oraz takie, które zaczynają się na literę “s” a kończą na literę “t”.

Najpierw tworzę plik listy dołączeń z następującą zawartością:

/usr/sbin/cu*
/usr/sbin/s*t

i zapisuję go pod nazwą:

/tmp/include

Następnie podaję plik include w przełączniku -i:

# bls -i /tmp/include -c /etc/bacula/bacula-sd.conf -V "file-volume-workstations-0001" /mnt/bacula-storage

W wyniku powyższego wywołania bls otrzymuję następujący listing:

bls: butil.c:287 Using device: "/mnt/bacula-storage" for reading.
28-sty 20:48 bls JobId 0: Ready to read from volume "file-volume-workstations-0001" on device "FileStorage" (/mnt/bacula-storage).
bls JobId 2: -rwxr-xr-x 1 root root 26572 2013-01-22 17:45:31 /usr/sbin/cups-genppdupdate
bls JobId 2: lrwxrwxrwx 1 root root 10 2013-01-22 17:55:48 /usr/sbin/cupsreject -> cupsaccept
bls JobId 2: -rwxr-xr-x 1 root root 10240 2013-01-22 17:55:48 /usr/sbin/cupsaccept
bls JobId 2: -rwxr-xr-x 1 root root 436808 2013-01-22 17:55:49 /usr/sbin/cupsd
bls JobId 2: -rwxr-xr-x 1 root root 10240 2013-01-22 17:55:48 /usr/sbin/cupsctl
bls JobId 2: -rwxr-xr-x 1 root root 40400 2013-01-27 13:29:18 /usr/sbin/scsieject
bls JobId 2: -rwxr-xr-x 1 root root 10240 2013-01-22 17:55:48 /usr/sbin/cupsaddsmb
bls JobId 2: -rwxr-xr-x 1 root root 26928 2013-01-22 17:55:49 /usr/sbin/cupsfilter
bls JobId 2: lrwxrwxrwx 1 root root 10 2013-01-22 17:55:48 /usr/sbin/cupsenable -> cupsaccept
bls JobId 2: -rwxr-xr-x 1 root root 1867 2013-01-22 17:45:31 /usr/sbin/select-default-wordlist
bls JobId 2: lrwxrwxrwx 1 root root 10 2013-01-22 17:55:48 /usr/sbin/cupsdisable -> cupsaccept

Na powyższym listingu znajdują się wszystkie pliki backupu  z lokalizacji /usr/sbin/ zaczynające się od liter “cu” oraz pliki zaczynające się od litery “s” a kończące się na literę “t”.

Listę wykluczeń (ang. exclude list) dla programu bls można tworzyć w taki sam sposób jak omówioną w tym podrozdziale listę dołączeń. Naturalnie do pliku listy wykluczeń wpisuje się te lokalizacje plików, które nie chce się widzieć na listingu (odwrotność list dołączeń).

Dla podania pliku z wykluczonymi lokalizacjami plików służy przełącznik -e, np. dla pliku wykluczeń o nazwie:

/tmp/exclude

komenda bls może wyglądać następująco:

# bls -e /tmp/exclude -c /etc/bacula/bacula-sd.conf -V "file-volume-workstations-0001" /mnt/bacula-storage

Lista backupów na woluminie

Jeśli ciekaw jesteś, drogi czytelniku tego, w jaki sposób sprawdzić, które backupy znajdują się na woluminie plikowym, to możesz użyć do tego celu przełącznika -j. Wygląda to mniej więcej tak:

# bls -j -c /etc/bacula/bacula-sd.conf -V file-volume-workstations-0001 /mnt/bacula-storage
bls: butil.c:287 Using device: "/mnt/bacula-storage" for reading.
28-sty 21:14 bls JobId 0: Ready to read from volume "file-volume-workstations-0001" on device "FileStorage" (/mnt/bacula-storage).
Rekord Volume : File:blk=0:231 SessId=1 SessTime=1359291385 JobId=0 DataLen=196
Rekord Rozpocznij Sesję Zadania: File:blk=0:64743 SessId=1 SessTime=1359291385 JobId=2
Zadanie=SpeedstarJob.2013-01-27_13.58.07_03 Data=27-sty-2013 13:59:56 Poziom=F Typ=B
Rekord Zakończ Sesję Zadania: File:blk=0:13406983 SessId=1 SessTime=1359291385 JobId=2
Date=27-sty-2013 13:59:56 Level=F Type=B Files=271 Bytes=13,388,362 Errors=0 Status=T
Rekord Rozpocznij Sesję Zadania: File:blk=0:13471495 SessId=2 SessTime=1359291385 JobId=3
Zadanie=SpeedstarJob.2013-01-27_20.05.00_07 Data=27-sty-2013 20:05:03 Poziom=D Typ=B
Rekord Zakończ Sesję Zadania: File:blk=0:13487216 SessId=2 SessTime=1359291385 JobId=3
Date=27-sty-2013 20:05:03 Level=D Type=B Files=16 Bytes=79,339 Errors=0 Status=T
Rekord Rozpocznij Sesję Zadania: File:blk=0:13551728 SessId=3 SessTime=1359291385 JobId=4
Zadanie=BackupCatalog.2013-01-27_20.10.00_08 Data=27-sty-2013 20:10:03 Poziom=F Typ=B
Rekord Zakończ Sesję Zadania: File:blk=0:13576560 SessId=3 SessTime=1359291385 JobId=4
Date=27-sty-2013 20:10:03 Level=F Type=B Files=1 Bytes=88,830 Errors=0 Status=T
Rekord Rozpocznij Sesję Zadania: File:blk=0:13577010 SessId=1 SessTime=1359389474 JobId=5
Zadanie=SpeedstarJob.2013-01-28_20.05.00_02 Data=28-sty-2013 20:05:02 Poziom=I Typ=B
Rekord Zakończ Sesję Zadania: File:blk=0:13577010 SessId=1 SessTime=1359389474 JobId=5
Date=28-sty-2013 20:05:02 Level=I Type=B Files=0 Bytes=0 Errors=0 Status=T
Rekord Rozpocznij Sesję Zadania: File:blk=0:13641522 SessId=2 SessTime=1359389474 JobId=6
Zadanie=BackupCatalog.2013-01-28_20.10.00_03 Data=28-sty-2013 20:10:03 Poziom=F Typ=B
Rekord Zakończ Sesję Zadania: File:blk=0:13671986 SessId=2 SessTime=1359389474 JobId=6
Date=28-sty-2013 20:10:03 Level=F Type=B Files=1 Bytes=94,462 Errors=0 Status=T

Na powyższym listingu widać pięć backupów: trzy backupy zadania o nazwie SpeedstarJob i dwa backupy zadania o nazwie BackupCatalog. Jest tutaj również kilka mogących przydać się wartości jak np. status zadania (Status=F), typ backupu (Poziom=F) czy identyfikator zadania (JobID=6).

Etykieta wolumenu plikowego

Ostatnią z omawianych w artykule funkcjonalności programu bls jest funkcjonalność wyświetlania wartości, które zapisane są w etykiecie wolumenu. Do ich wyświetlania służy przełącznik -L.

# bls -L -c /etc/bacula/bacula-sd.conf -V file-volume-workstations-0001 /mnt/bacula-storage
bls: butil.c:287 Using device: "/mnt/bacula-storage" for reading.
28-sty 21:25 bls JobId 0: Ready to read from volume "file-volume-workstations-0001" on device "FileStorage" (/mnt/bacula-storage).

Etykieta Wolumenu:
Id : Bacula 1.0 immortal
VerNo : 11
VolName : file-volume-workstations-0001
PrevVolName :
VolFile : 0
LabelType : VOL_LABEL
LabelSize : 196
PoolName : Workstations-full
MediaType : File
PoolType : Backup
HostName : speedstar
Etykieta daty zapisana: 27-sty-2013 13:59

Podsumowanie

Kończąc pierwszą część “Niezbędnika administratora Bacula” chciałbym zachęcić czytelników do własnych eksperymentów i ćwiczeń z narzędziem bls.

Już teraz zapraszam do lektury drugiej części “Niezbędnika administratora Bacula”, w której postaram się przedstawić użycie bls z taśmami magnetycznymi. Powinna ona ukazać się niebawem.

 


Ta strona używa plików cookies (niezbędnych do prawidłowego działania oraz analitycznych). Odmów Wybierz ciasteczka Zezwól na wszystkie (więcej informacji)