2008. október 26., vasárnap

A mentő ötlet: tar

A tar

A GNU zip egyszerre csak egy fájlt tud tömöríteni, de mit tegyünk hogyha több fájlt szeretnénk ``összecsomagolni''? A megoldás a tar. A tar összecsomagolja az általunk megadott fájlokat egyetlen fájlba, amiből később kicsomagolhatjuk őket, szintén a tar használatával.

A tar-nak egy - jel után kell megadni hogy mit csináljon, minden művelet és kapcsoló egy betű. A legfontosabbak:

*

c - új tar fájl létrehozása
*

x - már létező tar fájl kicsomagolasa
*

v - végrehajtás közben írja ki a fajlneveket
*

z - készítsen/csomagoljon ki .tar.gz fájlt
*

f - fájlnév következik

Az f általában mindig használandó, ha nem adjuk meg akkor a tar alapértelmezés szerint (történelmi okok miatt) a szalagos egységet (tape drive) használja.

Ezután meg kell adnunk a tar fájl nevet, s ha becsomagolunk, akkor a becsomagolandó fájlok nevet - a tar könyvtár(ak)at is elfogad.

Tegyük fel, hogy az aktuális könyvtárban levő html fájlokat szeretnénk becsomagolni, és szeretnénk a fájlneveket kiíratni végrehajtás közben. A tar fájl neve legyen html_fajlok.tar.

$ ls *.html
icewm-1.html icewm-2.html icewm-5.html icewm-8.html
icewm-10.html icewm-3.html icewm-6.html icewm-9.html
icewm-11.html icewm-4.html icewm-7.html icewm.html
$ tar -cvf html_fajlok.tar *.html
icewm-1.html
icewm-10.html
icewm-11.html
icewm-2.html
icewm-3.html
icewm-4.html
icewm-5.html
icewm-6.html
icewm-7.html
icewm-8.html
icewm-9.html
icewm.html
$ ls -l html_fajlok.tar
-rw-rw-r-- 1 tpapp tpapp 40960 Oct 24 12:03 html_fajlok.tar
$

És létre is jött a tarfájl. A tarfájl általában valamivel nagyobb, mint a becsomagolt fájlok méretének összege, mivel a tarfájl tartalmaz kiegészítő információkat is (fájl neve, tulajdonosa, jogok, stb.) Ez a fájl még nem tömörített, úgyhogy tömöríthetjük gzip-el.

$ gzip html_fajlok.tar
$ ls -l html_fajlok.tar.gz
-rw-rw-r-- 1 tpapp tpapp 6273 Oct 24 12:03 html_fajlok.tar.gz
$

Az először tar-al becsomagolt, majd gzip fájlok gyakoriak, kiterjesztésük általában .tar.gz, vagy esetleg .tgz. Ez a formátum szinte szabvány, csak indokolt esetben érdemes tőle eltérni. A tar z kapcsolójával akár egyből csinálhatunk ilyen fájlt (a rövidség kedvéért most nem íratjuk ki a fájlneveket):

$ tar -czf html_fajlok.tar.gz *.html
$ ls -l html_fajlok.tar.gz
-rw-rw-r-- 1 tpapp tpapp 6273 Oct 24 12:03 html_fajlok.tar.gz
$

A kicsomagolás az x kapcsolóval történik, a c helyett használandó. Kicsomagoláskor elég a tar fájl nevét megadni. A z itt is használható .tar.gz fájlok kezelésére.

$ tar -xvzf html_fajlok.tar.gz
icewm-1.html
icewm-10.html
icewm-11.html
icewm-2.html
icewm-3.html
icewm-4.html
icewm-5.html
icewm-6.html
icewm-7.html
icewm-8.html
icewm-9.html
icewm.html
$

------------------------------------------------------------------------------------------------------------------

Egy nagyon egyszerû backup szkript
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

tar cf nev.tar Dir: a Dir könyvtár tartalmát összecsomagolja a nev.tar file-ba
tar czf nev.tar.gz Dir: ugyanez, csak gzip tömörítéssel
tar czf nev.tar /dev/nst0: a /dev/nst0 szalagos meghajtóra archivál
tar xzf nev.tar.gz: a nev.tar.gz archívum tartalmát csomagolja ki az aktuális könyvtárba

Egy újabb egyszerű "mentőprogram":

#!/bin/bash

/bin/tar czf /dev/nst0 /mnt
/bin/mt rewoffl -f /dev/nst0

Ha e scriptet betesszük a root crontabjába megfelelő időzítéssel, akkor a megadott időpontokban az mnt könyvtár tartalmát elmenti a szalagos meghajtóra, majd a feladat végeztével visszacsévéli és kiadja a szalagos médiát.

A következő alkalmazás kicsit kifinomultabb: több könyvtárat is megadhatunk, valamint alkalmas a kiírt anyag ellenőrzésére:

#!/bin/bash

PATH=/bin:/usr/bin

backupdirs="/etc /home /var"

mt -f /dev/nst0 rewind

for path in $backupdirs
do
echo "A $path könyvtárak archiválása indul" | wall
tar czf /dev/nst0 $path 1>/dev/null
sleep 2
done

echo "Archiválás kész, állapot:: $?" | wall
echo "Az archívum ellenőrzése indul" | wall

mt -f /dev/nst0 rewind

for path in $backupdirs
do
echo "$path ellenőrzése" | wall
tar tf /dev/nst0 1>/dev/null && \
echo "$path: verified" | wall || \
echo "$path: hibák az ellenőrzés során" | wall
if [ $? -eq 0 ]
then echo "$path: ellenőrizve"
else echo "$path: hiba az ellenőrzés során" 1>&2
fi

mt -f /dev/nst0 fsf 1
done

mt -f /dev/nst0 rewind
echo "Távolítsa el a szalagot!" | wall

Nincsenek megjegyzések: