Arhiveerimine

Allikas: Kuutõrvaja

Sissejuhatus

Enamasti mõeldakse "failide kokkupakkimise" all kahte suhteliselt sõltumatut tegevust:

  • arhiveerimine - kataloogipuu koos seal sisalduvate failidega liidetakse üheks suureks failiks, mida nimetatakse arhiiviks
  • andmete pakkimine - arhiivi mahtu vähendatakse, kasutades eelnevalt kokkulepitud pakkimisalgoritmi

Andmete pakkimine võimaldab sama andmemahu hoidmiseks kulutada vähem andmekandja ressurssi. Ühte faili on tunduvalt mugavam transportida ning säilitada, kui vastavat kataloogistruktuuri. Arhiiv sisaldab andmeid failide omanike, gruppide, loabittide ja teiste atribuutide kohta. Enamasti on arhiivis ka lisainfot, mis võimaldab lahtipakkimisel vigu avastada.

Pakkimisalgoritmid pakivad andmeid erineva efektiivsusega, kuid peavad eelkõige võimaldama andmete kadudeta pakkimist. Eelnevalt pakitud andmete (JPG, GIF, ZIP ... ) edasine pakkimine olulist efekti ei anna. Tekstifaile, programme ning pakkimata graafikat saab reeglina edukalt kokku pakkida.

Pakitud arhiivid on oluliselt tundlikumad võimalike vigade suhtes, kui vastavad failid pakkimata kujul: üks viga faili alguses võib rikkuda kogu arhiivi sisu.

tar ja gzip

Esitame näite selle kohta, kuidas UNIXi standardseid vahendeid kasutades faile kokku ja lahti pakkida.

Olgu meil alustuseks kolm faili:

bash~$ ls -l
-rw-r--r-- 1 priit  users        13 003 Aug 10 09:42 talvelaulud.tex
-rw------- 1 priit  scanner  1  700 800 Aug 10 09:42 talvepildid.tiff
-rw-r--r-- 1 priit  users        12 000 Aug 10 09:42 uitmotted.asc

Peale nende arhiveerimist programmiga tar, tekib uus fail priidu.tali.tar

kalake~$ tar cvf priidu.tali.tar talvelaulud.tex talvepildid.tiff uitmotted.asc
kalake~$ ls -l
-rw-r--r-- 1 priit users      13 003 Aug 10 09:42 talvelaulud
-rw------- 1 priit scanner 1 700 800 Aug 10 09:42 talvepildid.tiff
-rw-r--r-- 1 priit users      12 000 Aug 10 09:42 uitmotted.asc
-rw-r--r-- 1 priit users   1 734 044 Aug 10 09:43 priidu.tali.tar

Tekitatud arhiivi maht ületab failide mahtude summat, sest peale failide ühendamist lisati arhiivi info ka arhiveeritud failide atribuutide kohta.

Arhiivi saab kokku pakkida näiteks programmiga gzip.

kalake~$ gzip priidu.tali.tar
kalake~$ ls -l
-rw-r--r-- 1 priit users      13 003 Aug 10 09:42 talvelaulud
-rw------- 1 priit scanner 1 700 800 Aug 10 09:42 talvepildid.tiff
-rw-r--r-- 1 priit users      12 000 Aug 10 09:42 uitmotted.asc
-rw-r--r-- 1 priit users     134 098 Aug 10 09:43 priidu.tali.tar.gz

Tulemusena asendus arhiiv priidu.tali.tar vastava pakitud failiga priidu.tali.tar.gz, tublisti väiksem pakkimata arhiivist.

Lahtipakkimine toimub samade programmidega vastupidises järjekorras. Olgu kataloogis ainult arhiiv, sest nii pole ohtu olemasolevaid faile kogemata üle kirjutada.

kalake~$ ls -l
-rw-r--r-- 1 priit  users  134 098 Aug 10 09:43 priidu.tali.tar.gz
kalake~$ gzip -d priidu.tali.tar.gz
kalake~$ ls -l
-rw-r--r-- 1 priit  users  1 734 044 Aug 10 09:43 priidu.tali.tar
kalake~$ tar xvf priidu.tali.tar
kalake~$ ls -l
-rw-r--r-- 1 priit users      13 003 Aug 10 09:42 talelaulud
-rw------- 1 priit scanner 1 700 800 Aug 10 09:42 talvepildid.tiff
-rw-r--r-- 1 priit users      12 000 Aug 10 09:42 uitmotted.asc
-rw-r--r-- 1 priit users   1 734 044 Aug 10 09:43 priidu.tali.tar

