Arhiveerimine
Sisukord
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