Kategória: Linux všeobecne

Zmenené: 18. október 2011

Súborový archivátor tar

Určite ste sa už stretli s pojmom archivácia. V oblasti počítačov sa pod pojmom archivácia často (a nie celkom správne) rozumie zálohovanie. Hoci tieto dva pojmy spolu úzko súvisia, neoznačujú celkom to isté. Rôznia sa cieľmi, ktoré majú splniť. V tomto článku popíšem základne spôsoby archivácie a načrtnem ich využitie na zálohovanie.

Úlohou zálohovania je vytvárať záložné kópie (napríklad súborov), pre prípadné obnovenie pri zlyhaní systému. Úlohou archivácie je spojiť viaceré súbory do jedného, kvôli jednoduchšej manipulácii, či uchovávaniu. Samozrejme, pre jednoduchý zálohovací systém si môžete vystačiť aj s prostým (a hlavne pravidelným) vytváraním archívov.

Na vytváranie archívov slúžia takzvané archivačné programy. Základné archivačné programy umožňujú spojiť viacero súborov do jedného alebo viacerých archívnych súborv a samozrejme následne ich z archívu znova rozbaliť. Niektorá archivačné programy dokážu archivované súbory aj komprimovať, nie je to úlohou archivácie samotnej. Samozrejmosťou je, že pre túto komprimáciu využívajú bezstratovú kompresiu. Komprimované archívy zaberajú menej miesta v úložisku, či sú rýchlejšie prenášané po sieti.Medzi štandardné nástroje na vytváranie archívov možno zaradiť ar (archiver), tar (tape archiver) a cpio (copy in/out). Tieto programy sú v rôznych balíkoch, program ar je v balíku binutils a zvyšné dva programy sú v balíkoch s rovnakým názvom (tj. tar a cpio).

ar

Program ar umožňuje vytváranie, úpravy a rozbaľovanie súborov z archívov. Archív programu ar je súbor, ktorý umožňuje archivovať originálny obsah súboru, jeho prístupové práva, časové údaje, vlastníka a skupinu. Všetky tieto informácie môžu byť pri vyberaní z archívu znova obnovené. Formát archívu ar však nebol nikdy štandardnizovaný, čo môže spôsobovať problémy pri práci s archívmi na rôznych systémoch. Dodnes je používaný pre vytváranie inštalačných balíkov v Debiane a na ňom založených distribúciách.

cpio

Program cpio kopíruje súbory do alebo z archívov cpio a tar. Archívom môže byť iný súbor na disku, magnetická páska alebo rúra (pipe). Formát archívu tar je určený pre zaistenie kompatibility s programom tar. Predvolene vytvára cpio binárny formát archívu, kvôli kompatibilite so staršími verziami cpio. Pri vyberaní súborov z archívu dokáže cpio jeho formát automaticky rozpoznať, a to aj pre archívy vytvorené na strojoch s iným poradím bytov.

Na rozdiel od tar však cpio pracuje so štandardným vstupom (stdin) a výstupom (stdout), preto je treba vstup/výstup programu presmerovávať, napríklad z príkazov ls alebo find, napríklad:

find . -depth -print | cpio -o > meno_archivu
ls | cpio -o -c > meno_archivu
cpio -t < meno_archivu

cpio je plne dokumentovaný v texinfo (info cpio), takže v manuálovej stránke toho veľa nenájdete.

tar

Nástroj tar bol pôvodne vyvinutý na archiváciu na magnetické pásky (preto tape archiver), ale používa sa dodnes aj na systémoch, ktoré o páskach ani len nepočuli. Rovnako ako predchádzajúce programy vytvára jeden archív. Archívy majú zväčša príponu tar a zvykne sa im vravieť tarfile alebo aj tarball (balík tar).

Na rozdiel od cpio nepotrebuje presmerovávať vstup, ale stačí mu zadať ako vstup adresár, prípadne zoznam súborov, čo je na prácu výrazne pohodlnejšie. Program tar však aj naďalej dokáže pracovať so štandardným vstupom a výstupom, čo ho robí oveľa flexibilnejším. V Linuxe tar podporuje aj komprimáciu pomocou rôznych algoritmov, čím je možné vytvárať priamo komprimované archívy a poskytuje aj niektoré možnosti pre vytváranie záloh.

Základné použitie

Popísať použitie programu tar nie je veľmi zložité, ale pamätám si aké zložité bolo pre mňa predstaviť si čo všetko so súborovým systémom robí, najmä keď mi problémy robila angličtina v manuálovej stránke a medzery vo vedomostiach o detailoch súborových systémov. Aj preto budem celý postup robiť na konkrétnom príklade s ukážkami konkrétnych úloh.

Príprava

