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 arhivutar -tf ime.tar.gz— pogledaj sadržaj pre raspakivanjatar -xf ime.tar.gz -C /gde/— raspakuj na određeno mestosudo tar -xpf ime.tar.gz -C /— vraćanje sa dozvolamatar -xf ime.tar.gz put/do/fajla— samo jedan fajlzip -r ime.zip dir/·unzip -l ime.zipfile arhiva— koji je zaista formatgzip -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
- Napravi
tar.gzarhivu direktorijuma, pa pogledaj njen sadržaj bez raspakivanja. - Raspakuj je u
/tmpi proveri da li su dozvole600i simbolički link preživeli. - Napravi
ziparhivu istog direktorijuma, raspakuj je u drugi direktorijum i uporedi rezultat sa prethodnim zadatkom. - Iz tar arhive izvuci samo jedan fajl, bez raspakivanja ostatka.
- Napravi arhivu koja izostavlja sve
.txtfajlove, 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
Post a Comment