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.
Obsah článku
Ú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.