Aby som mohol ukázať príklady použitia základných vlastnosti programu, pripravil som si nasledujúcu štruktúru súborov, ktorá začína samostatným adresárom na pokusy (tarpokus), ktorý obsahuje dva podadresáre (pokus a zaloha). V adresári pokus sú (zatiaľ) dva súbory a tento adresár budem archivovať. Obnovu z archívu budem smerovať do adresára zaloha, aby bolo možné porovnať výsledok archivovania a následného obnovenia:

Rada

Keďže v celom návode budem prechádzať z jedného adresára do druhého, aby ste sa v tom nestratili, tam kde to bude potrebné vždy na začiatku vypíšem aktuálny adresár pomocou basename $(pwd).

../tarpokus
|-- pokus
| |-- subor1
| `-- subor2
`-- zaloha

Základná syntax

Základná syntax programu tar vyzerá takto:

tar [voľby] súbor ...

Vytvorenie archívu

Asi prvou úlohou, ktorú možno od programu tar očakávať, je vytvorenie archívu a na tomto príklade ukážem použitie prvých dvoch volieb. Vytvorenie archívu zaistí voľba -c nasledovaná zoznamom súborov, ktoré majú byť zahrnuté do archívu. Vstúpim teda do podadresára pokus a spustím vytvorenie (-c) archívu, do ktorého chceme zahrnúť všetky súbory v podadresári (*):

basename $(pwd)
tarpokus

cd pokus
tar -c *
subor10000644000175000017500000000003411141074306011566 0ustar slavkoslavkototo je obsah prveho suboru
subor20000764000175100000500000000003511141074317011023 0ustar marikasrctoto je obsah druheho suborutar

Hop, toto som asi nechcel! Ako ste si iste všimli, tar vypísal archív na štandadný výstup. S veľkou pravdepodobnosťou chcete svoj archív uložiť do samostatného súboru, pridám preto voľbu -f, ktorá udáva výstupný súbor. Namiesto voľby -f možno použiť aj štandardné presmerovanie výstupu do súboru (>):

tar -cf zaloha.tar *

Keďže som nezadal cestu k vytváranému súboru, tar vytvorí archív so zadaným menom v aktuálnom adresári:

ls -1
subor1
subor2
zaloha.tar

Pravdepodobne je vhodnejšie vytvorenie súboru s archívom v inom umiestnení, pretože pri ďalšom archivovaní by bol do archívu zahrnutý aj súbor zaloha.tar (to neplatí ak má novovytváraný archív rovnaké meno) a to asi nechceme. Vhodným miestom je napríklad nadradený adresár:

tar -cf ../zaloha.tar *

Samozrejme, nemusím do archívu vkladať všetky súbory v adresári, ale môžem vymenovať len tie, ktoré ma zaujímajú. Prípadne je možné použiť odkaz na aktuálny adresár:

tar -cf ../zaloha.tar .

Obnovenie z archívu

Skúsim teda vybrať súbory z môjho archívu zaloha.tar, ktorý som si vytvoril v predchádzajúcom kroku. Na vybratie súboru z archívu slúži voľba -x. Takže si presuniem vytvorený archív do adresára zaloha, vstúpim do adresára zaloha a skúsim archív rozbaliť:

basename $(pwd)
pokus

mv zaloha.tar ../zaloha/
cd ../zaloha/
tar -xf zaloha.tar

ls -1
subor1
subor2
zaloha.tar

Ako sami vidíte z výpisu obsahu adresára zaloha, všetky (dva) súbory boli z archívu rozbalené do aktuálneho adresára. Ak chcem byť informovaný o menách rozbaľovaných súborov (vrátane prípadnej cesty), môžem pridať voľbu -v:

tar -xvf zaloha.tar
subor1
subor2

Prípadne môžem použiť dve v (-vv), čím zaistím, že tar bude vypisovať ešte podrobnejšie informácie, vrátane vlastníctva, prístupových práv a veľkosti súborov:

tar -xvvf zaloha.tar
-rw-r--r-- slavko/slavko 28 2009-01-31 17:13 subor1
-rwxrw-r-- marika/src 29 2009-01-31 17:14 subor2

Ak chcem z archívu vybaliť len niektoré súbory, je možné ich zoznam pridať na koniec príkazu:

tar -xvvf zaloha.tar subor1
-rw-r--r-- slavko/slavko 28 2009-01-31 17:13 subor1

ls -l
-rw-r--r-- 1 slavko slavko 28 31. jan 17.13 subor1
-rw-r--r-- 1 slavko slavko 10K 31. jan 18.23 zaloha.tar

Práva a vlastníctvo