Programmiga tar kasutatud võtmed:

c - create, loo arhiiv, st ühenda failid kokku 
v - verbose, kõnele, mis teed 
f - file, millise nimega arhiiv tekitatakse 
x - extract, haruta failid arhiivist lahti 

Pange tähele, et enne ja peale pakkimist on failidel samad omanikud, grupid ja õigused.

Lahtipakkimiseks võib ka kirjutada 'gunzip priidu.tali.tar.gz', kusjuures gunzip on tegelikult kõva link failile

gzip

Viimasel ajal on populaarne programm bzip2, mis paljudel juhtudel pakib natuke paremini kui gzip; kasutamine on sarnane.

Faile ei pea enne kokkupakkimist tingimata programmiga tar kokku ühendama. Võib lihtsalt anda näiteks kokkupakitavate failide kataloogis käsu

kalake~$ gzip *

ning tulemusena asendatakse kataloogis sisaldunud failid kokkupakitutega. Märkusi failide pakkimise kohta

Programm tar võimaldab arhiveerida kogu näidatud kataloogi alla jääva kataloogistruktuuri

bash~$ tar cvf talvepildid.tar ~/talv/fotod

Arhiveerimisel peaks vältima, et loodav arhiiv tekib samasse kataloogistruktuuri, mida arhiveeritakse, sest arhiveerimine võib muutuda teatud juhul rekursiivseks.

Programm tar võimaldab arhiivi lahti teha käesolevasse kataloogi

bash~$ ls 
arhiiv.tar
bash~$ mkdir arhiivi_sisu
bash~$ cd arhiivi_sisu
bash~$ tar xvf ../arhiiv.tar 

Lahtitehtav arhiiv ei tohiks asuda samas kataloogis, kus tar käivitatakse; mõnel juhul võidakse lahtipakkimise käigus arhiiv üle kirjutatada.

Enda ja teiste kasutajate huvides on soovitav lõpetada tariga loodava arhiivi nimi '.tar'-iga, kuigi tehniliselt pole see vajalik.

gzip tekitab pakkides faile, mille nime lõpus on '.gz'. gzipiga lahtipakitava faili nimi peab lõppema .'gz'ga.

bzip2 tekitab pakkides faile, mille nime lõpus on '.bz2'. bzip2ga lahtipakitava faili nimi peab lõppema .'bz2'ga.

Soovides saada kokkupakitud arhiivi, lisage tari võtmetele z

