praktyka
Serwer kopii zapasowych
46
październik 2007
praktyka
Serwer kopii zapasowych
47
www.lpmagazine.org
lin
ux
@
so
ftw
ar
e.
co
m
.p
l
D
ookoła nas, czyli w szkołach, bankach, urzę-
dach, stacjach benzynowych czy samocho-
dach znajdują się dziesiątki i setki urzą-
dzeń, zbierających i przetwarzających nie-
zliczone ilości danych, a w tym nasz domowy komputer
i laptop, na którym pracujemy. Dane są gromadzone na
różnego rodzaju nośnikach, w tym również na dyskach
twardych. Ich utrata może wiązać się z koniecznością
powtórzenia jakiejś operacji, np. napisania od nowa
podania o urlop, albo w ostateczności, będą poważne
kłopoty, a nawet bankructwo firmy, gdy utracimy pro-
jekt, nad którym spędziliśmy 4 miesiące lub kluczowe
dane naszej firmy.
Czy dane zapisane na dysku twardym naszego lapto-
pa są w 100 % bezpieczne? Statystyki awaryjności pokazu-
ją, że niestety nie. W przypadku urządzeń przenośnych,
mimo użycia bardzo odpornych na urazy podzespołów,
dane na dyskach twardych są wyjątkowo zagrożone. Cią-
głe przenoszenie, wstrząsy, upadek, kradzież urządze-
nia lub przypadkowe skasowanie może pozbawić nas je-
dynej kopii danych. Warto już dziś pomyśleć o tym, by re-
gularnie tworzyć kopie zapasowe newralgicznych danych,
w myśl powiedzenia: lepsza nieaktualna kopia niż jej
całkowity brak. Pozwoli to wyjść obronną ręką z opresji,
jeśli nastąpi jedna z wyżej wymienionych sytuacji.
Spośród wielu dostępnych programów do archiwiza-
cji, tych płatnych i bezpłatnych, możemy coś wybrać dla
siebie. Jednak wiele z nich będzie nam proponować archi-
wizację w oparciu o dedykowane serwery, urządzenia
taśmowe, którymi nie dysponujemy lub stosy płyt CD/
DVD, w których możemy się łatwo pogubić. Potrzebujemy
czegoś łatwego w obsłudze, co po jednorazowej konfiguracji
nie będzie nas absorbować podczas normalnej pracy i bę-
dzie się wykonywać automatycznie oraz wykorzysta to
czym dysponujemy, np. domowy komputer z dużym
dyskiem twardym lub serwer z macierzą dyskową RAID.
Dysponując odrobiną Linuksowej wiedzy tajemnej może-
my samodzielnie napisać skrypty, które codziennie będą
czuwać nad wykonaniem kopii zapasowej, gdy my tymcza-
sem, będziemy mogli przeznaczyć zyskany czas na pracę
lub odpoczynek.
W niniejszym artykule pragnę zaprezentować Państwu
przykładowe skrypty archiwizujące napisane w języku
powłoki bash, które pokażą, jak szybko i prosto można na-
Serwer kopii
zapasowych
W XXI wieku komputer staje się podstawowym narzędziem człowieka, bez którego nie można
wyobrazić sobie istnienia we współczesnym społeczeństwie. Co raz więcej gospodarstw domowych,
około połowa, może poszczycić się przynajmniej jednym komputerem stacjonarnym lub laptopem,
a jedna trzecia ma dostęp do Internetu, nie mówiąc już o współczesnych firmach.
Sławomir Skrzyniarz
praktyka
Serwer kopii zapasowych
46
październik 2007
praktyka
Serwer kopii zapasowych
47
www.lpmagazine.org
pisać wygodne narządzie, automatyzujące
proces archiwizacji – od wykonania pierw-
szej kopii zapasowej, aż po usunięcie nie-
aktualnych już archiwów.
Ogólna zasada
funkcjonowania
systemu tworzenia kopii
zapasowej
System archiwizacji będzie się składał
z laptopa z Linuksem, na którym są prze-
chowywane krytyczne, z punktu widzenia
bezpieczeństwa dane oraz komputera kla-
sy PC, lub serwera z dużym dyskiem – oczy-
wiście działającego pod kontrolą systemu
Linux. Całość będzie połączona ze sobą za
pomocą kabla sieciowego RJ-45 (komputer
– komputer) lub dowolnej przewodowej lub
bezprzewodowej sieci wewnętrznej, Inter-
netu. Oczywiście połączenie może być zrea-
lizowane z wykorzystaniem dowolnego
medium, jedynie z zastrzeżeniem, że urzą-
dzenia muszą mieć przydzielone IP i będą
mogły nawiązywać połączenia TCP. Połą-
czenie pomiędzy serwerem a laptopem bę-
dzie zrealizowane przez szyfrowany tunel
ssh.
Wszystkie, powyżej przedstawione, zało-
żenia można oczywiście zmienić, wprowa-
dzając korekty do skryptów i jednocześnie
dostosowując cały system archiwizacji do
własnych potrzeb.
Skrypty wchodzące
w skład systemu kopii
zapasowych
W skład systemu archiwizacji wchodzą trzy
skrypty; pierwszy to kopia_zapasowa.sh i bę-
dzie umieszczony na laptopie, na którym
są dane, przeznaczone do archiwizacji.
Przy jego pomocy skonfigurujemy tunel
szyfrowania, przez który będzie odbywać
się transmisja danych oraz wykonamy co-
dzienną kopię różnicową naszych plików.
W tym przykładzie założono, że kopia
zapasowa będzie wykonywana raz dzien-
nie, a osiągniemy to, uruchamiając skrypt
z poziomu demona zadań okresowych cron,
co określony czas, np. co 10 minut. Jeżeli
okaże się, że serwer jest niedostępny, bo
trwa archiwizowanie danych lub istnieje
archiwum na dany dzień, to skrypt zakoń-
czy działanie ze stosownym komunikatem
opisującym przyczynę.
Drugi skrypt nazywa się czysciciel.sh
i będzie wykorzystywany na serwerze do
usuwania zbyt starych kopii zapasowych,
zapobiegając jednocześnie przepełnieniu
dysku.
Trzeci skrypt to ssh-add.sh, a będzie uru-
chamiany podczas każdego logowania do
środowiska graficznego na laptopie i będzie
czuwał nad tym, by klucz szyfrujący RSA był
gotowy do użycia.
Konfiguracja serwera
archiwizacji
Wymagane oprogramowanie
Konfigurację serwera należy rozpocząć od
zainstalowania serwera openssh, a można to
zrobić w Mandrivie, za pomocą polecenia
urpmi openssh-server
lub zainstalować
pakiet openssh-server, za pomocą dowolnego
menadżera pakietów, dostępnego w syste-
mie, np. apt-get, yum. Ponadto na obu ma-
szynach przyda się pakiet openssh-clients,
zawierający m.in. program ssh, ssh-add, ssh-
agent i scp oraz openssh, zawierający ssh-
keygen. Skrypt archiwizujący opiera swoje
działanie na programie rsync, tak więc nale-
ży zainstalować pakiet o tej właśnie nazwie.
Jeżeli będziemy korzystać z dynamicznego
przydzielania adresów IP, przyda się rów-
nież pakiet dhcp-server.
Przygotowanie miejsca
na archiwa
Przed przystąpieniem do wykonania pierw-
szej kopii zapasowej, należy założyć kon-
to nowemu użytkownikowi, np. za pomo-
cą polecenia
adduser slawek
i nadać hasła
passwd slawek
. Następny krok to założenie,
w jego katalogu domowym lub na innym
dysku, katalogu do przechowywania archi-
wizacji, np.
mkdir /mnt/backup/laptop
,
którego właścicielem będzie ów użytkow-
nik
chown slawek:slawek /mnt/backup/
laptop
. Jeżeli na potrzeby archiwizacji
przeznaczymy osobny dysk i będzie z nie-
go korzystało niewielu użytkowników, to
warto włączyć w nim zaawansowane oszczę-
dzanie energii, które pozwoli wyłączyć-
talerze dysku podczas bezczynności, zmniej
szając tym samym poziom zużycia ener-
gii i emitowanego hałasu oraz ilość wy-
dzielanego ciepła. Do zmiany ustawień
oszczędzania energii posłużyć może prog-
ram hdparm. Jednak, aby ustawić wyłącza-
nie się dysku, np. po dwudziestu minutach,
to należy wydać polecenie
hdparm -S 240
/dev/hdc
, gdzie 240 jest to liczba, ozna-
czająca wielokrotność 5 sekund, a
/dev/
hdc
to nazwa dysku, przeznaczonego do
przetrzymywania kopii zapasowych. Usta-
wienie powinno działać przy każdym uru-
chomieniu systemu, a żeby tak było, to na-
leży dodać polecenie na końcu pliku: /etc/
rc.d/rc lub do innego skryptu, uruchamianego
podczas startu systemu. Przy dobieraniu
czasu bezczynności, po którym wyłączą się
talerze, należy wziąć pod uwagę to, że zbyt
częste uruchamianie i zatrzymywanie tale-
rzy może doprowadzić do szybszego zuży-
cia dysku, a sam proces uruchamiania, w nie-
których przypadkach może opóźnić proces
zapisu i odczytu nawet o 30 sekund.
Konfiguracja serwera openssh
W większości przypadków domyślna konfi-
guracja serwera openssh będzie działać prawi-
dłowo i nie trzeba nic zmieniać. Należy jednak
sprawdzić, czy w pliku /etc/ssh/sshd_config
parametr
PubkeyAuthentication
ustawiony
jest na
yes
. Jeżeli konfiguracja wymaga zmia-
ny, to po jej wprowadzeniu należy zrestar-
tować serwer sshd przez wywołanie polecenia
/etc/init.d/sshd restart
.
Konfiguracja serwera dhcpd
Jeżeli w sieci, w której działa serwer archi-
wizacji, nie ma serwera dhcp, przydziela-
jącego dynamicznie adresy IP, a nasz lap-
topkorzysta z innych sieci, w których ta
usługa jest dostępna, to warto ją włączyć na
najbliższym routerze w naszej sieci albo,
w przypadku braku routera, na serwerze
archiwizacji. Pozwoli to wyeliminować pro-
blem ręcznej konfiguracji naszej karty
sieciowej przy każdej próbie podłączenia do
sieci, a także ograniczy dodatkowe czyn-
ności, związane z procesem archiwizacji,
jedynie do podpięcia kabla sieciowego do
naszego notebooka.
Konfiguracja bramy ogniowej
na serwerze
Każdy komputer, serwer, desktop lub laptop
powinien mieć włączoną bramę ogniową,
zwiększając ty samym bezpieczeństwo ser-
wera oraz całej sieci. W naszym przypadku
serwer będzie świadczył usługę ssh oraz dhcp,
w związku z czym ruch skierowany do por-
tów 22, za pomocą protokołu tcp i portu 67
na udp, powinien być przepuszczany, aby
wszystko działało prawidłowo. Dodatkowo
należy włączyć opcję odpowiadania na pakie-
ty ping, gdyż za pomocą pingowania spraw-
dzana jest dostępność serwera archiwizacji
w skrypcie
kopia_zapasowa.sh.
Konfiguracja skryptu czysciciel.sh
Skrypt
czysciciel.sh
należy skopiować do ka-
talogu zdefiniowanego w pliku
kopia_zapa-
sowa.sh
w zmiennej
$katalog_zdalny
, np.
/mnt/backup/laptop i zmienić właściciela pli-
ku na takiego samego jak katalog, w którym
48
październik 2007
praktyka
Serwer kopii zapasowych
49
www.lpmagazine.org
praktyka
Serwer kopii zapasowych
#!/bin/bash
# Program do wykonywania kopii zapasowej danych
# z laptopa
# na PC (serwer kopii zapasowej)
# Autor: Sławomir Skrzyniarz <diodak@gmail.com>
# Licencja: GPL v2
#
# Ustawienia programu
wersja_programu='0.5' # Wersja programu
serwer='10.1.1.5' # adres serwera kopii zapasowej
uzytkownik='slawek' # użytkownik na serwerze kopii
zapasowej
ilosc_prob=5 # Ilość pakietów (pingów) wysłanych w celu
sprawdzenia, czy serwer kopii zapasowej jest dostępny
do_skasowania='/home/*/.kadu/kadu.conf.xml.backup.* /
home/*/.thumbnails/large/* /home/*/.thumbnails/normal/
* /home/*/.mozilla/firefox/*/Cache/* /home/*/.opera/
cache4/* /home/*/.opera/cacheOp/* /home/*/.opera/
thumbnails/* /home/*/.gqview/thumbnails/*'
# Katalogi do opróżnienia przed wykonaniem kopii
# zapasowej
# do_archiwizacji='/etc /home'
# Katalogi podlegające archiwizacji oddzielone spacją
katalog_zdalny='/mnt/backup/laptop'
# Katalog w którym będą składowane kopie zapasowe
# na serwerze
pliki_wykluczone='*~ *.tmp' # Pliki, które nie zostaną
zarchiwizowane
ile_kopii=14 # Z ilu dni zostawić kopię
max_rozmiar=22000000000 # Maksymalny rozmiar kopii
zapasowej w bajtach (musi być o około 20% mniejsza niż
przydzielona pojemność dyskowa)
moj_home=$(cat /etc/passwd|grep $(whoami)|awk -
F ':' '{print $6}') # Katalog domowy użytkownika
uruchamiającego niniejszy skrypt - nie zmieniać
# Właściwy program
if [[ $(whoami) != 'root' ]] ; then
echo 'Uruchom skrypt z uprawnieniami
administratora'; exit
fi
inicjacja() {
read -p 'Czy chcesz logować się z jednorazowym
podawaniem hasła do klucza RSA (t/n): ' decyzja
case $decyzja in
't')
echo 'Podaj hasło zabezpieczające nowego
klucza [Enter]'
ssh-keygen
# Generacja unikalnego klucza szyfrowania
echo 'Podaj hasło potrzebne do zalogowania
na serwerze kopii zapasowej'
pliktemp=$(mktemp /tmp/backup.XXXXXXXX)
# Generacja losowej nazwy
scp $uzytkownik@$serwer:/home/$uzytkownik/.
ssh/authorized_keys $pliktemp
# kopiowanie między dwoma komputerami przez tunel ssh
if [[ $(cat $pliktemp|grep
$(whoami)'@'$(hostname)) != '' ]] ; then
echo 'Funkcja została włączona już wcześniej.'
else
cat $moj_home/.ssh/id_rsa.pub >> $pliktemp
echo 'Podaj ponownie hasło potrzebne do
zalogowania na serwerze kopii zapasowej'
scp $pliktemp $uzytkownik@$serwer:/home/
$uzytkownik/.ssh/authorized_keys
fi
/bin/rm $pliktemp; echo ''
;;
'n'|*)
echo -e 'Za każdym razem będziesz musiał/-a podać
hasło przy wykonywaniu kopii zapasowej.\nUniemożliwi to
zastosowanie tego skryptu jako demona systemowego.'
;;
esac
}
spr_serwer() {
# funkcja sprawdza dostępność komputera przechowującego
archiwizacje
spr_serwer() { # funkcja sprawdza dostępność
komputera przechowującego archiwizacje
echo ‘Sprawdzanie dostępności serwera kopii
zapasowej...’
routing=$(/sbin/ip route show|grep default|awk -F ‘
‘ ‘{print $2}’)
if [[ $routing == ‘via’ ]] ; then
if ( ping -c $ilosc_prob -q $serwer >
/dev/null); then
stan_serwera=’0’ # Serwer dostępny
else stan_serwera=’1’; fi
else stan_serwera=’1’; fi
return $stan_serwera
}
# Serwer dostepny
else stan_serwera='1'; fi
return $stan_serwera
}
czysc_tmpy() { # funkcja czyszcząca dysk z plików
tymczasowych
echo "Kasowanie niepotrzebnych plików..."
licznik_kasowania=0
for kasuj in $do_skasowania; do
if [ -f $kasuj ]; then
echo 'Kasowanie: '$kasuj
/bin/rm $kasuj
let licznik_kasowania=+1
fi
done
if [ $licznik_kasowania -gt 0 ]; then
echo -e 'Status: Skasowano\n'
else
echo -e 'Status: Nie ma plików do skasowania\n'
fi
}
Listing 1a.
Źródło pliku kopia_zapasowa.sh
48
październik 2007
praktyka
Serwer kopii zapasowych
49
www.lpmagazine.org
praktyka
Serwer kopii zapasowych
export-ustawien() {
# Tworzy plik czysciciel.cfg na serwerze
dzis=$(date +%Y-%m-%d)
# Data dzisiejsza np. 2007.09.09
ostatnio=$(cat /var/log/kopia_ostatnio)
if [[ $ostatnio != $dzis ]] || [[ $1 == 'nazadanie'
]] ; then
pliktemp=$(mktemp /tmp/backup.XXXXXXXX)
echo -e "
# Plik konfiguracyjny czyściciela - nie edytować
ręcznie\n# Plik generowany przez skrypt kopia_
zapasowa.sh\n# Data generacji $(date)\ndo_
archiwizacji='$do_archiwizacji'
# Co było archiwizowane\nkatalog_zdalny=$katalog_zdalny
# Katalog w którym będą składowane kopie zapasowe
# na serwerze backupu\nile_kopii=$ile_kopii
# Z ilu dni zostawić kopię\nmax_rozmiar=$max_rozmiar
# Maksymalny rozmiar kopii zapasowej (musi być
# o około 20% mniejszy niż przydzielona pojemność
# dysku\n">$pliktemp
chmod 700 $pliktemp
echo -n 'Kopiowanie pliku konfiguracyjnego
czyściciela...'
scp $pliktemp $uzytkownik@$serwer:$katalog_
zdalny/czysciciel.cfg # -q bez komunikatów o postepie
kopiowania /bin/rm $pliktemp; echo ' [ OK ]'
fi
}
kopia() {
dzis=$(date +%Y-%m-%d)
# Data dzisiejsza np. 2007.09.09
for zasob in $do_archiwizacji; do
ostatnio=$(ssh slawek@10.1.1.5 "if [ -d $katalog_
zdalny''$zasob'-'$dzis ]; then echo $dzis; fi")
if [[ $ostatnio != $dzis ]] || [[ $1 ==
'nazadanie' ]] ; then
echo -n "Tworzenie kopii zapasowej katalogu: $zasob "
rsync --rsh=ssh --force --ignore-errors -l
--delete --delete-excluded --exclude=
"$pliki_wykluczone" --backup --backup-dir=$katalog_
zdalny$zasob-$(date +%Y-%m-%d) -a $zasob
$uzytkownik'@'$serwer:$katalog_zdalny$zasob-aktualne -vz
echo '[ OK ]'
date +%Y-%m-%d>/var/log/kopia_ostatnio
else
echo "Kopia $zasob na dzień $(date +%Y-%m-%d)
została już wykonana"
fi
done
}
case $1 in
'init')
echo 'Kopia zapasowa wersja '$wersja_programu
if ( spr_serwer ); then # OK
echo -e 'Status: Serwer osiągalny.
Można wykonać inicjację.\n'
inicjacja
else
echo -e 'Status: Serwer nie osiągalny.
Nie można wykonać inicjacji.\n'
fi
;;
'kopia')
echo 'Kopia zapasowa wersja '$wersja_programu
if [ ! -f /var/run/kopia-zapasowa ] ; then
echo $(date)>/var/run/kopia-zapasowa
chmod 700 /var/run/kopia-zapasowa
if ( spr_serwer ); then # OK
echo -e 'Status: Serwer osiągalny.
Można wykonać kopię zapasową.\n'
if [[ $(ssh-add -l|grep $(whoami)) ]]; then
czysc_tmpy
export-ustawien
kopia $2
else
echo 'Klucz autoryzacyjny niedostępny.
Wprowadź hasło.'
fi
else
echo -e 'Status: Serwer nie osiągalny.
Nie można wykonać inicjacji.\n'
fi
/bin/rm /var/run/kopia-zapasowa
else
echo 'Program jest już uruchomiony.'
fi
;;
'pomoc'|'--help'|'help'|*)
echo 'Składnia kopia_zapasowa.sh parametr1
[parametr2]'
echo 'Parametr 1:'
echo ' init - włącz logowanie bez hasła
na serwer kopii zapasowej'
echo ' kopia - wykonaj kopię zapasową'
echo ' pomoc - niniejsza pomoc'
echo 'Parametr 2:'
echo ' nazadanie - wymusza wykonanie kopii więcej
niż raz dziennie za każdym uruchomieniem skryptu'
;;
esac
skrypt będzie się znajdować, za pomocą
polecenia
chown slawek:slawek /mnt/
backup/laptop/czysciel.sh
oraz nadać
pełne uprawnienia użytkownikowi
chmod
700 /mnt/backup/laptop/czysciel.sh
.
Plik konfiguracyjny zostanie utworzony
przy pierwszym uruchomieniu skryptu kopia_
zapasowa.sh na laptopie.
Konfiguracja crona
Umożliwienie okresowego usuwania starych
kopii zapasowych będzie możliwe po doda-
niu następującego wpisu
5 * * * * root
nice -n 19 /mnt/backup/laptop/czysciel.
sh
, na końcu pliku /etc/crontab lub za po-
mocą programu crontab. Skrypt czysciciel.sh
będzie uruchamiał się co godzinę, 5 minut
po każdej pełnej godzinie. Jeżeli będziemy
Listing 1b.
Źródło pliku kopia_zapasowa.sh
50
październik 2007
praktyka
Serwer kopii zapasowych
51
www.lpmagazine.org
praktyka
Serwer kopii zapasowych
wykorzystywać zaawansowane oszczędza-
nie energii w dysku, to warto ten proces wy-
konywać zdecydowanie rzadziej, np. raz
dziennie. Na stronie http://pl.docs.pld-linux.
org/uslugi_cron.html można znaleźć bardzo
przystępnie napisany podręcznik demona
zadań okresowych cron, który ułatwi usta-
wienie pożądanej częstotliwości uruchamia-
nia zadań.
Konfiguracja klienta
Wymagane oprogramowanie
Na laptopie, poza pakietem openssh i openssh-
clients, będzie potrzebny również skrypt key-
chain oraz screen, dostępny w postaci pakietu
instalacyjnego; praktycznie w każdej dystry-
bucji. Posłuży nam do automatyzacji procesu
pobierania hasła zabezpieczającego do klucza
szyfrującego, który wykorzystujemy do logo-
wania na serwerze kopii zapasowej – za po-
mocą ssh.
Konfiguracja ssh
W pliku /etc/ssh/ssh_config należy spraw-
dzić, czy parametr
ForwardAgent
jest usta-
wiony na
yes
. Ustawienie będzie dostęp-
ne, zaraz po zapisaniu w pliku w edyto-
rze tekstu.
Konfiguracja menedżera
haseł
Skrypt, wykonujący kopię zapasową, musi
dysponować hasłem zabezpieczającym do
klucza uwierzytelniającego RSA, by móc
go odszyfrować. Bez postaci odszyfrowanej
wykonanie kopii zapasowej nie będzie moż-
liwe. Natomiast, aby zautomatyzować cały
proces należy utworzyć skrypt uruchomie-
niowy środowiska KDE o nazwie start_ssh-
add_jako_root.sh, w którym powinien znaleźć
się wpis:
#!/bin/bash
konsole -T 'Autoryzacja
dla programu kopia_zapasowa.sh'
-e /bin/bash
-c '/usr/bin/xhost
+127.0.0.1;
echo Podaj hasło
administratora;su - -c
"killall ssh-add.sh; screen
-a /usr/local/bin/ssh-add.sh"'
Plik należy umieścić w swoim katalogu do-
mowym w podkatalogu .kde/env. Skrypt bę-
dzie od teraz uruchamiał się przy każdym
logowaniu i prosił o podanie hasła adminis-
tratora oraz hasła zabezpieczającego do klu-
cza RSA.
Konfiguracja crona
Jeżeli chcemy umożliwić okresowe tworzenie
się kopii zapasowej należy dodać następujący
wpis:
0-59/10 * * * * root nice -n 19
/etc/cron.10min/kopia.zapasowa na końcu
pliku /etc/crontab
. Skrypt kopia_zapasowa.sh
będzie uruchamiać się co 10 minut, za pomocą
skryptu
/etc/cron.10min/kopia.zapasowa
,
zawierającego następujące wpisy:
#!/bin/bash
date >>/var/log/kopialog
su - -c '/home/slawek/Dokumenty/
Artykuły/kopia_zapasowa.sh kopia>>/
var/log/kopialog'
Raporty generowane przez skrypt będą od tej
pory zapisywane w pliku /var/log/kopialog.
Konfiguracja klienta
Konfiguracja skryptu kopia_zapasowa.sh znaj-
duje się w nim, a na początku są zadekla-
rowane zmienne powłoki, które pozwalają
na łatwe dostosowanie skryptu do włas-
nych potrzeb, bez wprowadzania zmian
w całym skrypcie. Przed pierwszym uru-
chomieniem należy zalogować się jako ro-
ot, a potem skopiować niniejszy skrypt do
katalogu /usr/local/bin, nadać mu prawa
wykonywania
chmod 755 /usr/local/
bin/kopia_zapasowa.sh
i zmienić właści-
ciela na root
chown root:root /usr/local/
bin/kopia_zapasowa.sh
, a następnie otwo-
rzyć, np. za pomocą polecenia
mcedit /usr/
local/bin/kopia_zapasowa.sh
, a na koniec
wprowadzić swoje ustawienia zgodnie ze
wskazówkami zawartymi w komentarzach.
Po ustawieniu wszystkiego należy zapisać
zmiany, naciskając F2, i przygotować klucze
RSA do automatycznego logowania za po-
mocą polecenia
/usr/local/bin/kopia_
zapasowa.sh init
. W momencie wykony-
wania polecenia serwer archiwizacji po-
winien być włączony, a sieć podłączo-
na, natomiast laptop musi mieć przy-
dzielony adres IP. Gdy padnie pytanie
o ścieżkę do klucza to należy nacis-
nąć [Enter]. Następnym krokiem jest wpro
wadzenie hasła zabezpieczającego, ale
podczas wpisywania hasła (Enter pass-
phrase) nie będzie widoczne. Hasło powin-
no być tak dobrane, aby stanowiło kom-
promis pomiędzy prostotą i bezpieczeń-
stwem, a będzie podawane przy każdym
uruchomieniu środowiska graficznego. Da-
lej nastąpi skopiowanie publicznej części
klucza szyfrującego RSA na serwer. Skrypt
zapyta nas dwukrotnie o hasło naszego
konto na serwerze archiwizacji i na tym
zakończy się proces. Jeśli wszystko poszło
prawidłowo, podczas próby logowania
z konta root na serwer za pomocą polecenia
ssh slawek@10.1.1.5
powinien pojawić
się monit o hasło do klucza szyfrującego,
a nie hasło na konto na serwerze, jak to
było do tej pory.
Konfiguracja skryptu
ssh-add.sh
Plik należy skopiować do katalogu /usr/
local/bin/ i nadać mu uprawnienia jak dla
kopia_zapasowa.sh. Skrypt będzie wywoływa-
ny przy każdym logowaniu. Za każdym ra-
zem będzie raz pytał o hasło administratora,
a następnie z prawami administratora uru-
chomi ssh-agenta i zapyta o hasło zabezpie-
czające do klucza prywatnego RSA. Potem
przejdzie w tło i będzie czuwać nad tym, by
Podstawowym kryterium oceny maksymal-
nej ilości kopii zapasowych, będzie zajmo-
wana przez nie objętość dyskowa. Na po-
czątku należy sprawdzić maksymalną obję-
tość naszych danych. Po kilku dniach wy-
konywania kopii zapasowych należy także
sprawdzić ile procent dziennie danych
ulega modyfikacji i wtedy obliczyć, czy wys-
tarczy nam miejsca na wymaganą ilość
kopii oraz czy potrzebny będzie nowy dysk.
Rozpatrzmy to na przykładzie.
Mamy laptop z dyskiem 80 GB, a nasz
system zajmuje 10 GB, natomiast dane 40
GB, czyli zostało jeszcze 30 GB wolnego,
więc należy przyjąć, że nasze dane będą
w niedalekiej przyszłości zajmować całą, do
tego przeznaczoną objętość, czyli w sumie
będą miały 70 GB. Domyślnie chcemy mieć
kopie zapasowe z ostatnich 14 dni. Po
pierwszych kilku dniach normalnej pracy
zaobserwowaliśmy, że objętość katalogów
różnicowych – z datami jest w stosunku 0,02
do katalogu *-aktualne, czyli 2 % danych
ulega zmianie. Teraz wystarczy wszystko
zsumować, aby dowiedzieć się, ile potrzeba
nam miejsca. Na dysku będzie potrzebne 70
GB na katalog aktualnie zawierający pełną
kopię, plus 14 dziennych kopii różnicowych
po 2 % z 70 GB oraz 20 % z 70 GB na
nieprzewidziany przyrost zmodyfikowanych
danych. W sumie wychodzi, że będzie nam
potrzeba około 120 GB miejsca na serwerze
na wszystkie kopie zapasowe.
Jak dobrać maksymalną ilość
kopii zapasowych?
50
październik 2007
praktyka
Serwer kopii zapasowych
51
www.lpmagazine.org
praktyka
Serwer kopii zapasowych
w przypadku usunięcia klucza, spytać o hasło
i ponownie wprowadzić odszyfrowaną pos-
tać klucza do pamięci. Usunięcie hasła bę-
dzie zdarzać się często, gdy będziemy na
długo pozostawiali komputer w stanie
wstrzymania lub uśpienia. Zabezpieczy nas
w przypadku kradzieży, gdy zaszyfrowany
klucz stanie się bezużyteczny. Nasze dane
składowane na serwerze będą również bez-
pieczne, gdyż złodziej nie zdoła zalogować
się i ich pobrać lub usunąć, bo nie będzie
znał hasła do klucza.
Omówienie skryptów
Kopia_zapasowa.sh
W Listingu 1 zaprezentowano źródło pliku
kopia_zapasowa.sh wraz z przykładowymi
ustawieniami zgodnymi z Rysunkiem 1.
Skrypt korzysta z funkcji, pozwalając wy-
korzystać wielokrotnie te same fragmenty
kodu i równocześnie maksymalnie zredu-
kować długość skryptu. Funkcja
inicja-
cja()
służy do wygenerowania klucza
szyfrującego RSA do obsługi połączeń ssh
oraz umieszczenia jego publicznej części
na serwerze kopii zapasowej, w celu ogra-
niczenia ilości monitów o hasło, podczas
wykonywania kopii zapasowej, do jed-
nego, przy starcie, środowiska graficzne-
go KDE. Funkcja
spr_serwer()
sprawdza,
czy nasz laptop ma dostęp do serwera ko-
pii zapasowych, a
czysc_tmpy()
usuwa
pliki tymczasowe, zdefiniowane w zmien-
nej
$do_skasowania
przed przystąpieniem
do wykonania kopii zapasowej. Natomiast
export-ustawien()
kopiuje część ustawień
z pliku
kopia_zapasowa.sh
na serwer do pli-
ku czysciciel.cfg, wymaganego przez skrypt
czysciciel.sh.
kopia()
i jest to najważniejsza
część skryptu odpowiedzialna za wykona-
nie kopii zapasowej. Skrypt obsługuje dwa
parametry wejściowe. Za pomocą pierw-
szego możemy wywołać funkcję
inicja-
cja()
, podając init jako wartość parametru
oraz wykonać kopię dla kopia lub skorzy-
stać z krótkiej pomocy dla pomoc. Jeżeli ko-
pia została wykonana już danego dnia, to
skrypt odmówi ponownego jej wykonania,
chyba że podamy drugi parametr
nazada-
nie
, pochodzący od zwrotu na żądanie.
Za sprawą przekierowania do pliku /var/
log/kopialog w skrypcie /etc/cron.10min/kopia.
zapasowa wszystkie komunikaty, generowane
przez skrypt kopia_zapasowa.sh są zapisywa-
ne w pliku /var/log/kopialog. Pozwala to zdiag-
nozować ewentualne źródła problemów, na-
tomiast ilość logów, generowana przez skrypt
jest dość duża i szybko może zająć znaczną
z klientów serwerów czasu – pakiet ntp i ntp-
client. Klienty zsynchronizują swoje zegary
z super dokładnymi serwerami czasu i od tej
chwili będzie można regulować zegarki.
Autor jest absolwentem AGH, a swoją przy-
godę z Linuxem rozpoczął w 1997 r. Przez
3 lata administrował serwerem, natomiast
na co dzień używa dystrybucji Mandriva.
Kontakt z autorem: diodak@gmail.com
O autorze
Listing 2.
Źródło skryptu czysciciel.sh
#!/bin/bash
# Czysciciel.sh - program do usuwania starych kopii zapasowych
# Autor: Sławomir Skrzyniarz <diodak@gmail.com>
# Licencja: GPL v2
#
# Ustawienia programu
wersja_programu='0.2' # Wersja programu
. czysciciel.cfg # Wczytanie ustawień z pliku
#
# Właściwy program
echo 'Czysciciel wersja '$wersja_programu
pojemnosc=$(du -bs $katalog_zdalny|awk -F " " '{print $1}')
if [[ $pojemnosc -ge $max_rozmiar ]] ; then
echo "Przystępuję do usuwania starych archiwów..."
for zasob in $do_archiwizacji; do
stare=$(find $katalog_zdalny''$zasob-[!a]* -maxdepth 0 -mtime +$ile_
kopii -type d)
for stary in $stare; do
echo -n "Status: Usuwam $stary"
/bin/rm -r $stary
echo ' [ OK ]'
done
done
else
echo 'Status: Zostało jeszcze miejsce na nowe kopie zapasowe'
fi
Listing 3.
Źródło pliku ssh-add.sh
#!/bin/bash
# Program do sprawdzania, czy jest wczytany klucz ssh
# Autor: Sławomir Skrzyniarz <diodak@gmail.com>
# Licencja: GPL v2
/usr/bin/screen -d
/usr/bin/keychain
while (true); do
if [[ ! $(ssh-add -l|grep $(whoami)) ]]; then
cat /dev/null|ssh-add # Pyta o hasło za pomocą okienka w
środowisku graficznym
fi
sleep 10
done.
objętość dyskową, gdy nie zastosujemy takich
programów jak: logrotate. Jeżeli wszystko
działa prawidłowo, a kopie robią się w zapla-
nowanych terminach, to można zrezygnować
z logowania zdarzeń i przekierować wynik
zamiast do /var/log/kopialog to do /dev/null.
Skrypt do prawidłowej pracy wymaga
ustawienia aktualnego czasu na laptopie
i serwerze, gdzie datę i godzinę można wpro-
wadzić ręcznie, ale zegary komputerowe, z ra-
cji swojej niedokładności lub wyczerpania
podtrzymujących ich baterii, będą niedokła-
dnie odliczać czas, dlatego warto skorzystać