Práve pomocou zobrazenia podrobných informácií pri rozbaľovaní súborov z archívu si pozornejší možno všimli jednu drobnosť, ktorou sú vlastníctvo a práva súboru subor2. V adresári pokus som ho pripravil tak, aby mal iné práva a vlastníctvo ako sú východzie nastavenia (môjho účtu) súboru subor1. Začnem tým, že si pozriem podrobný výpis oboch mojich testovacích adresárov (súbor s archívom od teraz vynechávam):

cd ..
ls -lr *
zaloha:
-rwxr--r-- 1 slavko slavko 29 31. jan 17.14 subor2
-rw-r--r-- 1 slavko slavko 28 31. jan 17.13 subor1

pokus:
-rwxrw-r-- 1 marika src 29 31. jan 17.14 subor2
-rw-r--r-- 1 slavko slavko 28 31. jan 17.13 subor1

Myslím, že na prvý pohľad je vidno rozdiel v nastavení práv a vlastníctva pri súbore subor2. Ako teda sami vidíte, program tar vytvára z archívu „nové“ súbory, a teda všetky majú nastavené vlastníctvo podľa UID a GID práve prihláseného používateľa a prístupové práva podľa aktuálnej hodnoty umask. V mojom prípade mám umask nastavené na 0022, takže tar zachoval právo sputenia pre vlastníka, ale ostatné prispôsobil maske. Toto správanie je niekedy žiadúce, inokedy však nie. Žiadúce je napríklad pri rozbaľovaní archívu so zdrojovými kódmi, ktoré chceme ďalej spracovávať ako aktuálny používateľ. Naopak, nežiadúce je to, keď obnovujeme z archívu napríklad ako super používateľ (root) celý domovský adresár, pretože asi ťažko by sme chceli aby súbory všetkých používateľov vlasnil root alebo aby sa zmenili tieto parametre pri obnove systémových súborov.

Našťastie to v prípade tar nie je vôbec žiadny problém. keďže v archíve sú uložené informácie o právach a vlastníctve každého súboru, môžem programu nariadiť aby zachoval vlastníctvo aj prístupové práva rozbaľovaných súborov (–same-owner) alebo len jeho prístupové práva (-p). Tak to skúsim:

tar --same-owner -xf zaloha.tar
tar: subor2: Vlastníctvo nie je možné zmeniť na uid 1001, gid 40: Operácia nie je povolená
tar: Za behu programu nastala chyba

Ejhľa, chyba! Samozrejme, už nejaký čas neplatí, že používatelia môžu meniť vlastníctvo súborov. A ak chcú meniť skupinu súborov, musia byť sami členom novej skupiny súboru. Táto chyba nezabránila rozbaleniu súborov, len po ich rozbalení nedošlo k zmene vlastníctva. Superpoužívateľ samozrejme môže všetko:

sudo tar --same-owner -xf zaloha.tar

ls -l
-rw-r--r-- 1 slavko slavko 28 31. jan 17.13 subor1
-rwxrw-r-- 1 marika src 29 31. jan 17.14 subor2

Ak chcem len meniť prístupové práva súborov, nepotrebujem superpoužívateľský účet a môžem to urobiť priamo:

tar -pxf zaloha.tar

ls -l
-rw-r--r-- 1 slavko slavko 28 31. jan 17.13 subor1
-rwxrw-r-- 1 slavko slavko 29 31. jan 17.14 subor2

Adresáre a podadresáre

Zatiaľ som stále písal o jednotlivých súboroch, ale ako je to s celými adresármi? No, vlastne rovnako, veď v Linuxe (ako aj vo všetkých Unixoch) je všetko súbor, teda aj adresár. Aby sme to vyskúšali, vyčistime adresár zaloha, pridajme do adresára pokus jeden podadresár a do neho jeden súbor:

basename $(pwd)
zaloha

rm *
cd ../pokus/
mkdir adresar
echo súbor v podadresári > adresar/subor3

teraz môžeme vyskúšať ako si s podadresárom poradí tar a naše zadanie všetkých súborov pomocou *:

basename $(pwd)
pokus

tar -cvf zaloha.tar *
adresar/
adresar/subor3
subor1
subor2

Ako môžete vidieť vo výpise, tar spracoval adresár bez pripomienok a nie len to, automaticky spracoval aj súbor v tomto adresári. Inými slovami, ak zadáte medzi súbormi aj adresár, tar ho rozpozná a rekurzívne spracuje. Ak nechcete archivovať obsah podadresárov, možno použiť voľbu –no-recursion:

tar --no-recursion -cvf zaloha.tar *
adresar/
subor1
subor2
tar: zaloha.tar: súbor je archiv; nearchivovaný

Takým spôsobom je vytvorený archív, ktorý obsahuje len prázdne adresáre, čo je vhodné napríklad pre vytvorenie ich štruktúry. Treba však mať na pamäti, že vytvorí len adresáre prvej úrovne, pretože obsah adresárov nie je archivovaný.

