Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
Prijevodi ove stranice:

Analiza .xz formata

Sažetak

Sažimanje ili kompresija podataka u računarstvu proces je smanjivanja potrebnog fizičkog prostora za pohranu podataka kroz korištenje određenih metoda za zabilježavanje podataka. Za razliku od sažimanja podataka s gubicima, postupci sažimanja bez gubitaka izvornu poruku zbijaju u takav učinkovitiji prikaz koji je jednakovrijedan izvornom. Postoji puno formata sažimanja koji su razvijani pa se tako i najčešće koriste za različite namjene. XZ format, koji će biti detaljno obrađen u ovom seminarskom radu, format je kompresije podataka opće namjene bez gubitaka i s visokim omjerom kompresije te relativno brzom dekompresijom. Zbog ovih, ali i drugih osobitosti, uglavnom se koristi u distribucijama softverskih paketa (npr. Linux-a i drugih aplikacija).

Keywords: kompresija; xz; sažimanje; Linux; dekompresija

Uvod

Svakodnevno na računalo pohranjujemo razne tipove podataka od audio i video zapisa do raznih instalacijskih datoteka, dokumenata i slično. Te podatke potrebno je pohraniti, preuzeti, prenijeti i prikazati. S vremenom sve veći i veći podatci i datoteke koje zauzimaju sve više i više mjesta u memoriji dovode do dva bitna problema: prijenosa i pohrane podataka.Tu pod ruku dolazi arhiviranje podataka koje služi za kompresiju, tj. smanjenje veličine potrebne za pohranu podatka na računalo, ali i istovremenu pohranu više različitih datoteka zajedno. To omogućava ušteđenje značajne količine memorije i skraćivanje vremena potrebnog za prijenos podataka. Postoji veliki broj različitih programa za arhiviranje podataka, a neki od poznatijih su zip, rar i 7z. U ovom seminaru obradit će se xz format kompresije.

Općenito o .xz formatu

Format .xz je format kompresije samo jedne datoteke koji ne nudi mogućnost arhiviranja. Na temelju algoritma LZMA2, .xz format nudi kompresiju bez gubitaka, tj. čuva izvorne podatke u izvornoj kvaliteti, što ga čini idealnim za distribuciju softverskih aplikacija. Ova kompresija je sporija od nekih drugih metoda, ali dekompresija je relativno brza.

U usporedbi s drugim popularnim kompresijskim formatima, .xz format pruža nekoliko naprednih značajki, od kojih su neke:

  • Streamable -Datoteke je uvijek moguće stvoriti i dekomprimirati u cjevovodu.
  • Čitanje nasumičnim pristupom - Podaci se mogu podijeliti u nezavisno komprimirane blokove, a svaka .xz datoteka sadrži indeks blokova, što omogućuje čitanje nasumičnim pristupom dok je veličina bloka dovoljno mala.
  • Više filtra (algoritama kompresije) - Postoji mogućnost dodavanja podrške za nove filtre bez potrebe za stvaranjem novog formata datoteke svaki puta.
  • Ulančavanje filtra - Moguće je ulančati do maksimalno četiri filtra, što može poboljšati omjer kompresije kod nekih vrsta datoteka.
  • Provjera integriteta - Integritet svih zaglavlja uvijek je zaštićen s CRC32. Cjelovitost stvarnih podataka može se provjeriti s CRC32, CRC64 i SHA-256.
  • Spajanje - Moguće je objediniti .xz datoteke. Dekompresor može dekomprimirati povezanu datoteku kao da je obična .xz datoteka s jednim tokom.

Razvoj .xz-a odvijao se u okviru Tukaani Projekta, a razvila ga je mala skupina programera koja je nekoć održavala Linux distribuciju na temelju Slackwarea. Sav izvorni kod za .xz javno je obajavljen. Datoteke sa .xz ekstenzijom generira XZ Utils softver, alat za kompresiju i dekompresiju datoteka također razvijen od strane Tucaani developera, a namijenjen za pokretanje na Linux i Unix platformama.

