17.6.2007 17:54
V počítačovém světě se souborový formát TAR používá k archivaci souborů. Částečně se dá říci, že jde o podobný formát, jako známé formáty ZIP, RAR, či moderní open-source formát 7-ZIP. Oproti těmto konkurentům však TAR nikterak neimplementuje kompresi. Ač to na první pohled vypadá jako nevýhoda, v některých aplikacích je to naopak výhoda. Celý archiv, ať je jakkoliv velký a obsahuje jakékoliv množství souborů je totiž možné vytvářet plynule jako stream s prakticky nulovým využitím paměti a bez zatížení procesoru.
Zanedbatelné zatížení procesoru a pamětí je právě to, co je vhodné při tvorbě skriptů v PHP. Tyto skripty totiž mají vždy definovány maximální časové i paměťové nároky, které nesmí překročit, jinak budou okamžitě násilně ukončeny.
Příkladem budiž situace, kdy máme na webovém serveru k dispozici mnoho souborů, které mají uživatelé volně ke stažení. Tyto soubory se často mění a přibývají nové, není tedy možné je vždy znovu ručně zabalovat do archívu ZIP, či podobného a ten až pak nahrávat na server.
Jedním z případů takovýchto souborů bývají například archívy fotek. Uživatel má možnost si každou fotku otevřít a prohlédnout. Ale pokud si chce fotky zároveň uložit na disk do svého archivu fotek, nastává většinou problém, protože tento úkon je velice zdlouhavý. Každou fotku je totiž nutno uložit zvlášť. A právě pro tento případ je vhodný skript, který vezme všechny fotografie a uživateli pošle archív TAR, kde budou všechny soubory pohodlně pohromadě.
Celý archív je postupně tvořen obsahem všech
souborů, které má obsahovat. Každému tomuto
souboru ještě předchází hlavička velikosti 512 B,
která obsahuje informace o jméně souboru, velikosti,
vlastníkovi, linuxových oprávněních a
dalších volitelných podrobnostech. Pak již následuje
samotný obsah souboru, který je doplněn na konci
nulovými bajty tak, aby velikost celého tohoto datového
bloky byla násobek 512 bajtů. Celý archív je
ukončen jedním blokem 512 bajtů, který neobsahuje nic
jiného, než nulové bajty.
|
Hlavička adresáře „data/" |
Hlavička souboru „data/soubor.txt" |
Data souboru „data/soubor.txt" |
Hlavička souboru... |
Data souboru... |
Hlavička adresáře... |
Hlavička EOF (konec archívu) |
Názvy souborů v hlavičce mohou obsahovat kromě vlastního názvu i adresář(e). Pokud bude například v hlavičce název „data/soubor.txt", znamená to, že tento soubor bude v archivu v adresáři data. V tomto případě již není nutné adresář „data" nikterak zvláště specifikovat, protože pokud je v něm nějaký souboru, musí tento adresář automaticky existovat. Další údaje o tomto adresáři (jako například datum vytvoření) jsou převzaty z prvního souboru, který je v tomto adresáři umístěn.
Osobně však doporučuji adresář explicitně nadefinovat. Dělá se to pomocí hlavičky, která je skoro stejná s tou, která předchází souboru. Rozdíl je však ten, že název adresáře musí vždy končit lomítkem (tedy například „data/" či „data/nove/"). Za touto hlavičkou oproti souboru samozřejmě nenásleduje žádný datový blok (následuje až další hlavička reprezentující další soubor či adresář).
Je velká vždy přesně 512 bajtů a má tento formát:
| Počáteční index | Velikost | typ | význam |
|---|---|---|---|
| 0 | 100 | řetězec | Jméno souboru (i s případnou cestou) |
| 100 | 8 | číslo |
Mód souboru (linuxová reprezentace oprávnění) formát: „000644 NULL", tj před samotným NULL je ještě mezera |
| 108 | 8 | číslo | ID vlastníka souboru (Owner User ID) |
| 116 | 8 | číslo | ID skupiny vlastníků (Group User ID) |
| 124 | 12 | číslo | Velikost souboru v bajtech |
| 136 | 12 | číslo | Čas modifikace souboru (počet sekund od roku 1970) |
| 148 | 8 | číslo | Kontrolní součet hlavičky (Checksum) |
| 156 | 1 | řetězec | Typ souboru |
| 157 | 100 | řetězec | Jméno linkovaného souboru |
| 257 | 6 | řetězec | USTAR indikátor (řetězec „ustarNULL") |
| 263 | 2 | řetězec | USTAR verze (řetězec „ NULL") |
| 265 | 32 | řetězec | Jméno vlastníka souboru |
| 297 | 32 | řetězec | Jméno skupiny vlastníků souboru |
| 329 | 8 | číslo | Device major number |
| 337 | 8 | číslo | Device minor number |
| 345 | 155 | řetězec | Filename prefix |
V praxi se spousta informací z této hlavičky zcela ignoruje (hlavně v OS Windows). Většinou se neuvádějí vlastníci ani skupiny vlastníků souboru. Některé hodnoty pak samozřejmě ve spojení se soubory nemají význam (např. Device number). Hodnoty, které nejsou uvedeny, bývají nahrazeny zcela nulovými bajty. Tučně jsou označeny ty nejdůležitější hodnoty, které je nutné vyplnit.
Čísla se z historických důvodů zapisují trošku odlišně. Převedou se totiž nejdříve do osmičkové soustavy, pak se výsledné číslo doplní zleva nulami na velikost o jeden bajt menší než je velikost, kam se má číslo uložit. Nakonec se toto číslo převede na řetězec a jako poslední znak se dá NULL (tedy ASCII hodnota 0). Například velikost souboru 1025 bajtů se uloží jako řetězec „00000002001NULL", tedy 11 znaků je číslo a dvanáctý je ukončovací NULL. Jedinou výjimkou je hodnota reprezentující mód souboru, tedy oprávnění. Zde je mezi vlastním číslem a hodnotou NULL ještě znak mezera.
Řetězce se většinou doplňují a určenou délku také znaky NULL.
Bajt s indexem 156 (indexováno od nuly) má speciální význam a udává, jestli jde o soubor, adresář, nebo o hlavička reprezentuje jeden z několika dalších možných typů dat.
| Hodnota | Význam |
| '0' | Normální soubor |
| ASCII 0 (NULL) | Normální soubor |
| '1' | Hard link |
| '2' | Symbolic link |
| '3' | Character special |
| '4' | Block special |
| '5' | Adresář |
| '6' | FIFO |
| '7' | Contiguous file |
| 'L' | Long Link |
Přiznám se, že některé typy ani nevím, co znamenají. V praxi se totiž většinou používá pouze typ soubor, adresář a Long Link (o tom až později).
Jak již bylo řečeno, tak adresář (podobně jako soubor nulové délky) má velikost v hlavičce 0 bajtů a nenásleduje za ním žádný datový blok.
Každá hlavička má, jak je vidět z tabulky, jistý kontrolní součet. Jak ho ale vypočítat?
Vezměme naplněnou hlavičku a místo pro kontrolní součet naplňme osmi mezerami (ASCII znak 32). V takto vytvořeném 512 bajtovém řetězci jednoduše sečteme hodnoty všech ASCII hodnot. Tento výsledek je již námi hledaným kontrolním číslem. Před jeho uložením ho samozřejmě musíme převést do osmičkové soustavy a uložit stejně, jak se ukládají jiná čísla (popsáno výše).
Z tabulky je jasně vidět, že pro název souboru včetně cesty je k dispozici pouze 100 znaků, což není úplně málo, ale cesta ve Windows může mít v cestě znaků až 255. Takto dlouhá cesta se nám do jedné hlavičky samozřejmě nevejde. V tomto případě existuje rozšíření zvané Long Link. Jde o dva bloky, které předchází samotné hlavičce s položkou, která je delší než oněch 100 znaků. První blok definuje typ @LongLink. Druhý je pak datový a obsahuje jediný řetězec - kompletní název celého následujícího souboru (samozřejmě doplněný hodnotami NULL na délku bloku 512 bajtů).
Kompletní soubor s dlouhým jménem pak v archivu vypadá takto:
|
Hlavička @LongLink |
Blok obsahující celý název |
Hlavička souboru |
Datový blok souboru |
Hlavička LongLink má klasickou strukturu, jako jiné hlavičky. Jsou tu však některé rozdíly:
Vlastní hlavička pak má v názvu souboru takovou část, která se tam vejde. Tedy jinak řečeno, z názvu v této hlavičce bude jen prvních 100 znaků.
Doufám, že jsem alespoň částečně objasnil archivní formát TAR. Pokud Vám nebude něco jasné (obdobně jako mě, když jsem vytvářel PHP skript, zajišťující zabalení souborů), doporučuji otevřít třeba TotalCommander či jiný nástroj umožňující vytvářet TAR archívy a nějaký malý archív si vytvořit. Následné otevření v HEX editoru či HEX prohlížeči mnohé objasní.
Vstoupit do diskuse (celkem 0 příspěvků)