S témou (pod)adresárov súvisí jeden problémik, ktorý sa môže stať veľkým problémom. Predstavte si, že niekto do archívu pridá súbory /etc/passwd a /etc/group. V predvolenom nastavení sa nič vážne nestane, pretože úvodná lomka je odstránená, čím sa z absolútnej cesty stane relatívna. Inými slovami, pri rozbalení súborov z archívu, sú tieto rozbalené do aktuálneho adresára:

tar -cvf zaloha.tar /etc/passwd /etc/group
tar: Removing leading `/' from member names
/etc/passwd
/etc/group

Toto správanie však možno pri vytváraní archívu zmeniť voľbou -P a potom sú v archíve uložené absolútne cesty. Rozbalením takéhoto archívu (ani ak máte dostatočné práva) neprepíšete systémové súbory s menami účtov a skupín, pretože tar ich zase predvolene prevádza na relatívne cesty. Ak z nejakého dôvodu chcete použiť absolútne cesty aj pri rozbalení, použite rovnakú voľbu teda -P.

Výpis obsahu archívu

Ak vás zaujíma čo to ten tar archív vlastne obsahuje, môžete použiť Midnight Commander, ktorý v Debiane zvládne výpis obsahu archívu (F3) alebo využiť samotný tar. Na tento účel slúži voľba -t, výpis obsahu archívu s absolútnymi cestami potom môže vyzerať takto:

tar -tf zaloha.tar
tar: Removing leading `/' from member names
/etc/passwd
/etc/group

V tomto prípade som použil predchádzajúci príklad s absolútnymi cestami. Ako vidno vo výpise, tar predvolene upozorňuje, že odstraňuje počiatočné lomky a ale pri výpise ich zachová. Ak použijete pri výpise voľbu -P, tar úvodné upozornenie nezobrazí.

Komprimácia

Ako poslednú oblasť, ktorú chcem v tomto článku popísať, som si zvolil komprimáciu. Komprimácia zmenšuje miesto potrebné na uloženie archívu. Program tar priamo podporuje komprimáciu pomocou programov gzip, bzip2, lzma a compress. Ak vám to je málo, je možné použiť aj externý komprimátor pomocou rúry (pipe), ale tomu sa venovať nebudem, keďže si vystačím s vyššie spomínanými, pomocou ktorých dokáže tar priamo vytvoriť archív komprimovaný zadaným algoritmom (programom). Samozrejme, v systéme musí byť nainštalovaný príslušný (de)komprimačný program.

gzip

Komprimácia a dekomprimácia pomocou gzip je zaistená prostredníctvom voľby -z, ktorú treba pridať pri vytváraní i rozbaľovaní z archívu:

tar -cvzf zaloha.tar.gz *

Rada

Je zvykom výsledný súbor pomenovať príponou tar.gz alebo skrátene tgz.

bzip2

Práca s bzip2 je rovnako jednoduchá. Na vytvorenie/rozbalenie archívu komprimovaného pomocou bzip2 slúži parameter -j:

tar -cvjf zaloha.tar.bz2 *

Rada

Archívy komprimované pomocou bzip2 je zvykom pomenovávať tar.bz2 alebo tbz.

Ostatné spôsoby

O nič zložitejšie to nie je ani s compress (voľba -Z) ani s LZMA (voľba –lzma). Veľkou výhodou je možnosť použiť voľbu -a. Pomocou tohoto parametra sa tar pokúsi automaticky rozpoznať typ komprimácie podľa prípony súboru. Pre mňa to je úplná záchrana, pretože ešte ako-tak si pamätám, že pre gzip mám použiť voľbu -z, ale -j pre bzip2 si zapamätať neviem a vždy sa musím pozrieť do poznámok. Vytvorenie komprimovaného archívu potom vyzerá takto:

tar -cavf zaloha.tar.gz *
tar -cavf zaloha.tar.bz2 *
tar -cavf zaloha.tgz *
tar -cavf zaloha.tbz *

Obsah ktoréhokoľvek z týchto komprimovaných archívov teraz možno vypísať pomocou voľba -t a -a:

tar -taf zaloha.tar.gz
tar -taf zaloha.tar.bz2
tar -taf zaloha.tgz
tar -taf zaloha.tbz

Záver

A to je teraz všetko. Ak ste dávali pozor, tak dokážete vytvoriť archív, pozrieť si jeho obsah, rozbaliť obsah archívu, či komprimovať ho. Ako bonus dokážete zaistiť obnovenie práv a vlastníctva súboru, či rozbaliť archív pomocou absolútnych ciest. Ak sa Vám to zdá málo, nemýlite sa. Program tar ponúka ešte mnoho ďalších možností, ale o tom až niekedy inokedy alebo v samoštúdiu.