Struktura .xz datoteke

Samostalne .xz datoteke sastoje se od jednog ili više tokova (eng. stream) koji mogu biti imaju ispunu (eng. padding) između ili nakon njih:

+=======+============+=======+============+
|  Tok  |   Ispuna   |  Tok  |   Ispuna   | ...
+=======+============+=======+============+

Veličine tokova i ispuna uvijek su višekratnici četiri bajta, stoga veličina svake valjane .xz datoteke mora biti višekratnik četiri bajta. Dok tipična datoteka sadrži samo jedan tok i nema ispuna, dekoder koji obrađuje samostalne .xz datoteke treba podržavati datoteke s višestrukim tokovima i/ili ispunama.

Struktura toka

+-+-+-+-+-+-+-+-+-+======+======+     +======+      +========+-+-+-+-+-+-+-+-+
|  Zaglavlje toka | Blok | Blok | ... | Blok | ---> | Indeks | Podnožje toka |
+-+-+-+-+-+-+-+-+-+======+======+     +======+      +========+-+-+-+-+-+-+-+-+

I zaglavlje toka i blokovi moraju biti veličine koja je višekratnik broja četiri. Ako se tok koristi kao dio nekog drugog formata datoteke, preporučljivo je prije početka toka dodati offset koji je višekratnik broja četiri. Tok uvijek ima zaglavlje, indeks i podnožje. Veličina indeks polja može biti maksimalno 16 GiB (2^34). U toku može biti nula ili više blokova, a maksimalni broj blokova ograničen je maksimalnom veličinom indeks polja, dok ukupna veličina toka mora biti manja od 8 EiB (2^63 byte-ova).

Struktura zaglavlja toka

Zaglavlje toka sastoji se od tzv. “čarobnih byte-ova zaglavlja” (eng. Header magic bytes), zastavica i CRC32 polja.

“Čarobni byte-ovi zaglavlja” čine prvih šest byte-ova zaglavlja toka. Pomoću njih se identificira tip datoteke.

Polje zastavica sastoji se od 2 byte-a: prvi byte zastavica je uvijek null byte, a drugi byte je polje bitova:

CRC32 je izračunat iz polja zastavica toka. Pohranjen je kao 32-bitni integer bez predznaka u little endian-u.

Polje zastavica je ograničeno na samo dva byte-a, čak i kad se dodaju nova svojstva. U tom slučaju stari dekoderi mogu verificirati CRC32 koji je izračunat iz polja zastavica i razlikovati zloćudne datoteke (CRC32 se ne podudara) te datoteke koje dekoder ne podržava (CRC32 se podudara, ali zastavice imaju postavljene “reserved” bitove).

Struktura bloka

Svaki blok sastoji se od polja zaglavlja bloka (eng. block header), polja komprimiranih podataka (eng. compressed data), polja ispune bloka (eng. block padding) te polja za provjeru (eng. check).

Samo zaglavlje bloka sastoji se od polja veličine zaglavlja bloka koja može biti u rasponu [0x01, 0xff], polja zastavica bloka, polja komprimirane (veličina komprimiranih podataka u bloku) i dekomprimirane veličine (veličina bloka nakon dekompresije) koji su dostupni samo ukoliko su prikladni bitovi zastavica postavljeni, polja liste zastavica filtera, polja ispune zaglavlja te CRC32 polja.

Zastavice bloka:

Polja komprimiranih podataka, točnije format tih podataka ovisi o zastavicama postavljenim u polju zastavica bloka i polju liste zastavica filtera.

Ispuna bloka mora sadržavati 0-3 null byte-a kako bi veličina bloka bila višekratnik broja četiri, a u koliko svi byte-ovi ispune nisu null byte-ovi, dekoder mora indicirati grešku.

