Arhiviranje i raspakivanje datoteka

Dva različita posla koja se stalno mešaju:

  • Arhiviranje — spajanje više fajlova u jedan, uz čuvanje strukture direktorijuma, dozvola i vlasništva.
  • Kompresija — smanjivanje veličine jednog fajla.

Na Linuxu su to i doslovno odvojeni alati. tar spaja, ali ne smanjuje. gzip smanjuje, ali ne spaja. Otud i ono .tar.gz — prvo jedan, pa drugi.

Na Windowsu je zip radio oba posla odjednom, pa se ta podela u početku čini nepotrebnom. Ali ima razlog: kad su odvojeni, možeš birati kombinaciju i menjati kompresor bez menjanja arhive.

Šta izabrati

Backup Linux sistema tar.gz — jedini format koji čuva dozvole, vlasništvo i simboličke linkove.
Slanje nekome na Windowsu zip — otvara se dvoklikom, bez dodatnog softvera.
Distribucija softvera tar.xz — najmanja veličina, pakuje se jednom a preuzima mnogo puta.
Noćni backup tar.gz — brzo, a prostor je jeftiniji od vremena.
Jedan veliki fajl Sam gzip ili xz — arhiva ti ne treba.
Sinhronizacija dva mesta Nijedno od navedenog — koristi rsync.

Poslednji red je važan. Arhiva je snimak u trenutku; ako ti treba da dve lokacije budu iste, arhiviranje je pogrešan alat.

Format po nastavku

.tar Arhiva bez kompresije.
.tar.gz, .tgz Arhiva + gzip. Standard za Linux.
.tar.bz2 Arhiva + bzip2. Zastarelo, ali se sreće.
.tar.xz Arhiva + xz. Najbolja kompresija.
.gz, .xz, .bz2 Jedan zapakovan fajl, bez arhive.
.zip Arhiva i kompresija u jednom. Ne čuva Linux dozvole.

Nastavak je samo dogovor. Pravu vrstu kaže file:

$ file preuzeto.bin
preuzeto.bin: gzip compressed data, from Unix, original size 51200

Prvo pravilo: pogledaj pre raspakivanja

Nikada ne raspakuj nepoznatu arhivu direktno u tekući direktorijum. Neke arhive sadrže fajlove u korenu, pa ti raspakivanje prospe stotinu fajlova posvuda — i prepiše ono što se zatekne.

$ tar -tf paket.tar.gz | head
paket-1.2/
paket-1.2/README
paket-1.2/src/main.c

Ovo je uredna arhiva — sve je u jednom direktorijumu. A ovo nije:

$ tar -tf lose.tar.gz | head
README
Makefile
config.h

Za takvu napravi direktorijum unapred:

$ mkdir raspakovano && tar -xf lose.tar.gz -C raspakovano

Isto važi za zip: unzip -l arhiva.zip pre raspakivanja.

Osnovne komande

Za svakodnevni rad dovoljno je nekoliko oblika.

Pravljenje

$ tar -czf arhiva.tar.gz direktorijum/
$ tar -cJf arhiva.tar.xz direktorijum/
$ zip -r arhiva.zip direktorijum/

Pregled sadržaja

$ tar -tf arhiva.tar.gz
$ unzip -l arhiva.zip

Raspakivanje

$ tar -xf arhiva.tar.gz
$ tar -xf arhiva.tar.gz -C /gde/hocu/
$ unzip arhiva.zip -d /gde/hocu/

Kod raspakivanja tar-u ne treba zastavica za format — sam ga prepozna. Zato je tar -xf jedini oblik koji treba pamtiti.

Samo jedan fajl iz arhive

$ tar -xf backup.tar.gz etc/nginx/nginx.conf
$ unzip arhiva.zip "dokumenti/*"

Nema potrebe raspakivati ceo backup od 40 GB zbog jednog konfiguracionog fajla.

Detaljno o opcijama na stranicama tar, zip i unzip i gzip, bzip2 i xz.

Šta se čuva, a šta ne

Ovo je razlika koja odlučuje da li je backup upotrebljiv.

tar zip
Dozvole da delimično
Vlasnik i grupa da ne
Simbolički linkovi da ne (prati ih)
Prazan direktorijum da da
Vreme izmene da da

Zato backup sistema ide u tar. Ako /var/www spakuješ u zip i raspakuješ na drugom serveru, svi fajlovi pripadaju tebi umesto web serveru — i sajt ne radi.

Napomena o vraćanju vlasništva:

$ sudo tar -xpf backup.tar.gz -C /

Opcija -p vraća dozvole, a sudo je nužan jer običan korisnik ne sme postaviti tuđe vlasništvo. Bez oba, backup je vraćen samo naizgled.

Praktični zadaci

Backup sa isključenjima

$ tar -czf backup-$(date +%Y%m%d).tar.gz \
    --exclude='*.log' \
    --exclude='node_modules' \
    --exclude='.git' \
    /var/www/sajt

Datum u imenu je sitnica koja se isplati — bez njega imaš pet fajlova imenom backup.tar.gz i ne znaš koji je koji.

Backup baze bez privremenog fajla

$ mysqldump baza | gzip > baza-$(date +%Y%m%d).sql.gz

