background image

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

background image

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-getyum. Ponadto na obu ma-
szynach  przyda  się  pakiet  openssh-clients
zawierający m.in. program sshssh-addssh-
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 

background image

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

background image

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

background image

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?

background image

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ć