HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Inkrementális mentés, saját szkripttel

2010.01.15. 07:32 bagoj ur

Ha biztonsági mentések készítéséről van szó, nem tudok leállni. ;-) Ezúttal egy olyan szkriptet ismertetek (Atomgape unszolására), amelyet nem a desktopon, hanem szervereken használtam/használok. Egyszerű, mint a faék, és hatékony. Hetente készít teljes mentést, a közbülső napokon pedig inkrementálisat.

Az inkrementális mentés fogalmát természetesen mindenki ismeri, de azért hátha valakit most klónoztak újjá, és még nem töltötték vissza az emlékezetét: Tehát ezek azok a mentések, amikor nem mentjük el az összes mentendő fájlt, csak a legutóbbi teljes mentés óta megváltozott fájlokat. Természetesen egy inkrementális mentés feltételezi, hogy legalább egy teljes mentés volt előtte.

 A szkriptnek csak egy részét írom le, nagyobbrészt helyhiány miatt, kisebb részt pedig azért mert a lényeg a szkript mindegyik részében ugyanaz. Tehát vegyük azt az egyszerű esetet, hogy egy változóban megadjuk a mentendő könyvtárakat szóközzel elválasztva, és ezt a tar (tape archive) nevű őskövület program segítségével inkrementálisan, vagy fullosan lementjük, gzip segítségével tömörítve, és készítünk egy ellenőrző összeget az archívum fájlokra az md5sum segítségével.

Az ördög ügyvédje ismét előtör, és az iránt érdeklődik, hogy vajon miért nem rsync-kel végezzük el az inkrementális mentést? Nos, azért nem, mert bár vannak jó példák fent a neten ennek megoldására oly módon, hogy az inkrementális mentéskor a nem mentett fájlokra hardlinkeket készítünk, így a nem teljes mentés is teljesnek látszik, de mégsem foglal helyet; azonban ez feltételezi azt, hogy a mentést ugyanarra a gépre készítjük, ami finoman szólva is nem az elérendő állapot. Én a tar minden hátrányát ismerem, de emellett erősen hiszek benne, ez egy jó és többmilliárdszor kipróbált módszer, ami nem téved. Így hát maradok opportunista. Ez nem jelenti azt, hogy nem fogom az rsync-es módszert letesztelni... :-P

Lássuk tehát a szkriptet, magyarázatokkal ellátva.

#!/bin/bash
MY_FULLBACKUPDAY="3"
MY_BASEDIR="/var/backups/bagojbackup/"
MY_DIRS="/var/ftp/bagoj /home/bagoj/work/"
TODAY=$(date +"%u")

if [ -d $MY_BASEDIR ]; then
   cd $MY_BASEDIR
else
   echo "FIGYELEM! A mentes konyvtar helyett az aktualis konyvtarat fogom hasznalni."
fi

Eddig semmi nehézség: az első öt kódsor változóneveket ad meg, majd utána letesztelem, hogy létezik-e az a könyvtár, ahol a mentéseket végre kell hajtani. Ha nem létezik, nem lépek ki (exit-tel), csak egy figyelmeztetést küldök, hogy nem a szokott helyre készül a mentés. A MY_FULLBACKUPDAY-ben a hét megfelelő napját adom meg, amikor mindenképpen teljes mentést kell készíteni. A MY_BASEDIR tehát az, ahová a mentés készül, a MY_DIRS-be azokat a könyvtárakat teszem szóközzel elválasztva, amiket menteni szeretnék. A TODAY-be beteszem, hogy a hét hányadik napja van most.

for i in $MY_DIRS; do
    if [ -d "$i" ]; then
     echo "$i mentese elindult"
     PREFIX=$(echo $i|sed 's:/:_:g')
     if [ "$TODAY" == "$MY_FULLBACKUPDAY" ]; then
        rm $PREFIX".difflog"
     fi
     tar -g $PREFIX".difflog" -czf $PREFIX"-"$(date +%Y%m%d)".tar.gz" $i &> /dev/null
     md5sum $PREFIX"-"$(date +%Y%m%d)".tar.gz" >> md5.`date +%Y%m%d`
     SIZE=$(stat -c%s $PREFIX"-"`date +%Y%m%d`".tar.gz")
     echo "$i mentese kesz ($SIZE byte)"
    else
        echo "FIGYELEM! A(z) $i konyvtar nem letezik, nem keszitettem mentest."
    fi
done
Az egész további rész egyetlen for ciklusba van belefoglalva, ahol is végigmegyünk az előzőleg megadott könyvtárakon.

  • Az if [ -d ] ... sorral ellenőrizzük, hogy létezik-e ez a könyvtár. Ha létezik, akkor a sed segítségével előállítjuk a könyvtár teljes elérési útjából az archívum nevét: a perjeleket egyszerűen aláhúzásjelre cseréljük. Tehát pl. a /var/ftp/bagoj-ból _var_ftp_bagoj lesz.
  • Ellenőrizzük, hogy ma van-e a teljes mentés napja. Ha nem, akkor töröljük a $PREFIX.difflog nevű fájlt. Ezt a fájlt a tar készíti el (majd) tömörítés közben, és ha ez létezik, akkor inkrementális mentés fog készülni az előző mentés(ek)hez képest.
  • Ezután jön maga a tömörítés. A -g paraméter miatt jön létre a difflog végződésű fájl, ami az inkrementális taroláshoz kell. A többi paraméter pedig az, hogy tömörítsünk egy mai névvel ellátott nevű fájlba, és azt a könyvtárat, amelyet meghatároztunk.
  • Ha kész vagyunk, az md5sum segítségével az elkészült archívum ellenőrző számát elkészítjük és belementjük egy szintén mai dátummal allátott fájlba.

Azt hiszem, nem felejtettem ki semmit. Ha van kérdés, tegyétek fel...

Szólj hozzá!

Címkék: linux backup script szkript parancssor biztonsági mentés gzip

A bejegyzés trackback címe:

http://bagojur.blog.hu/api/trackback/id/tr131656648

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben.

Nincsenek hozzászólások.