Tip i veličina polja provjere ovisi isključivo o postavljenim zastavicama bloka, a ako se koristi, računa se iz dekomprimiranih podataka. Ako se izračunato polje provjere ne podudara s pohranjenim ili ako ga dekoder ne podržava, dekoder mora indicirati grešku.

Struktura indeksa

Indeks se koristi iz više razloga

  • kako bi se osiguralo da su svi blokovi u toku procesuirani
  • kako bi se saznala dekomprimirana veličina toka
  • radi brzog (nasumičnog) pristupa početku bilo kojeg bloka

On se sastoji od polja indikatora indeksa koji je uvijek 0x00, polja broja zapisa (eng. number of record), polja liste zapisa (eng. list of records), polja ispune indeksa (eng. index padding) koje se sastoji od 0-3 null byte-ova kako bi indeks bio višekratnik broja četiri, te CRC32 polja.

Polje broja zapisa označava koliko zapisa postoji u listi zapisa, tj. koliko je blokova u toku. Ukoliko se broj zapisa ne podudara sa stvarnim brojem blokova, dekoder mora indicirati grešku. Lista zapisa sastoji se od više zapisa od kojih svaki ima veličinu bez ispune(eng. unpadded size) i dekomprimiranu veličinu). Kada dekoder dekodira sve blokove, mora verificirati podudaraju li se dvije navedene veličine iz zapisa sa stvarnim veličinama bloka.

Struktura podnožja toka

Podnožje toka sastoji se od CRC32 polja, “backward size” polja, zastavica toka i “čarobnih byteova podnožja” (eng. footer magic bytes) .

CRC32 se računa iz “backward size” polja i polja zastavica toka te se pohranjuje kao 32-bitni integer bez predznaka u little endian-u.

“Backward size” polje također se pohranjuje kao 32-bitni nepredznačeni little-endian integer te indicira veličinu Index polja kao višekratnik broja četiri s tim da je minimalna vrijednost četiri byte-a.

real_backward_size = (stored_backward_size + 1) * 4;

Polje zastavica predstavlja kopiju polja zastavica zaglavlja. Informacije pohranjene u polju zastavica su potrebne kad se tok parsira unazad, te dekoder mora indicirati grešku ukoliko polja zastavica u zaglavlju i podnožju nisu identična.

Kao zadnji dio podnožja dolaze tzv. “čarobni byte-ovi podnožja” koji obavezno moraju postojati. Njihovo postojanje omogućuje brzu detekciju nepotpunih datoteka bez potrebe za dekompresijom.

Sigurnost

Kao što je u uvodu rečeno, pri kompresiji/dekompresiji može se koristiti jedan ili više filtra. Ako se koristi više od jedan filter, oni se povezuju ulančavanjem - izlaz iz jednog predstavlja ulaz u drugi filter. Kada bi redosljed filtra u lancu bio proizvoljan, bilo bi vrlo lako stvoriti zloćudne datoteke koje bi se vrlo teško dekodirale.

Sljedeća situacija predstavlja primjer tzv. spore datoteke.

v   Compressed input data
|   Filter 1 decoder (last filter)
|   Filter 0 decoder (non-last filter)
v   Uncompressed output data

Krene li se od dekodiranja dekoderom zadnjeg filtra u lancu, taj dekoder daje velik izlaz iz malog ulaza. Dekoder sljedećeg filtra u lancu prima taj veliki izlaz prethodnog kao svoj ulaz, te daje mali izlaz. Kao rezultat, kroz lanac prođe puno podataka, a na kraju sam lanac ne napravi neki veliki posao.

Kako bi se spriječile ovakve “spore” datoteke, postoje obvezna ograničenja za ulančavanje filtera. Maksimalan broj filtera u lancu je ograničen na četiri od kojih tri nisu zadnja (eng. non-last filters). Od ta tri filtera, samo dvoma je dozvoljeno mijenjati veličinu podataka, ali im je ograničeno koliko podataka dekoder može komprimirati - Dekoder bi trebao proizvesti barem n byte-ova na izlazu ako je filtru dano 2n byte-ova na ulazu.