bash~$ tar zcvf ahriiv.tgz /home/priit/luuletused_ja_laulud/*

Kui soovite kokkupakitud arhiivi lahti teha, lisage tari võtmetele z

bash~$ tar zxvf ../arhiiv.tgz

Arhiivi terviklikkuse kontroll ja seal sisalduvate failinimede vaatamine

bash~$ tar zvtf arhiiv.gz

Arhiivide pakkimisel saab kasutada IO ümbersuunamist: pakime kataloogis '/rahategemiseopetus/paberraha' sisalduva kokku nii, et tekib arhiiv paber.raha.arhiiv.tgz. Kui failinime asemel kasutada '-', saadab tar andmed väljundisse

bash~$ tar vcf - /rahategemiseopetus/paberraha | gzip > paber.raha.arhiiv.tgz

gzip'i võti d tähendab lahtipakkimist (ingl. k. decompress); ja c, et lahtipakitud andmed suunatakse programmi väljundisse. Kui lahtiarhiveerimisel kasutada failinime '-', siis ootab tar andmeid sisendist

bash~$ gzip -dc ../paber.raha.arhiiv.tgz | tar xvf -

Arhiveerimisel tar'il ei ole põhimõtteliselt sisendit, sest tema ülesanne on ühendada näidatud kataloogistruktuuris sisalduvad failid kokku üheks.

Seevastu pakkija gzipiga saab suhelda nii tema sisendi kui väljundi abil. Näites moodustatakse fail, mille sisuks on anonüümse FTP serveri failide nimekiri.

bash~$ ls -lR /home/ftp/pub | gzip | dd of=ls-lR.ftp.zoo.tartu.ee.gz

Asendades tar'i võtme 'z' võtmega 'y', kasutab tar pakkijana programmi bzip2. Vanemad tar'id seda küll ei oska, kuid siis võib kasutada IO ümbersuunamist.

Failide tükeldamine

Tihti on failid ka pärast pakkimist liiga suured. Näiteks e-posti süsteem seab vahel kirja suurusele piiranguid, pehmekettale mahub ainult loetud arv baite ning ka ftp ja scp'ga on väga suuri faile ebamugav kopeerida. Lahenduseks tuleb fail tükeldada ning hiljem tagasi kokku ühendada. Selleks saab kasutada programme split ja cat.

Olgu meil olemas üks liiga suur fail arhiiv.tar.gz. Toimetame faili arhiiv.tar.gz eraldi kataloogi ja anname korralduse jagade see saja tundande baidisteks tükkideks.

kalake~$ split -b 100000 arhiiv.tar.gz

Tulemusena tekib kataloogi hulk faile nimedega: xaa, xab, .. , xaz, xba, .. Tükkide suurus on võrdne nõutud 100 000 baidiga; viimane tükk võib olla väiksem. Tükke saab kokku ühendada programmiga cat. Seejuures tuleb hoolitseda, et samas kataloogis poleks kõrvalisi x-tähega algavaid faile.

kalake~$ cat x* > arhiiv.tar.gz

Üldiselt hoolitseb koorik selle eest, et tükid õiges (tähestikulises) järjekorras kokku pannakse. Kui teil on oma kooriku suhtes kahtlusi, siis võib kindluse mõttes kasutada programmi sort

kalake~$ cat `ls x* | sort` > arhiiv.tar.gz

Erandid

Võimalik on kasutada erandite tegemiseks regulaaravaldisi kuid neid ei saa positsioneerida.

Olgu kasutada sellised failid

$ find sisend
sisend
sisend/katal2
sisend/katal2/sisend
sisend/katal2/sisend/katal
sisend/katal

Arhiivi moodustamisel saab kasutada erandeid nt selliselt

$ tar --exclude=sisend/katal -cf - sisend | tar -tf -
sisend/
sisend/katal2/
sisend/katal2/sisend/

Ja sarnaselt arvhiivi kasutamisel

$ tar --exclude=erandimuster -tf arhiivinimi.tar

Terviklikkuse tagamine

Failide arhiveerimise, tükeldamise ja näiteks ühest masinast teise kopeerimise juures on enamasti oluline andmete säilimine esialgsel kujul. Vead võivad esineda vaatamata sellele, et esialgsetel ja lõpptulemusena tekkinud failidel on ühesugused suurused. Vigade avastamiseks on olemas spetsiaalsed programmid cksum ja md5sum.

Programm cksum arvutab iga faili jaoks välja kontrollsumma. Neid tuleb enne ja pärast failiga manipuleerimist võrrelda. Peale kontrollsumma väljastab cksum veel faili suuruse blokkides ja faili nime. Paraku on arvutatav 32 bitine kontrollsumma suhteliselt väike ning seega on tõenäosus, et failid sama kontrollsumma juures teineteisest siiski erinevad, lubamatult suur. Kontrollsummade erinevus on siiski kindel tõend, et failid on erinevad.

kalake~$ cksum failinimi
32343566 545 failinimi

32-bitilisus ilmneb selles, et kuueteistkümnendsüsteemis esitatud kaheksakohalisele kontrollsummale vastab 32-bitine kahendarv.

Programm md5sum poolt arvutatav kontrollsumma on 128 bitine ning arvutatud algoritmi MD5 abil. Kahe erineva sisuga, kuid võrdse MD5 summaga faili juhusliku tekkimise tõenäosus on väga väike ning ka sellise olukorra tahtlik tekitamine on praktiliselt võimatu. Seetõttu levitatakse avalikes FTP arhiivides oleva tarkvara kohta sageli ka MD5 kontrollsummasid, mis võimaldavad kasutajal veenduda, et tema poolt võrgust hangitu on identne originaaliga.

bash~$ md5sum failinimi
5cd3337313385ddc8c89d9fbc0d8d1bf failinimi

Arhiivi sisu esitamine koos omanike/timestampide/suuruste jms metaandmetega

# tar -z -v -t --full-time -f 300g-sdc1-20140720.tgz
drwxrwxr-x root/root         0 2012-02-02 05:35:45 sdc1/
drwxr-xr-x 1518/1006         0 2012-02-02 07:43:59 sdc1/ttix/
-rw-r--r-- 1518/1006       512 2012-02-02 07:22:53 sdc1/ttix/x1-sda.mbr
-rw------- 1518/1006 2135927197 2012-02-02 05:42:56 sdc1/ttix/x1-sda2.000
-rw------- 1518/1006 2135932744 2012-02-02 05:48:08 sdc1/ttix/x1-sda2.001
-rw------- 1518/1006 2135932722 2012-02-02 05:52:00 sdc1/ttix/x1-sda2.002
...

© EENet 2000