Nepakovana verzija nikada ne dodirne disk. Kod velikih dumpova to je razlika između uspeha i punog diska. O spajanju komandi ovako piše u lekciji Piping i redirekcija.

Prenos direktorijuma na drugi server

$ tar -cz /home/alen | ssh server 'tar -xz -C /backup/'

Bez privremene arhive sa obe strane. Za velike količine podataka i dalje je rsync bolji, jer ume da nastavi prekinut prenos.

Šta zapravo zauzima mesto

$ du -sh * | sort -rh | head -5
4,2G  video
1,8G  backup-stari.tar.gz
340M  dokumenti

Pre nego što pakuješ, proveri ima li smisla — vidi du.

Greške koje se skupo plaćaju

Backup koji nikada nije proveren

$ gzip -t backup.tar.gz
$ tar -tf backup.tar.gz > /dev/null && echo "arhiva je citljiva"

Prva komanda proverava kompresiju, druga strukturu arhive. Obe ćute kad je sve u redu.

Ali ni to nije dovoljno. Backup je proveren tek kad si ga jednom vratio — u /tmp, na test mašini, bilo gde. Neproveren backup je samo nada.

Apsolutne putanje u arhivi

$ tar -czf backup.tar.gz /etc/nginx
tar: Removing leading `/' from member names

Ovo nije greška nego zaštita: tar namerno skida početnu kosu crtu, da raspakivanje ne bi prepisalo sistemske fajlove. Zato se arhiva raspakuje relativno u odnosu na mesto gde si:

$ cd /
$ sudo tar -xpf backup.tar.gz

O razlici između apsolutnih i relativnih putanja piše u lekciji Apsolutne i relativne putanje.

Pakovanje već pakovanog

$ tar -czf arhiva.tar.gz slike/

Ako su unutra JPEG i MP4 fajlovi, kompresija ne donosi ništa — ti formati su interno već zapakovani. Za takav sadržaj je dovoljan običan tar -cf, bez gubljenja vremena.

Arhiva nije zaštita

Zapakovan fajl je i dalje čitljiv svakome ko do njega dođe. Ako backup sadrži nešto osetljivo, treba enkripcija:

$ tar -czf - /home/alen | gpg -c > backup.tar.gz.gpg

Zip-ova ugrađena zaštita lozinkom je slaba i ne treba se na nju oslanjati.

Backup na istom disku

Kopija u /backup na istoj mašini štiti od tvoje greške, ali ne od kvara diska. Pravilo koje se ponavlja s razlogom: tri kopije, dva različita medija, jedna van lokacije.

Automatizacija

#!/bin/bash
IZVOR="/var/www/sajt"
ODREDISTE="/backup"
DATUM=$(date +%Y%m%d)

tar -czf "$ODREDISTE/sajt-$DATUM.tar.gz" \
    --exclude='*.log' "$IZVOR" 2>> /var/log/backup.log

# obrisi arhive starije od 30 dana
find "$ODREDISTE" -name "sajt-*.tar.gz" -mtime +30 -delete

Poslednja komanda je deo koji ljudi zaborave — bez nje se disk popuni za nekoliko meseci.

Zakazivanje kroz cron, a apsolutne putanje u skripti su obavezne, jer cron ne nasleđuje tvoje okruženje — o čemu piše u lekciji Login skripte.

Kratka referenca

  • tar -czf ime.tar.gz dir/ — napravi arhivu
  • tar -tf ime.tar.gz — pogledaj sadržaj pre raspakivanja
  • tar -xf ime.tar.gz -C /gde/ — raspakuj na određeno mesto
  • sudo tar -xpf ime.tar.gz -C / — vraćanje sa dozvolama
  • tar -xf ime.tar.gz put/do/fajla — samo jedan fajl
  • zip -r ime.zip dir/ · unzip -l ime.zip
  • file arhiva — koji je zaista format
  • gzip -t, tar -tf — provera ispravnosti
  • --exclude='obrazac' — izostavi iz arhive

Vežba

$ mkdir -p ~/vezba/{dokumenti,slike}
$ echo "tekst" > ~/vezba/dokumenti/beleska.txt
$ chmod 600 ~/vezba/dokumenti/beleska.txt
$ ln -s dokumenti ~/vezba/precica
  1. Napravi tar.gz arhivu direktorijuma, pa pogledaj njen sadržaj bez raspakivanja.
  2. Raspakuj je u /tmp i proveri da li su dozvole 600 i simbolički link preživeli.
  3. Napravi zip arhivu istog direktorijuma, raspakuj je u drugi direktorijum i uporedi rezultat sa prethodnim zadatkom.
  4. Iz tar arhive izvuci samo jedan fajl, bez raspakivanja ostatka.
  5. Napravi arhivu koja izostavlja sve .txt fajlove, pa proveri sadržaj.

Treći zadatak najbolje pokazuje zašto se backup Linux sistema ne pravi u zip formatu.


Detaljno o pojedinačnim alatima: tar, zip i unzip, gzip, bzip2 i xz. Za sinhronizaciju umesto arhiviranja: rsync.

Cela lekcija je deo vodiča Linux osnove.

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

groupadd

Konverzija tipova podataka u Pythonu