Btrfs
Btrfs ima neke veoma zgodne trikove u rukavu koji će biti opisani u ovom uputstvu. Na žalost, ovaj fajl sistem nije dovršen, ali kako se on bude razvijao i ovo uputstvo će biti dopunjivano. Da ne biste uništili neke bitne podatke, savetujem Vam da uzmete USB stick i koristite ga za isprobavanje btrfs-a. To je upravo ono što sam i ja uradio.
Ovo uputstvo će pretpostaviti da je Vaš USB stick prijavljen kao /dev/sdb. Ukoliko nije tako, zamenite svaku pomenu sdb sa Vašim uređajem.
Prvo, treba napraviti btrfs fajl sistem na uređaju:
# mkfs.btrfs /dev/sdb
Potom, uraditi mount:
# mount /dev/sdb /mnt/usb
Ovo je izlgedalo kao svaki drugi fajl sistem, zar ne? Pa da vidimo šta je to tako specijalno kod ovog fajl sistema.
Snapshot
Definitivno najzanimljivija vidljiva opcija je snapshot. Snapshot je "slika" fajl sistema u nekom trenutku vremena. Naime, svaki fajl sistem može da ima snapshot, koristeći komandu dd da prekopirate bitove nekog uređaja (obično je taj uređaj particija) na drugi uređaj ili fajl. U slučaju da se bitovi kopiraju u fajl, dobija se snapshot. Ovo ima 2 nedostatka. Prvi, što ne možete snapshot praviti na uređaju čije bitove kopirate i to što je dd veoma dugačka operacija, posebno u današnje vreme kada diskovi imaju i veličine oko 1TB. Btrfs snapshot je nešto drugo. On se čuva interno i ma kolika veličina diska/particije bila, operacija snimanja snapshot-a traje oko 1 sekunde, ako i toliko. Još bolje je što ako se fajl sistem ne menja, snapshot ne zauzima mesto. Ovo se postiže tako što snapshot čuva samo razlike između trenutnog stanja i stanja u trenutku uzimanja snapshot-a. Da bismo ilustrovali ovo, recimo da imate fajl od 1GB i uzmete snapshot. Ako na taj fajl dodate još 100MB, snapshot će zapamtiti samo razliku, tj. 100MB, pošto se prvih 1GB fajla nije menjalo. Zgodno, zar ne?
Sada kada znamo šta je snapshot, hajde da iskoristimo prednosti nove tehnologije. Prvo, napravimo jedan fajl na /mnt/usb a potom uzmimo snapshot /mnt/usb fajl sistema:
# echo "Ovo je testni fajl" >/mnt/usb/test.fajl # btrfsctl -s noviSnapshot /mnt/usb
U buduće, ako ne dođe do hardverskog kvara, krađe USB stick-a ili formatiranja istog, Vaš fajl će uvek biti dostupan. Kako? Tako što svaki snapshot možete mount-ovati. Evo kako:
# mkdir /mnt/noviSnapshot # mount -o subvol=noviSnapshot /dev/sdb /mnt/noviSnapshot
Veoma zgodno, zar ne? Samo pazite da ne obrišete fajlove sa snapshot-a, pošto je i to moguće. Dakle, Vaš test.fajl nije bezbedan od grešaka u rukovanju.
Do sad je moguće da ste se zapitali "A kako da znam koji sve snapshot-i su na kom uređaju". Postoji veoma jednostavna komanda koja će mount-ovati sve snapshot-e koji su prisutni na uređaju:
# mkdir /mnt/snapshots # mount -o subvol=. /dev/sdb /mnt/snapshots # ls -l /mnt/snapshots total 1 dr-xr-xr-x 1 root root 18 Dec 12 12:12 default drwx------ 1 root root 0 Dec 12 12:13 noviSnapshot
Svaki direktorijum koji je prikazan, osim "default" predstavlja snapshot, dok default predstavlja "običan" fajl sistem. To znači da /mnt/snapshots/default i /mnt/usb imaju isti sadržaj. Pogledajmo kako izgleda, recimo, /mnt/snapshots/noviSnapshot:
# ls -l /mnt/snapshots/noviSnapshot total 1.0K dr-xr-xr-x 1 root root 18 Dec 12 12:12 ./ dr-xr-xr-x 1 root root 0 Jan 1 1970 ../ -rw-r--r-- 1 root root 19 Dec 12 12:12 test.fajl
Subvolume
Verovatno ste primetili da je korišćena samo jedna particija, /dev/sdb. Tačnije, ceo disk ili USB stick u ovom slučaju. Dosta nezgodno, reći ćete, ako je uređaj koji želite da koristite hard disk i više particija. Nema problema. Rešenje je subvolume. Napravite snapshot, obrišite sve fajlove iz njega i dobili ste subvolume. Recimo, da želite da napravite /var subvolume. Uradite sledeće:
# mount /dev/sdb /mnt/usb # mount -o subvolume=. /dev/sdb /mnt/snapshots # btrfsctl -s var /mnt/usb # ls -l /mnt/usb total 2 dr-xr-xr-x 1 root root 18 Dec 12 12:12 default drwx------ 1 root root 0 Dec 12 12:13 noviSnapshot dr-xr-xr-x 1 root root 0 Dec 12 13:31 var # rm -Rf /mnt/snapshots/var/*
Ništa specijalno niste napravili, zar ne? Ono što je moguće uraditi sada je ograničiti veličinu var subvolume-a:
# btrfsctl -r 1g /mnt/snapshots/var
Ovime ste ograničili veličinu var subvolume-a na 1GB. To ne znači da ste zauzeli 1GB prostora samo za var, nego da ste osigurali da količina podataka u var subvolume-u neće prerasti 1GB. Pretpostavimo da želite da dodate još 1GB prostora za var. Evo kako se to radi:
# btrfsctl -r +1g /mnt/snapshots/var
Naravno, var možete i smanjiti za neku količinu, recimo 100MB, pri čemu se ne piše +1g, nego -100m.
Verovatno ste se zapitali koja je onda razlika između snapshot i subvolume. Skoro pa nikakva, jer svaki snapshot predstavlja subvolume, dok nije svaki subvolume snapshot. Zvuči komplikovano, znam, ali evo jednostavnijeg objašnjenja. Kada napravite snapshot, on interno čuva razlike između trenutnog stanja i stanja u trenutku pravljena snapshot-a. Ako obrišete sve fajlove, govorite btrfs-u da ne čuva pomenute razlike, čime snapshot postaje subvolume. Dakle, te razlike koje se čuvaju su jedina razlika između snapshot-a i subvolume-a.
Copy on write
Ova opcija znači da Vaši podaci nikada neće biti nekonzistentni usled nestanka struje, recimo. Naravno, uvek postoji hadverski kvar koji kvari sreću. Copy on write, skraćeno COW, zauzima dosta memorije u radu. Ukoliko COW nije potreban, možete ga onemogućiti pri mount-ovanju:
# mount -o nodatacow /dev/sdb /mnt/usb
Osiguranje konzistentnosti podataka se na ovaj način gubi, ali se ne troši memorija za COW. Ovo je zgodno za, recimo, /tmp i /var/tmp.
Fstab
Sve je sjajno dok ručno radite sve, ali šta ako poželite da se mount-i odrade automatski? Sredite /etc/fstab, logično. Recimo da želite da /var bude var snapshot koji smo upravo napravili. Ovo, naravno, još uvek nije pametno uraditi jer btrfs nije stabilan, ali pretpostavimo da ne brinemo za podatke pa da želimo baš ovo da uradimo. Ovako bi izgledao deo /etc/fstab fajla vezan za var subvolume:
/dev/sdb /var btrfs subvol=var 0 0
Dovoljno jednostavno. Zamislimo sad da na /var ne želimo COW. U tom slučaju, deo /etc/fstab fajla vezan za var subvolume bi izgledao ovako:
/dev/sdb /var btrfs subvol=var,nodatacow 0 0
Mane
Kako je btrfs nedovršen, ima poveći broj mana. Recimo, brisanje snapshot-a je nemoguće. Naime, možete obrisati sve fajlove iz snapshot-a, čime će snapshot izgubiti svoju funkciju i postati normalan subvolume, ali ne možete obrisati direktorijum koji predstavlja subvolume (još nije implementirano, u planu je). Kako je svaki snapshot i subvolume, ista priča važi i za subvolume, pa vremenom možete dobiti ogromnu količinu subvolume direktorijuma koji ničemu ne služe.
Artikelaktionen