Sva prethodno navedena ograničenja garantiraju da, ako zadnji filter u lancu proizvede 4n byte-ova na izlazu, lanac kao cjelina će proizvesti barem n byte-ova na izlazu.

XZ alat

XZ alat je alat za kompresiju podataka opće namjene sa sintaksom naredbenog retka sličnom gzip i bzip2, Izvorni format datoteke je .xz format, ali i njegov prethodnik, .lzma format koji koristi LZMA Utils. XZ komprimira ili dekomprimira svaku datoteku prema odabranom načinu rada. Ako nije zadana niti jedna datoteka ili je datoteka navedena kao crtica “-”, xz čita sa standardnog ulaza i zapisuje obrađene podatke na standardni izlaz, no ako je izlaz/ulaz terminal, onda će odbiti čitati/pisati podatke na standardni ulaz.

Nakon što je datoteka uspješno komprimirana/dekomprimirana, XZ kopira vlasnika, grupu, dozvole, vrijeme pristupa i vrijeme izmjene iz izvorne datoteke u ciljanu datoteku.

Primjeri korištenja alata

Kompresija

<font inherit/Courier New,Courier,monospace;;inherit;;inherit>xz [-k] [-c] imedatoteke.ekstenzija</font>

-k (-keep) zastavica označava čuvanje originala.

-c zastavica ispisuje komprimiranu kopiju datoteke na stdout, zatim je pohranjuje u imedatoteke.ekstenzija.xz, te nakon toga čuva original.

Ukoliko ne specificiramo zastavicu, stvara se komprimirana kopija datoteke u imedatoteke.ekstenzija.xz, a original se briše.

Primjer kompresije i stanja direktorija korištenjem zastavice -k.

Dekompresija

<font inherit/Courier New,Courier,monospace;;inherit;;inherit>unxz [-d] [-k] imedatoteke.ekstenzija.xz</font>

Zastavica -d označava brisanje komprimirane datoteke nakon dekompresije. Jednak takav učinak bio bi bez korištenja zastavica.

Zastavica -k označava čuvanje kompirimirane datoteke nakon dekompresije.

Izlistavanje informacija o kompresiji

<font inherit/Courier New,Courier,monospace;;inherit;;inherit>xz -l imedatoteke.ekstenzija.xz</font>

Zastavicom -l ili –list moguće je izlistati korisne informacije o komprimiranoj datoteci.

Test integriteta

<font inherit/Courier New,Courier,monospace;;inherit;;inherit>xz -t imedatoteke.ekstenzija.xz</font>

Ukoliko je test prošao i sve je u redu s datotekom, naredba ne vraća ništa:

Nakon malih izmjena u A.txt.xz datoteci korištenjem text editor-a, te ponovnog testa integriteta, rezultat je sljedeći:

Zaključak

U današnjem dobu tehonologije i neprestanog porasta količine i veličine podataka, alati i formati kompresije su prijekopotrebni. Format .xz, iako nije jedan od korištenijih, ima prednost u tome što korištenjem LZMA2 algoritma postiže kompresiju bez gubitka. Kada bi se radilo o običnoj slici ili audio slici ne bi bilo problem izgubiti na kvaliteti ili izgubiti mali dio podataka, no kod softvera, krucijalno je da kompresjia bude bez gubitaka ikakvih podataka, zato je .xz format idealan za korištenje u distribuciji softvera jer omogućuje očuvanje podataka u izvornom obliku.

Literatura

racfor_wiki/datoteke_i_datotecni_sustavi/analiza_xz_formata.txt · Zadnja izmjena: 2023/06/19 18:17 (vanjsko uređivanje)
Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0